Linux: La tecla Apple Wireless A1314 Fn no está registrada, parece un error de software

Linux: La tecla Apple Wireless A1314 Fn no está registrada, parece un error de software

Estoy intentando configurar mi teclado inalámbrico Apple con mis sistemas Kubuntu. Se trata de hardware de PC con tecnología Intel Atom e Intel i5 respectivamente. El teclado tiene una distribución de teclado estadounidense y tiene el número de modelo A1314 escrito en la parte posterior. Se necesitan dos pilas AA. Lo digo porque parece que hay varios tipos de modelo A1314.

Probé esto en un sistema 10.04, 11.04, 11.10 y 12.04 sin éxito. Cada vez que se utiliza un dongle bluetooth y el subprograma de la bandeja de notificaciones bluetooth de KDE, se puede conectar el teclado. En ambos casos aparece como "Teclado inalámbrico Apple".

Casi todo funciona como se esperaba, de hecho, estoy escribiendo en ello ahora mismo. Pero hay una cosa que no: la tecla Fn. Me gustaría usar Fn + Flecha abajo como AvPág / AvPág, entiendo que este es el comportamiento predeterminado en los teclados Apple. Y, por supuesto, me gustaría lo mismo para Re Pág, Inicio y Fin. Me limitaré a Av Pág en mi ejemplo.

Utilicé la herramienta xev para ver los códigos clave que recibe el sistema y si presiono Fn no pasa nada y no se registra nada. Si presiono Fn + Flecha hacia abajo, xev solo registra la flecha hacia abajo. Aquí está el resultado de mi sistema 11.04 para ilustrar:

Presione solo la tecla Fn: no hay salida

Presione la tecla de flecha hacia abajo: evento KeyPress, serie 36, NO sintético, ventana 0x4400001, raíz 0x15d, subw 0x4400002, hora 2699773, (44,45), raíz: (1352,298), estado 0x10, código clave 116 (keysym 0xff54, Abajo ), misma_pantalla SÍ, XLookupString da 0 bytes: XmbLookupString da 0 bytes: XFilterEvent devuelve: Falso

KeyRelease event, serial 36, synthetic NO, window 0x4400001,
    root 0x15d, subw 0x4400002, time 2699860, (44,45), root:(1352,298),
    state 0x10, keycode 116 (keysym 0xff54, Down), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Presione Fn+teclas de flecha hacia abajo juntas:

KeyPress event, serial 36, synthetic NO, window 0x4400001,
    root 0x15d, subw 0x4400002, time 2701548, (44,45), root:(1352,298),
    state 0x10, keycode 116 (keysym 0xff54, Down), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x4400001,
    root 0x15d, subw 0x4400002, time 2701623, (44,45), root:(1352,298),
    state 0x10, keycode 116 (keysym 0xff54, Down), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Llevo horas buscando en este foro y otros foros relacionados con Linux pero aún no encuentro solución. Principalmente encontré consejos sobre cómo solucionar este problema cuando uso una computadora portátil o de escritorio Apple real, pero no los tengo. Dijeron que probara algo como lo siguiente.

echo 2 > /sys/module/hid_apple/ ...Pero como no hay ningún directorio hid_apple presente en mis sistemas, primero necesitaba hacerlo modprobe hid_apple. Eso tampoco ayudó.

Estoy de acuerdo con cambiar algunos archivos de configuración o compilar mi propio kernel parcheado si es necesario.

Actualmente tengo un sistema 10.04 y 12.04 disponible para probar.

El mismo problema ocurre cuando se conecta a Windows 7. La tecla Fn todavía no hace nada, ni por sí sola ni en combinación con otras teclas. Con un poco de manipulación de AutoHotkey, pude confirmar que la tecla está registrada como presionada, pero se ignora de forma predeterminada. Un script AutoHotkey personalizado puede solucionar este problema. Pero AutoHotkey es sólo para Windows, quiero que mi problema se solucione en Linux.

Conectado a un iPad 2, solo funciona en combinación con las teclas F1-F12. No con las teclas de flecha. Si la pantalla del ipad está apagada y presiono solo la tecla Fn, la pantalla se encenderá, por lo que la tecla en sí se registra como presionada.

Entonces, para resumir mi pregunta: ¿Alguien puede ayudarme a hacer que Re Pág, Av Pág, Inicio y Fin funcionen en este teclado, cuando eso requiere que use una tecla Fn que actualmente no está registrada?

Edición del 4 de julio de 2012: todavía no hubo suerte. Pensé que quizás KDE estaba interfiriendo en algo, pero aquí en XFCE el problema persiste.

Aquí hay algunos resultados de Syslog:

