Hilarious (?)

Soporte para adaptadores DisplayLink en Fedora 22

Dell 4 in 1 AdapterHace unos meses compré una Dell XPS 13. Según había leído, es una de las mejores ultrabooks de 2015. Dell incluso tienen un modelo que sale con Ubuntu de fábrica, así que me imagine que Linux iba a estar bien soportado. Dado que ocasionalmente necesito conexión a redes cableadas, y más frecuentemente conexión VGA o HDMI, decidí al mismo tiempo comprar el adaptador 4 en 1 de Dell, que proporciona todo esto, sin perder el puerto USB.

Desafortunadamente, luego de comprarlo descubrí que este adaptador usa tecnología DisplayLink para sus puertos VGA/HDMI, y de hecho, el driver es proporcionado por esta empresa y no por Dell. Hasta hace unos días, no existía soporte para Linux, cualquiera sea la versión que estuvieran usando, pero el 3 de Agosto de 2015, DisplayLink publicó un driver para Ubuntu, aclarando que podría ser utilizado para crear una versión para otras distribuciones de Linux.

Dado que yo uso Fedora/CentOS/RHEL, y considerando que hace casi dos meses que no puedo usar los puertos VGA y HDMI de este adaptador que compre, decidí dedicar el tiempo a crear el modulo y rpm para Fedora. Uno de los requerimientos de este modulo es kernel versión 3.14 o mayor, por lo que no funciona en CentOS/RHEL.

El rpm en cuestión utiliza DKMS para recompilar automaticamente el módulo cuando el kernel es actualizado. Además incluí una regla de udev para que el servicio de systemd inície cuando el adaptador es enchufado, y se detenga cuando es desenchufado, algo que no viene en la versión oficial de DisplayLink para Ubuntu. Funciona bien en Fedora 22, probado con los kernels kernel-4.1.4-200.fc22.x86_64 y kernel-4.1.3-201.fc22.x86_64.

 

IMPORTANTE:

La versión actual del rpm es 1.0.335, con el driver actualizado de DisplayLink. El RPM fue creado en FC23, con el kernel4.2.7-300.fc23.x86_64. Usar el siguiente link de descarga, reemplazando en el proceso detallado a continuación http://nothen.com.ar/resources/displaylink-1.0.335-1.x86_64.rpm:

 

Para instalar el RPM:

  1. Importar la llave GPG con que está firmado el rpm:
    [root@xps13 ~]# rpm --import http://bit.ly/1J3EjlG
  2. Descargar el rpm:
    [root@xps13 ~]# wget -q http://nothen.com.ar/resources/displaylink-1.0.68-2.x86_64.rpm
  3. Antes de instalarlo, verifica que no hay ningún truco escondido en el RPM.Información básica:
    [root@xps13 ~]# rpm -qip displaylink-1.0.68-2.x86_64.rpm
    Name : displaylink
    Version : 1.0.68
    Release : 2
    Architecture: x86_64
    Install Date: (not installed)
    Group : User Interface/X Hardware Support
    Size : 7416983
    License : GPL v2.0, LGPL v2.1 and others
    Signature : RSA/SHA256, Wed 19 Aug 2015 05:42:29 PM ART, Key ID 3b2d50d677f09132
    Source RPM : displaylink-1.0.68-2.src.rpm
    Build Date : Wed 19 Aug 2015 05:42:04 PM ART
    Build Host : xps13.nothen.com.ar
    Relocations : (not relocatable)
    Packager : Eric Nothen
    URL : http://nothen.com.ar
    Summary : DisplayLink VGA/HDMI driver for Dell's 4-in-1 adapter (DA100)
    Description :
    This package installs the DisplayLink "Plug and Display" module for the USB 3.0 to HDMI/VGA/Ethernet/USB2.0 Dell Adapter (DA100). Based on DisplayLink's officially supported Ubuntu driver, and repackaged for Fedora/CentOS/RHEL distros. Module is added to DKMS so that it's recompiled on future kernel updates.
    

    Archivos que instala el rpm:

    [root@xps13 ~]# rpm -qlp displaylink-1.0.68-2.x86_64.rpm 
    /etc/systemd/system/displaylink.service
    /etc/udev/rules.d/99-displaylink.rules
    /usr/lib/displaylink
    /usr/lib/displaylink/DLInstrumentationDirectoryLock
    /usr/lib/displaylink/DisplayLinkManager
    /usr/lib/displaylink/LICENSE
    /usr/lib/displaylink/firefly-monitor-release.spkg
    /usr/lib/displaylink/libevdi.so
    /usr/lib/displaylink/libusb-1.0.so.0.1.0
    /usr/src/evdi-1.0.68
    /usr/src/evdi-1.0.68/Kconfig
    /usr/src/evdi-1.0.68/LICENSE
    /usr/src/evdi-1.0.68/Makefile
    /usr/src/evdi-1.0.68/dkms.conf
    /usr/src/evdi-1.0.68/evdi.mod.c
    /usr/src/evdi-1.0.68/evdi_connector.c
    /usr/src/evdi-1.0.68/evdi_debug.c
    /usr/src/evdi-1.0.68/evdi_debug.h
    /usr/src/evdi-1.0.68/evdi_drv.c
    /usr/src/evdi-1.0.68/evdi_drv.h
    /usr/src/evdi-1.0.68/evdi_encoder.c
    /usr/src/evdi-1.0.68/evdi_fb.c
    /usr/src/evdi-1.0.68/evdi_gem.c
    /usr/src/evdi-1.0.68/evdi_ioctl.h
    /usr/src/evdi-1.0.68/evdi_main.c
    /usr/src/evdi-1.0.68/evdi_modeset.c
    /usr/src/evdi-1.0.68/evdi_painter.c
    /usr/src/evdi-1.0.68/evdi_stats.c
    /var/log/displaylink

    Scripts que corre el rpm:

    [root@xps13 ~]# rpm -qp --scripts displaylink-1.0.68-2.x86_64.rpm 
    postinstall scriptlet (using /bin/sh):
    /usr/bin/systemctl daemon-reload
    /usr/bin/systemctl -q is-enabled dkms.service || /usr/bin/systemctl enable dkms.service
    for kernel in $(ls /lib/modules) ;do
     /sbin/dkms install evdi/1.0.68 -k $kernel >> /var/log/displaylink/displaylink.log 2>&1
    done
    preuninstall scriptlet (using /bin/sh):
    if [ $1 -eq 0 ] ;then
     /usr/bin/systemctl -q is-active displaylink.service && /usr/bin/systemctl stop displaylink.service
     /sbin/dkms remove evdi/1.0.68 --all >> /var/log/displaylink/displaylink.log
    fi
    postuninstall scriptlet (using /bin/sh):
    /usr/bin/systemctl daemon-reload
    
    

    Triggers?:

    [root@xps13 ~]# rpm -qp --triggers displaylink-1.0.68-2.x86_64.rpm 
    [root@xps13 ~]#
  4. Todo en orden? Bien, instala el rpm:
    [root@xps13 ~]# rpm -ivh displaylink-1.0.68-2.x86_64.rpm 
    Preparing... ################################# [100%]
    Updating / installing...
     1:displaylink-1.0.68-2 ################################# [100%]
    [root@xps13 ~]#
  5. Verifica que el modulo haya sido compilado correctamente:
    [root@xps13 ~]# ll /lib/modules/$(uname -r)/extra/evdi.ko
    -rw-r--r--. 1 root root 63072 Aug 14 01:36 /lib/modules/4.1.4-200.fc22.x86_64/extra/evdi.ko
  6. Eso es todo! Cuando enchufes el adaptador, verifica que el servicio displaylink haya sido iniciado automaticamente:

