Publicado 2017-06-30.
Palabras clave: linux video edid
Hay veces que la resolución de video es baja y no puede cambiarse. Esto suele pasar por dos motivos:
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.
Para corroborar las precondiciones del problema verificaremos:
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.
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.
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
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).