Problemas con EDID

2017/06/30

Hay veces que la resolución de video es baja y no puede cambiarse. Esto suele pasar por dos motivos:

  1. El hardware no está correctamente reconocido o configurado.
  2. No se está obteniendo correctamente la información EDID.

Aquí se supondrá que el hardware está correctamente detectado y configurado y nos concentraremos en caso en que no se obtiene correctamente la información EDID.

Verificación de precondiciones

Para corroborar las precondiciones del problema verificaremos:

  1. Que el kernel está siendo detectado:

    $ lspci -s 00:02.0 -v | grep -i kernel
            Kernel driver in use: i915
            Kernel modules: i915
    

    En este caso el hardware está siendo detectado y se está utilizando el módulo del kernel i915. Si la salida del comando es vacía no se está detectando correctamente el hardware.

  2. Que la información EDID no es devuelta correctamente

    Para obtener la información EDID deben utilizarse los comandos provistos por el paquete read-edid:

    $ sudo apt-get install -qVy read-edid
    $ sudo get-edid 2>/dev/null | parse-edid
    

    Aquí se espera que se devuelva un valor inválido del checksum.

Corrección de información EDID

Para este caso el módulo del kernel drm_kms_helper incluye el parámetro edid_firmware, el cual espera la ruta del archivo con la información EDID a partir del directorio /lib/firmware.

Si el monitor fuera por ejemplo un AOC e1621Sw y se tuviera un archivo aoc-e1621Sw.bin con la información EDID hay que guardar dicho archivo en el directorio /lib/firmware/edid y modificar la configuración de grub para agregar el parámetro drm_kms_helper.edid_firmware=edid/aoc-e1621Sw.bin:

$ sudo sed -i.bak-$(date -uIs) 's#GRUB_CMDLINE_LINUX_DEFAULT="\(.*\)"#GRUB_CMDLINE_LINUX_DEFAULT="\1 drm_kms_helper.edid_firmware=edid/aoc-e1621Sw.bin"#' /etc/default/grub
$ sudo update-grub

En caso de no tener el archivo EDID correspondiente al monitor, se puede utilizar el hecho de que el módulo del kernel posee precargados los siguientes archivos (con indicar los siguientes strings se configura la resolución correspondiente):

Siguiendo con el ejemplo anterior, ya que el monitor AOC e1621Sw posee una resolución nativa de 1366 x 768 at 60 Hz que no se corresponde con ninguna de las precargadas en el módulo se utiliza la resolución menor más cercana:

$ sudo sed -i.bak-$(date -uIs) 's/GRUB_CMDLINE_LINUX_DEFAULT="\(.*\)"/GRUB_CMDLINE_LINUX_DEFAULT="\1 drm_kms_helper.edid_firmware=edid/1280x1024.bin"/' /etc/default/grub
$ sudo update-grub

Obtener EDID de un monitor

Para obtener la información EDID de un monitor se utiliza el programa get-edid (provisto en el paquete read-edid):

$ sudo get-edid > <marca>-<modelo>.bin

Se utiliza

$ cat <marca>-<modelo>.bin | parse-edid

para verificar que la información se obtuvo correctamente (verificando el valor del Checksum).