Jul  4 13:15:31 comp kernel: [ 1561.377849] usb 1-1.4: new full-speed USB device number 8 using ehci_hcd
Jul  4 13:15:31 comp kernel: [ 1561.449864] usb 1-1.4: device descriptor read/64, error -32
Jul  4 13:15:31 comp kernel: [ 1561.629402] usb 1-1.4: device descriptor read/64, error -32
Jul  4 13:15:32 comp kernel: [ 1561.805100] usb 1-1.4: new full-speed USB device number 9 using ehci_hcd
Jul  4 13:15:32 comp bluetoothd[911]: HCI dev 0 registered
Jul  4 13:15:32 comp bluetoothd[911]: Listening for HCI events on hci0
Jul  4 13:15:33 comp bluetoothd[911]: HCI dev 0 up
Jul  4 13:15:33 comp bluetoothd[911]: Adapter /org/bluez/911/hci0 has been enabled
Jul  4 13:15:44 comp kernel: [ 1573.712323] input: Apple Wireless Keyboard as /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.4/1-1.4:1.0/bluetooth/hci0/hci0:42/input8
Jul  4 13:15:44 comp kernel: [ 1573.712569] generic-bluetooth 0005:05AC:0255.0006: input,hidraw3: BLUETOOTH HID v0.50 Keyboard [Apple Wireless Keyboard] on 00:09:DD:50:75:A1

Respuesta1

¡Finalmente conseguí que la tecla fn funcionara! Tuve que compilar mi propio módulo del kernel para hacerlo. Creo que podría haberlo resuelto de una manera más fácil, pero esto es lo que hice:

Encontré este error:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/942184

El primer parche publicado en esa página tenía mi solución:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/942184/+attachment/2788714/+files/alu2011.patch

Luego procedí a parchear y modificar mis módulos siguiendo el artículo y el primer comentario sobre http://www.codewhirl.com/2012/04/how-to-compile-a-single-module-in-ubuntu-linux/

No apliqué todo el parche, solo las líneas que hacen referencia USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSIal ID 0x0255, ya que este ID faltaba en la fuente del kernel que obtuve. Intenté esto porque noté el número 0255 en el syslog anteriormente:generic-bluetooth 0005:05AC:0255.0006: input,hi...

Realmente no entiendo completamente cómo lo hice, ¡pero funciona!

Aquí hay algunos resultados de Xev, presionando la tecla de flecha izquierda, primero con y luego sin la tecla fn:

KeyPress event, serial 34, synthetic NO, window 0x3000001,
    root 0x15d, subw 0x3000002, time 1502136, (40,28), root:(1235,427),
    state 0x0, keycode 110 (keysym 0xff50, Home), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 34, synthetic NO, window 0x3000001,
    root 0x15d, subw 0x3000002, time 1502635, (40,28), root:(1235,427),
    state 0x0, keycode 110 (keysym 0xff50, Home), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 34, synthetic NO, window 0x3000001,
    root 0x15d, subw 0x3000002, time 1504023, (40,28), root:(1235,427),
    state 0x0, keycode 113 (keysym 0xff51, Left), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 34, synthetic NO, window 0x3000001,
    root 0x15d, subw 0x3000002, time 1504235, (40,28), root:(1235,427),
    state 0x0, keycode 113 (keysym 0xff51, Left), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

La tecla Fn no está registrada como una tecla separada con la que puedo divertirme haciendo xmodmapping, pero esto es suficiente para mis objetivos, convertir un teclado Apple en un teclado feliz reasignando algunas teclas.

Parece que todo esto es un error conocido:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/911064

Respuesta2

Mi teclado es el mismo. Aquí está el parche que hice para el kernel de Linux 3.4 para que la tecla "fn" funcione.

diff -aur linux-3.4.pristine/drivers/hid/hid-apple.c linux-3.4.new/drivers/hid/hid-apple.c
--- linux-3.4.pristine/drivers/hid/hid-apple.c  2012-07-15 04:45:54.489209371 -0300
+++ linux-3.4.new/drivers/hid/hid-apple.c   2012-07-15 04:41:46.986193078 -0300
@@ -455,6 +455,8 @@
    { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO),
        .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
            APPLE_ISO_KEYBOARD },
+   { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI),
+       .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
    { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO),
        .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
            APPLE_ISO_KEYBOARD },
diff -aur linux-3.4.pristine/drivers/hid/hid-core.c linux-3.4.new/drivers/hid/hid-core.c
--- linux-3.4.pristine/drivers/hid/hid-core.c   2012-07-15 04:45:54.489209371 -0300
+++ linux-3.4.new/drivers/hid/hid-core.c    2012-07-15 04:41:46.986193078 -0300
@@ -1382,6 +1382,7 @@
    { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) },
    { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) },
    { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) },
+   { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI) },
    { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO) },
    { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
    { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },

información relacionada