screen

 

Para los que prefieran una instalación manual, en vez del rpm, acá va un instructivo con los pasos necesarios. Recuerden instalar dkms y kernel-devel antes de empezar, si es que no los tienen instalados todavía.

  1. Descargar el tar con los archivos para compilar el módulo:
    [root@xps13 ~]# wget -q http://nothen.com.ar/resources/displaylink-1.0.68.txz
    
  2. Descomprimir el modulo:
    [root@xps13 ~]# tar -xJvf displaylink-1.0.68.txz -C /
    usr/src/evdi-1.0.68/
    usr/src/evdi-1.0.68/evdi_drv.c
    usr/src/evdi-1.0.68/evdi_drv.h
    usr/src/evdi-1.0.68/evdi_connector.c
    usr/src/evdi-1.0.68/dkms.conf
    usr/src/evdi-1.0.68/evdi_painter.c
    usr/src/evdi-1.0.68/evdi_debug.c
    usr/src/evdi-1.0.68/evdi_modeset.c
    usr/src/evdi-1.0.68/evdi_ioctl.h
    usr/src/evdi-1.0.68/Kconfig
    usr/src/evdi-1.0.68/evdi_stats.c
    usr/src/evdi-1.0.68/Makefile
    usr/src/evdi-1.0.68/evdi.mod.c
    usr/src/evdi-1.0.68/evdi_debug.h
    usr/src/evdi-1.0.68/evdi_gem.c
    usr/src/evdi-1.0.68/evdi_encoder.c
    usr/src/evdi-1.0.68/evdi_main.c
    usr/src/evdi-1.0.68/LICENSE
    usr/src/evdi-1.0.68/evdi_fb.c
    usr/lib/displaylink/
    usr/lib/displaylink/firefly-monitor-release.spkg
    usr/lib/displaylink/DLInstrumentationDirectoryLock
    usr/lib/displaylink/DisplayLinkManager
    usr/lib/displaylink/libusb-1.0.so.0.1.0
    usr/lib/displaylink/libevdi.so
    usr/lib/displaylink/LICENSE
    var/log/displaylink/
    var/log/displaylink/displaylink.log
    etc/systemd/system/displaylink.service
    etc/udev/rules.d/99-displaylink.rules
    [root@xps13 ~]#
  3. Compilar el modulo para el kernel que está booteado en este momento (opcionalmente podrían compilarlo para otros):
    [root@xps13 ~]# dkms install evdi/1.0.68
    
    Creating symlink /var/lib/dkms/evdi/1.0.68/source ->
     /usr/src/evdi-1.0.68
    
    DKMS: add completed.
    
    Kernel preparation unnecessary for this kernel. Skipping...
    
    Building module:
    cleaning build area...(bad exit status: 2)
    make KERNELRELEASE=4.1.4-200.fc22.x86_64 all INCLUDEDIR=/lib/modules/4.1.4-200.fc22.x86_64/build/include KVERSION=4.1.4-200.fc22.x86_64 DKMS_BUILD=1...
    cleaning build area...(bad exit status: 2)
    
    DKMS: build completed.
    
    evdi.ko:
    Running module version sanity check.
     - Original module
     - No original module exists within this kernel
     - Installation
     - Installing to /lib/modules/4.1.4-200.fc22.x86_64/extra/
    Adding any weak-modules
    
    depmod...
    
    DKMS: install completed.
    [root@xps13 ~]#

 

Al igual que en la instalación del RPM, recuerden verificar que el servicio displaylink es iniciado cuando enchufan el adaptador, y que el servicio dkms está habilitado y corriendo, para que siga recompilando el módulo  cada vez que se actualiza el kernel.

Leave a comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

One thought on “Soporte para adaptadores DisplayLink en Fedora 22”