Blog

Monitor desconectado después de suspender

Monitor desconectado después de suspender

He estado probando el entorno de ventanas i3 (junto con XFCE). Después de suspender, xrandr reportaba mi monitor CRT (conectado con un adaptador HDMI-VGA) como desconectado. Al reiniciar volvía a funcionar. Curiosamente no he tenido este problema en Gnome, no sé por qué. Quizá GDM (GNOME Display Manager)  haga magia.

Todo esto lo he hecho con el kernel 5.3.11-300.fc31.x86_64

Primer intento

Añadir un modo con xrandr:

xrandr --newmode "1024x768_85.00"   94.50  1024 1096 1200 1376  768 771 775 809 -hsync +vsync
xrandr --addmode HDMI-2 "1024x768_85.00"
xrandr --output HDMI-2 --mode "1024x768_85.00"

Encendía el monitor pero clonando, no extendiendo el escritorio, así que no me vale. Además no es visible para X11 (no aparece en arandr ni en el gestor «Display» de XFCE).

Segundo intento

Pedírselo al kernel (drm) NOTA: HDMI-A-2 es lo que en xrandr me aparece como HDMI-2:

echo detect > /sys/class/drm/card0-HDMI-A-2/status
echo on-digital > /sys/class/drm/card0-HDMI-A-2/status

En dmesg el módulo amdgpu me devolvía error:

May 31 01:54:15 localhost kernel: [drm:emulated_link_detect [amdgpu]] *ERROR* Failed to read EDID
May 31 01:54:15 localhost kernel: [drm:dc_link_detect [amdgpu]] *ERROR* No EDID read.

Al desconectar y reconectar físicamente funcionaba la detección, y XFCE me preguntaba si extender/clonar el escritorio. Xrandr lo mostraba como conectado. Sin embargo, quería evitar tocar los cables físicamente, por el engorro de mover mi torre y por evitar el desgaste y consiguiente flojeo de los puertos.

Tercer intento

Encontré este enlace que explica cómo pasar un EDID a las opciones del kernel y además forzar el estado de conexión. Veamos.

Antes de nada, reinicié el PC y obtuve el EDID. Lo guardé en /lib/firmware/edid:

cat /sys/class/drm/card0-HDMI-A-2/edid > CPD-E220E.bin
mv CPD-E220E.bin /lib/firmware/edid

A continuación seguí las instrucciones del enlace:

Editar grub y añadir en GRUB_CMDLINE_LINUX:

video=HDMI-A-2:D drm_kms_helper.edid_firmware=HDMI-A-2:edid/CPD-E220E.bin

HDMI-A-2 con la opción:D fuerza a esa salida de vídeo a estar siempre conectada, incluso si se desconecta el cable.

Para que el kernel pueda acceder al fichero del EDID necesitamos incluirlo en initramfs. De lo contrario mostrará este error:

May 31 05:26:00 localhost kernel: platform HDMI-A-2: Direct firmware load for edid/CPD-E220E.bin failed with error -2
May 31 05:26:00 localhost kernel: [drm:edid_load [drm]] *ERROR* Requesting EDID firmware "edid/CPD-E220E.bin" failed (err=-2)

Creamos el fichero /etc/dracut.conf.d/99-local.conf con este contenido:

install_items+=" /usr/lib/firmware/edid/CPD-E220E.bin "

Y ahora recreamos la imagen de initramfs:

dracut -f

Comprobamos con lsinitrd que efecivamente haya sido incluído:

[root@localhost img]# lsinitrd | grep CPD-E220
-rw-r--r--   1 root     root          256 Jul 25  2019 usr/lib/firmware/edid/CPD-E220E.bin

Ahora reiniciamos y dmesg deberíamos mostrar que se fuerza la conexión (la opción :D que vimos anteriormente) y que se carga nuestro EDID:

May 31 09:39:28 localhost kernel: [drm] forcing HDMI-A-2 connector on
May 31 09:39:28 localhost kernel: [drm] Got external EDID base block and 1 extension from "edid/CPD-E220E.bin" for connector "HDMI-A-2"

Ahora puedo encender y apagar el monitor con xrandr o el menú «Display» de XFCE. NOTA: forzar la conexión con :D no implica que el monitor tenga que estar encendido, simplemente que aparezca como conectado.

Configuración de display en XFCE. El CRT (monitor 4, Sony) siempre aparece y puede ser encendido y apagado.

Para Arch

Guardamos el EDID en /usr/lib/firmware/edid/ (crear el directorio edid si es necesario).

Modificamos /etc/mkinitcpio.conf:

FILES=(/usr/lib/firmware/edid/CPD-E220E.bin)

Generamos initramfs con:

sudo mkinitcpio -P

Comprobamos que el EDID esté efectivamente incluído:

lsinitcpio /boot/initramfs-linux.img | grep CPD

Modificamos /etc/default/grub de la misma manera que en Fedora. Finalmente, actualizamos con:

# grub-mkconfig -o /boot/grub/grub.cfg