Setting up Display Link USB monitor on Arch Linux
I recently bought a USB external monitor ( amazon link: AOC e1759Fwu). Installing necessary drivers for it was a little non-trivial so I am documenting my installation, just in case someone else encounters the same problem.
Kernel Headers
Install Linux kernel headers because kernel headers are needed to use DKMS (Dynamic Kernel Module Support).
DKMS allow managing and using kernel modules which are outside the kernel source code. We will add a DKMS kernel module for multiple monitors.
If you haven’t changed the kernel that installs with the base arch installation, just install:
pacman -S linux-headers
Skip to next section if the above works. In case you have changed the kernel, find your Linux version:
uname -r
And install the right linux headers from AUR. I recommend using pacaur. To install pacaur download and run a script (that I keep in my dotfiles) by:
pacman -S --noconfirm --needed curl
bash <(curl -sL https://raw.githubusercontent.com/ShikherVerma/dotfiles/master/dotbot-plugins/bootstrap-pacaur)
Search for linux-headers packages:
pacaur -Ss linux headers
Install the package that is meant for your linux version by:
pacaur -S <package name>
evdi kernel module
evdi package is a DKMS kernel module that enables management of multiple screens. evdi is a dependency of DisplayLink package. If you install DisplayLink it will automatically install evdi as a dependency but nothing would work! That’s because you need to install evdi-pre-release for the latest kernel (evdi aur comments). And since arch is a rolling release, you would most probably be on the latest kernel.
Install evdi-pre-release with pacaur -S evdi-pre-release. Right now the package seems to be broken as it gives an error, saying kernel needing to be configured. This is a bug, which has been fixed in upstream’s development branch but is not yet there in the aur package. So you need to modify the package to use the devel development branch and manually install the package.
First step in manually installing a aur package is to git clone the aur package’s repo (repo = acronym for git repository) . The repo is given on the evdi-pre-release aur page. Lets clone it:
git clone https://aur.archlinux.org/evdi-pre-release.git
Change the PKGBUILD with nvim evdi-pre-release/PKGBUILD to:
# Maintainer: PlusMinus
_libname=evdi
pkgname=$_libname-pre-release
pkgver=1.4.1
pkgrel=8
pkgdesc="A Linux® kernel module that enables management of multiple screens."
arch=('i686' 'x86_64')
url="https://github.com/DisplayLink/evdi"
license=('GPL')
groups=()
depends=(dkms)
makedepends=()
optdepends=()
provides=("$_libname=$pkgver")
conflicts=($_libname)
backup=()
options=()
install=$pkgname.install
changelog=$pkgname.Changelog
source=($_libname-devel.zip::https://github.com/DisplayLink/evdi/archive/devel.zip)
md5sums=('replace-with-md5sum')
noextract=()
build() {
# We only need to build the library in this step, dkms will build the module
cd "$_libname-devel/library"
make
}
package() {
# Predfine some target folders
SRCDIR="$pkgdir/usr/src/$_libname-$pkgver" # This one is needed for dkms
LIBNAME=lib$_libname
cd "$_libname-devel"
install -D -m 755 library/$LIBNAME.so $pkgdir/usr/lib/$LIBNAME.so
install -d $SRCDIR
install -D -m 755 module/* $SRCDIR
}
Download the devel.zip package, calculate its md5sum and put it in the PKGBUILD file above. To do all this you can run:
pacaur -S --noconfirm --needed wget
wget https://github.com/DisplayLink/evdi/archive/devel.zip
md5sum devel.zip
Find the text replace-with-md5sum in the PKGBUILD above and replace it with the md5sum calculate last command above. Now the evdi-pre-release/PKGBUILD file is ready. Lets build the package:
cd evdi-pre-release/
makepkg -sic
Check if it installed correctly. Run:
dkms status
it should include a line like this evdi, 1.4.1, 4.12.4-1-ARCH, x86_64: installed Here 1.4.1 is the evdi version, 4.12.4-1-ARCH is the kernel version. These numbers might be different for you. But if you find a link starting with evdi it means the module was installed successfully.
Display Link drivers
Next we need to install the displaylink package. Install it with pacaur -S displaylink. Unfortunately the displaylink package is also broken at the time of writing this. This is due to some web developer adding a terms and conditions page before letting us download the drivers. Luckily one of our fellow awesome arch user has fixed it and shared a repo. His fix would soon be in the aur. But right now lets clone the repo and build it manually:
git clone https://github.com/vs0uz4/displaylink_aur displaylink
cd displaylink
makepkg -sic
Once installed, we have to make sure we are using udl kernel module that manage displaylink driver, its a rewrite of the original udlfb, which the current driver use as a base. Activate udl kernel module, blacklist udlfb and start displaylink.service:
modprobe udl
nvim /etc/modprobe.d/noudlfb.conf
Write:
# Do not load the 'udlfb' module on boot. Using `udl`
blacklist udlfb
Configure modprobe to load udl on boot:
nvim /etc/modprobe.d/udl.conf
Write:
# Support multimonitor
udl
enable and start the displaylink.service:
systemctl enable diplaylink.service
systemctl start diplaylink.service
Wait for 30 seconds the second monitor should become active (will show AOC splash)
Check xrandr output, it should show an DVI connected like mine shows:
Screen 0: minimum 320 x 200, current 2966 x 900, maximum 8192 x 8192
eDP-1 connected primary 1366x768+0+0 (normal left inverted right x axis y axis) 277mm x 156mm
1366x768 60.00*+ 40.00
1024x768 60.04 60.00
960x720 60.00
928x696 60.05
896x672 60.01
800x600 60.00 60.32 56.25
700x525 59.98
640x512 60.02
640x480 60.00 59.94
512x384 60.00
400x300 60.32 56.34
320x240 60.05
HDMI-1 disconnected (normal left inverted right x axis y axis)
DVI-I-2-1 connected 1600x900+1366+0 (normal left inverted right x axis y axis) 382mm x 215mm
1600x900 60.01*+
1440x900 59.90
1280x800 59.91
1280x720 60.00
1024x768 60.00
800x600 60.32 56.25
848x480 60.00
640x480 59.94
1024x768 (0x79) 65.000MHz -HSync -VSync
h: width 1024 start 1048 end 1184 total 1344 skew 0 clock 48.36KHz
v: height 768 start 771 end 777 total 806 clock 60.00Hz
800x600 (0x7e) 40.000MHz +HSync +VSync
h: width 800 start 840 end 968 total 1056 skew 0 clock 37.88KHz
v: height 600 start 601 end 605 total 628 clock 60.32Hz
800x600 (0x7f) 36.000MHz +HSync +VSync
h: width 800 start 824 end 896 total 1024 skew 0 clock 35.16KHz
v: height 600 start 601 end 603 total 625 clock 56.25Hz
640x480 (0x83) 25.175MHz -HSync -VSync
h: width 640 start 656 end 752 total 800 skew 0 clock 31.47KHz
v: height 480 start 490 end 492 total 525 clock 59.94Hz
Now you can configure the display your self using xrandr. But I recommend installing arandr. arandr is an awesome tool that lets you configure xrandr using a very simplistic gui.
Install arandr with pacaur -S arandr and start it with arandr. Go to output menu, enable the second display, place it where ever you want and apply.
Intel screen freeze problem ;(
I wish that was the end of story but if you are unlucky like me and using an Intel gpu you will experience screen freeze. For me the screen only updated when I applied the settings in arandr. To fix it you need to install xf86-video-intel package with pacaur -S xf86-video-intel and create a configuration file with nvim /usr/share/X11/xorg.conf.d/20-intel.conf and write:
Section "Device"
Identifier "Intel Graphics"
Driver "Intel"
Option "AccelMethod" "sna"
Option "TearFree" "true"
Option "TripleBuffer" "true"
Option "MigrationHeuristic" "greedy"
Option "Tiling" "true"
Option "Pageflip" "true"
Option "ExaNoComposite" "false"
Option "Tiling" "true"
Option "Pageflip" "true"
EndSection
Now if you run xrandr --listproviders. It would show 2 providers. Provider 0 would be Intel and provide 1 would be modesetting. Connect provider 1 to provider 0:
xrandr --setprovideroutputsource 1 0
Reboot now and the USB monitor should start working normally. Unfortunately screen rotation still doesn’t work. DisplayLink’s official site has a “Known issues with DisplayLink ubuntu support” page which says “Rotation is not supported due to missing functionality in the generic modesetting driver”. I did not try to get rotation working since this is good enough for me. Lack of rotation support is not a deal breaker ┐( ˘_˘ )┌. See the arch wiki page on DisplayLink for more details.
Check out my dotfiles for more awesome configurations :)