El mini teclado inalámbrico externo RT-MWK01, de la empresa china Riitek especializada en mini teclados, venía con el sistema multimedia basado en Android, WOXTER TV 200. Es un teclado QWERTY completo, con touchpad y cursor. Cuando salió al mercado, el teclado resultó un complemento maravilloso, ya que te permitía utilizar el sistema multimedia de forma casi similar a si estuvieras manipulando la pantalla táctil de un móvil.
El teclado dispone de un LED bastante luminoso (aunque yo no lo he utilizado nunca) y está dotado de retroiluminación en todas las teclas, muy práctico si estás viendo una película en el salón con las luces apagadas. No necesita pilas, pues incorpora una pequeña batería, recargable mediante conexión USB.
El sistema funcionaba perfectamente hasta que opté por cambiar la ROM original que equipaba el dispositivo WOXTER por otra versión de Gingerbread, la 2.3.6, que incorporaba mejoras y permitía rooterlo. Dos pasos para adelante... y uno para atrás: El teclado dejó de responderme conforme a un teclado español. Las teclas respondían a un teclado inglés.
Cuando me encontré en esta situación, traté de buscar una solución, rastreando por Internet, pero no fui capaz de resolver el problema. Tampoco era un problema acuciante de resolver, que me preocupase excesivamente.
MUY IMPORTANTE:
Antes de continuar hay que tener en cuenta que para realizar todos los procedimientos que siguen, el dispositivo tiene que estar ROOTEADO. Este procedimiento ha sido probado en un sistema determinado, y que probablemente funcione sin mayores problemas en otro sistema Android. A pesar de ello, no me responsabilizo de los problemas que puedan surgir al aplicar lo que se indica en este blog.Los procedimientos que se indican en esta entrada del blog han funcionado en un sistema Android con versión 4.2.2. Probablemente funcione para versiones anteriores de Android 4.0 y superiores.
Antes de continuar hay que tener en cuenta que para realizar todos los procedimientos que siguen, el dispositivo tiene que estar ROOTEADO. Este procedimiento ha sido probado en un sistema determinado, y que probablemente funcione sin mayores problemas en otro sistema Android. A pesar de ello, no me responsabilizo de los problemas que puedan surgir al aplicar lo que se indica en este blog.Los procedimientos que se indican en esta entrada del blog han funcionado en un sistema Android con versión 4.2.2. Probablemente funcione para versiones anteriores de Android 4.0 y superiores.
Herramientas a utilizar
Esta vez voy a utilizar solamente el sistema Android. Existen otros modos de solucionar el problema tal como vienen indicados con suficiente detalle en la entrada que he mencionado con anterioridad.
Pero en este caso las herramientas que voy a utilizar serán sólo aplicaciones de Android:
- Un emulador de terminal desde Android, por ejemplo Android Terminal Emulator.
- la aplicación ES Explorador de Archivos.
- y la aplicación KeyTest.apk.
u otras aplicaciones que tengan las mismas funcionalidades que las anteriores.
Para ello, utilizaremos la aplicación Android Terminal Emulator para ver el 'contenido' de un fichero - /proc/bus/input/devices. En linux, el contenido de un fichero se muestra mediante la sentencia cat:
Pero en este caso las herramientas que voy a utilizar serán sólo aplicaciones de Android:
- Un emulador de terminal desde Android, por ejemplo Android Terminal Emulator.
- la aplicación ES Explorador de Archivos.
- y la aplicación KeyTest.apk.
u otras aplicaciones que tengan las mismas funcionalidades que las anteriores.
Parámetros del teclado
Primero, vamos averiguar el nombre que debemos darle a los dos ficheros requeridos por un dispositivo de introducción de datos como es un teclado externo./system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl /system/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
user_01@android:/ $ cat /proc/bus/input/devices ... I: Bus=0003 Vendor=1997 Product=0409 Version=0111 N: Name="Riitek Micro Keyboard" P: Phys=usb-s3cotg-1/input0 S: Sysfs=/devices/platform/s3c_otghcd/usb2/2-1/2-1:1.0/input/input9 U: Uniq= H: Handlers=sysrq kbd event9 keychord B: PROP=0 B: EV=120013 B: KEY=10000 7 ff800000 7ff febeffdf ffefffff ffffffff fffffffe B: MSC=10 B: LED=1f I: Bus=0003 Vendor=1997 Product=0409 Version=0111 N: Name="Riitek Micro Keyboard" P: Phys=usb-s3cotg-1/input1 S: Sysfs=/devices/platform/s3c_otghcd/usb2/2-1/2-1:1.1/input/input10 U: Uniq= H: Handlers=kbd event10 keychord B: PROP=0 B: EV=1f B: KEY=4837fff 72ff32d bf544446 0 0 70001 20c10 b17c000 267bfa d9415fed 9e1680 4400 0 10000002 B: REL=143 B: ABS=1 0 B: MSC=10 user_01@android:/ $
Tenemos los tres parámetros que requerimos para nombrar los dos ficheros:
- Vendor = 1997
- Product = 0409
- Version = 0111 (este último parámetro no se requiere)
además de indicarnos el nombre del producto "Riitek Micro Keyboard".
- Vendor = 1997
- Product = 0409
- Version = 0111 (este último parámetro no se requiere)
además de indicarnos el nombre del producto "Riitek Micro Keyboard".
Ficheros genéricos
Vamos a utilizar unos ficheros genéricos como base de nuestras modificaciones. Estos ficheros,corresponden a Generic.kl y Generic.kcm y se encuentran ubicados en las carpetas /system/usr/keylayout y /system/usr/keychars, respectivamente.De nuevo volvemos a utilizar el Terminal Emulator:
user_01@android:/ $ su root@android:/ # cat /proc/mounts | grep system /dev/block/mmcblk0p9 /system ext4 ro,relatime,barrier=1,data=ordered 0 0 /dev/block/dm-6 /mnt/asec/com.mobisystems.editor.office_registered-1 vfat ro,di rsync,nosuid,nodev,noatime,nodiratime,uid=1000,fmask=0222,dmask=0222,codepage=c p437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0 root@android:/ # mount -o remount,rw -t ext4 /dev/block/mmcblk0p9 /system root@android:/ # cd /system/usr/keylayout root@android:/system/usr/keylayout # cp Generic.kl Vendor_1997_Product_0409.kl root@android:/system/usr/keylayout # cd /system/usr/keylayout root@android:/system/usr/keychars # cp Generic.kcm Vendor_1997_Product_0409.kcm root@android:/system/usr/keychars # exit user_01@android:/ $
Lo que hemos hecho ha sido primero hacernos usuario root (su), después hemos averiguado el punto de montaje de la carpeta /system (/dev/block/mmcblk0p9), hemos montado la carpeta /system en modo escritura/lectura (rw) y creado los correspondientes ficheros mediante el procedimiento de copia a partir de los ficheros genéricos Generic.kl y Generic.kcm.
Códigos del teclado
El siguiente paso es averiguar el código (scanCode) asociado a cada tecla. Para ello utilizaremos la aplicación KeyTest, que nos habremos bajado e instalado convenientemente. Al ejecutarla aparecerá por la pantalla del dispositivo Android la siguiente información:A medida que vayamos pulsando las teclas, el valor asociado a scanCode irá cambiando. Y será en estos valores en los que nos iremos fijando, anotando estos valores en la distribución de teclado que aparece en la siguiente imagen, en donde mostramos el scanCode de cada tecla al pulsarla:
La tecla azul 'Fn' funciona de una forma peculiar. Si pulsamos simultáneamente Fn y las teclas serigrafiadas parcialmente con símbolos azules, generarán, en algunos casos, un scanCode distinto, el que se muestra en la parte inferior de la tecla correspondiente; y en otros casos, tienen una función local al teclado, como es el caso de Fn+5, que retroilumina el teclado. La combinación Fn+F4 que apaga momentáneamente la pantalla del dispositivo Android. Existen otras teclas que responden con otro scanCode al pulsarlas simultáneamente con la tecla Fn, pero que al no estar serigrafiadas voy prescindir de ellas.
Dentro de este fichero Riitek_Micro_Keyboard_RT-MWK01 se encuentran los dos ficheros con los cambios requeridos para que este teclado funcione para el idioma español.
El procedimiento que he seguido para editar estos ficheros ha sido el que a continuación se muestra. Se puede hacer directamente en el dispositivo Android, de una manera más cómoda, en un propio PC, pues la edición de un fichero de texto es mucho más sencilla.
Si optamos por hacerlo de forma autónoma, sin recurrir a un PC, nos metemos dentro del ES Explorador de Archivos, vamos a las carpetas correspondientes, los abrimos en modo texto y lo editamos y guardamos los cambios. Si lo hacemos con un PC, hay que copiarlos al PC, editarlos convenientemente, guardar los cambios y volcarlos de nuevo a las mismas carpetas.
Edición de Vendor_1997_Product_0409.kl
Todas y cada una de las teclas que hayan respondido a la aplicación KeyTest, produciendo un scanCode determinado corresponderán a una línea en este fichero. Cada línea (se puede seguir el enlace Key Layout Files) constará de los siguientes campos:key [scanCode] [keyCode name] [etiquetas]
De este modo, y como ejemplo, para los códigos 8, 28, 59 y 103, las líneas se definirán como sigue, si es que no están definidas ya:
...
key 9 8
...
key 28 ENTER
...
key 59 F1
...
key 103 DPAD_UP
...
Con los códigos 13, 41 y 43, y posiblemente algún otro, se ha tomado una etiqueta que no corresponde. La razón de ello es de que no existe una etiqueta válida para el signo de exclamación invertido ¡, ni para la cedilla, Ç, ni tampoco para el símbolo de grado centesimal,º. O yo no he sido capaz de encontrarlos como etiquetas válidas. Para estos códigos, las líneas se definirán del siguiente modo:
... key 13 SLASH ... key 41 BACKSLASH ... key 43 RIGHT_BRACKET ...
Edición de Vendor_1997_Product_0409.kcm
Ahora nos toca personalizar el fichero kcm. Cada línea del fichero kl tiene que tener una estructura de datos en el fichero kcm del tipo:# cualquier comentario empieza por el carácter almohadilla key [etiqueta] { label: '[etiqueta de la tecla]' base: '[tecla sin modificador]' [modificador]: '[tecla con modificador]' [modificador]+[modificador]: '[tecla con ambos modificadores simultáneos]' [modificador],[modificador]: '[tecla con algún modificador de entre los indicados]' [modificador]: fallback [tecla mágica] [modificador],[modificador]: none }
Los modificadores pueden tomar los valores ralt, lalt, alt (tecla ALT dcha/izda/indistinta) , rshift, lshift, shift (tecla SHIFT dcha/izda/indistinta) , rctrl, lctrl, ctrl (tecla CTRL dcha/izda/indistinta) , capslock, y rmeta, lmeta, meta (tecla WIN dcha/izda/indistinta) si existiera la tecla WIN, y pueden combinarse de distintas maneras.
El parámetro label corresponde a la etiqueta de la tecla tal como aparece en el teclado. Esta línea se puede omitir, siendo éste el caso para los caracteres específicos españoles, Ñ, Ç, etc. En la segunda columna se deben poner entre comillas los caracteres que se enviarán al sistema de entrada, teniendo en cuenta que los ficheros kl y kcm sólo admiten caracteres UNICODE, por lo que para las letras Ñ o Ç deberemos ponerlo tal como sigue:
... key RO { base: '\u00f1' # n minuscula con tilde shift, capslock: '\u00d1' # N mayuscula con tilde } ... key RIGHT_BRACKET { base: '\u00e7' # cedilla minuscula shift, capslock: '\u00c7' # cedilla mayuscula alt: '}' } ...
... key ESCAPE { base: fallback BACK alt, meta: fallback HOME ctrl: fallback MENU } key F1 { base: fallback MENU } key F2 { base: fallback HOME } key F3 { base: fallback SEARCH } key F4 { base: fallback VOLUME_DOWN shift: fallback VOLUME_MUTE } key F5 { base: fallback VOLUME_UP shift: fallback VOLUME_MUTE } key F6 { base: fallback MEDIA_PREVIOUS } key F7 { base: fallback MEDIA_PLAY_PAUSE } key F8 { base: fallback MEDIA_NEXT } key F9 { base: fallback EXPLORER } key F10 { base: fallback ENVELOPE } key F11 { base: fallback MUSIC } ...
... key U { label: 'U' base: 'u' shift, capslock: 'U' alt: '\u0308' # acento diéresis en siguiente letra vocal } ... key GRAVE { label: '`' base: '\u0300' # acento grave shift: '\u0302' # acento circunflejo alt: '[' } ... key LEFT_BRACKET { base: '\u0301' shift: '"' alt: '{' } ...
user@pc-desktop:~$ adb shell root@android:/ # chmod 644 /system/usr/keychars/Vendor_1997_Product_0409.kcm root@android:/ # chmod 644 /system/usr/keylayout/Vendor_1997_Product_0409.kl
Conclusión
Con esta entrada en el blog, y otra anterior en este mismo blog Personalización del teclado externo inalámbrico RC12 de un miniPC MK808 basado en Android, queda suficientemente explicado el modo de resolver el problema de adaptar los distintos tipos de teclados externos que pueden conectarse a un sistema Android.A pesar de todo, agradecería comentarios al respecto, indicándome aquellos aspectos que no están suficientemente claros, para que lo pueda explicar más claro y extensamente.
Referencias
- http://source.android.com/devices/tech/input/overview.html- How to Create a Customized Keylayout for Any USB or Bluetooth Keyboard (ROOTED)
- [TUTORIAL] External keyboard remapping [3.0+]
- Android Terminal Emulator
- KeyTest.apk
- estándar de codificación UNICODE
- http://en.wikipedia.org/wiki/List_of_Unicode_characters
- Tabla Extendida de Códigos de Caracteres en HTML
Muy bueno el tutorial, pero falta indicar que si queremos usar directamente los archivos de https://www.dropbox.com/s/z239ud8psu5ddqy/Riitek_Micro_Keyboard_RT-MWK01.rar han de establecerse sus permisos a
ResponderEliminarrw-r--r-- sino no funciona, comprobado.
Un saludo y gracias
Gracias por la observación. Totalmente de acuerdo contigo. Así como en la entrada anterior sí indico este paso, en ésta se me olvidó incluir el establecimiento de los permisos tal como indicas.
ResponderEliminarPaso a modificar la entrada convenientemente.
Un saludo
Hola sabes como arreglar los mini teclados bluetooth son de los modernos por decir chinos ,pasa que dos de 3 que tengo no me funcionan algunos botones y el mouse optico , y al otro presionaron por error el comando fn+f1 que segun lei en un blog es reset, y ahora no funciona , creo que todo esto es debido a una mala configuracion es su software podrias ayudarme o hacer un post , te prometo que es mucha gente la que tiene este tipo de problemas
ResponderEliminar