Configurar teclas no reconocidas en Linux
In English  

Ocasionalmente se me presentan teclados que contienen teclas que no son reconocidas por default en Linux. En la mayoría de los casos el arreglo consiste en seleccionar una distribución de teclado diferente, las distribuciones modernas de Linux cubren una amplia variedad de teclados, pero algunas veces no hay una distribución de teclado disponible que coincida con nuestro teclado y la funcionalidad de algunas teclas se pierde. En esta publicación escribo sobre como detectar y mapear teclas desconocidas. Estoy asumiendo que estás trabajando en un entorno gráfico y que le quieres dar alguna funcionalidad a la tecla ahí.

Temas
¿Qué sucede cuando presionamos una tecla?
Obteniendo el código de escaneo de teclas no reconocidas
Asignar un código de tecla al código de escaneo
Hacer un script que se ejecute al encender la computadora

¿Qué sucede cuando presionamos una tecla?

Cuando presionamos una tecla, un código de escaneo es enviado desde el teclado hacia el sistema, el kernel lee este código de escaneo y trata de encontrarlo en una tabla que mapea estos códigos de escaneo, el número asociado con el código de escaneo en esta tabla es llamado código de tecla. Para que una tecla funcione el código de escaneo debe tener asignado un código de tecla. Entonces, si el entorno donde estamos trabajando sabe que hacer con este código de tecla, la tecla tendrá una funcionalidad. La funcionalidad en una terminal y en un entorno gráfico pueden ser diferentes, usualmente las teclas multimedia no tienen ninguna función en una terminal pero trabajan en el entorno gráfico.

En la mayoría de los casos, podemos asignarle a este código de escaneo el código de tecla de la funcionalidad que queremos, ya que el sistema X ya tiene soporte para una gran variedad de teclas y la mayoría de los entornos de escritorio interpretan estas teclas y les dan esa misma funcionalidad dentro de ellos. O podemos darle un código te tecla no usado, y configurar en nuestro entorno de escritorio la funcionalidad de dicha tecla. Esta publicación es principalmente sobre asignarle un código de tecla a un código de escaneo no reconocido, y hacer este cambio permanente.

Obteniendo el código de escaneo de teclas no reconocidas

Cuando el kernel no puede encontrar el código de escaneo de une tecla presionada en el mapa de códigos de tecla, el kernel produce un mensaje de error diciéndonos que la tecla es desconocida, y nos indica el código de escaneo de la tecla en cuestión. Podemos ver este mensaje de error utilizando dmesg o revisando el archivo de registro del kernel, usualmente localizado en /var/log/messages o /var/log/dmesg.

Puedes presionar las teclas desconocidas y usar dmesg para encontrar los códigos de escaneo, verías algo similar a esto pero con tus propios códigos de escaneo:

atkbd.c: Unknown key pressed (translated set 2, code 0xa6 on isa0060/serio0).atkbd.c: Use 'setkeycodes e026 <keycode>' to make it known.atkbd.c: Unknown key released (translated set 2, code 0xa6 on isa0060/serio0).atkbd.c: Use 'setkeycodes e026 <keycode>' to make it known.atkbd.c: Unknown key pressed (translated set 2, code 0xa3 on isa0060/serio0).atkbd.c: Use 'setkeycodes e023 <keycode>' to make it known.atkbd.c: Unknown key released (translated set 2, code 0xa3 on isa0060/serio0).atkbd.c: Use 'setkeycodes e023 <keycode>' to make it known.atkbd.c: Unknown key pressed (translated set 2, code 0x94 on isa0060/serio0).atkbd.c: Use 'setkeycodes e014 <keycode>' to make it known.atkbd.c: Unknown key released (translated set 2, code 0x94 on isa0060/serio0).atkbd.c: Use 'setkeycodes e014 <keycode>' to make it known.

La otra opción es usar tail -f con el mensaje de registro del kernel, una vez más, puede estar localizado en /var/log/messages o en /var/log/dmesg, y después presionar las teclas desconocidas, para salir de tail usa ctrl+c:

tail -f /var/log/messages

Por este método verías los mismos mensajes aparecer cuando presionas dichas teclas, solo que con la tecla y el nombre del usuario al principio.

En este ejemplo, el código de escaneo de tres teclas fue desconocido, esto es, no fue encontrado un código de tecla asociado con el código de escaneo, el valor importante aquí aparece justo a la derecha del comando setkeycodes. Vamos a definir e026, e023 y e014.

Asignar un código de tecla al código de escaneo

Como sigo asumiendo que planeas darle alguna funcionalidad a estas teclas en un entorno gráfico, puedes usar el comando:

xmodmap -pke | less

Este comando te mostrara la distribución actual del teclado, aquí puedes encontrar códigos de tecla no usados así como códigos de tecla de funcionalidad ya soportada por xmodmap. Si estas tres teclas corresponden a los controles de volumen, silenciar, bajar y subir el volumen, encontraremos que esta funcionalidad ya tiene un código de tecla asociado a ella, veríamos las siguientes lineas:

keycode 121 = XF86AudioMute NoSymbol XF86AudioMute
keycode 122 = XF86AudioLowerVolume NoSymbol XF86AudioLowerVolume
keycode 123 = XF86AudioRaiseVolume NoSymbol XF86AudioRaiseVolume

Entonces, vamos a asignar a cada uno de lo códigos de escaneo uno de los códigos de tecla que encontramos aquí. Para asignarle un código de tecla a una tecla, usamos el comando setkeycodes. Adicionalmente a esto podemos asignarle cualquier código de escaneo que esté desocupado, siempre y cuando el número no sea mayor de 255 (en kernels de la serie 2.4 el máximo número es 127, puedes ver cual tienes con el comando uname -r). Siguiendo nuestro ejemplo:

setkeycodes e014 121
setkeycodes e023 122
setkeycodes e026 123

Si no obtenemos un mensaje de error, entonces las teclas han sido correctamente configuradas. Esto debe hacer funcionar a las teclas. Es una buena idea probar las teclas individualmente para asegurarnos de que todo esta funcionando bien. En el peor de los casos le asignaríamos a la tecla un número inválido y nuestro teclado dejaría de funcionar correctamente, pero esto puede ser fácilmente deshecho recargando la sesión (desconectándonos y volviendo a conectarnos) o reiniciando. Sin embargo esto no debería de suceder.

Hacer un script que se ejecute al encender la computadora

Una vez que todo funciona bien, vamos a crear un script para que haga esta asignación cuando iniciamos la computadora. Creamos un archivo dentro de /etc/init.d (en algunos sistemas puede ser /etc/conf.d, para Debian y variantes como Ubuntu es init.d), voy a llamarlo mapeoteclas.

sudo gedit /etc/init.d/keyremap

Y agregamos las siguientes lineas en este archivo:

#!/bin/sh
setkeycodes e014 121
setkeycodes e023 122
setkeycodes e026 123

Lo guardamos y lo hacemos ejecutable con:

sudo chmod +x /etc/init.d/keyremap

Y lo hacemos que sea ejecutado al inicio junto con el resto de los scripts en /etc/init.d:

update-rc.d mapeoteclas defaults

Si queremos remover el script del inicio, podemos usar:

update-rc.d -f mapeoteclas remove