Linux: chave Apple Wireless A1314 Fn não registrada, parece bug de software

Linux: chave Apple Wireless A1314 Fn não registrada, parece bug de software

Estou tentando configurar meu teclado Apple Wireless Keyboard com meus sistemas Kubuntu. Estes são hardware de PC com tecnologia Intel Atom e Intel i5, respectivamente. O teclado tem um layout de teclado americano e o número do modelo A1314 escrito na parte traseira. São necessárias duas pilhas AA. Estou dizendo isso porque parece que existem vários tipos de modelo A1314.

Eu tentei isso em um sistema 10.04, 11.04, 11.10 e 12.04 sem sucesso. Sempre que usar um dongle bluetooth e o miniaplicativo da bandeja de notificação bluetooth do KDE, o teclado poderá ser conectado. Em ambos os casos, aparece como “Apple Wireless Keyboard”.

Quase tudo funciona como esperado, na verdade, estou digitando agora. Mas uma coisa não funciona: a tecla Fn. Gostaria de usar Fn + seta para baixo como PgDn/Page Down. Entendo que esse é o comportamento padrão em teclados Apple. E é claro que gostaria do mesmo para Page Up, Home e End. Vou me ater ao Page Down no meu exemplo.

Usei a ferramenta xev para ver os códigos de acesso que o sistema recebe, e se eu pressionar Fn nada acontece e nada fica registrado. Se eu pressionar Fn + seta para baixo, xev registrará apenas a seta para baixo. Aqui está a saída do meu sistema 11.04 para ilustrar:

Pressione apenas a tecla Fn: sem saída

Pressione a tecla de seta para baixo: evento KeyPress, serial 36, NO sintético, janela 0x4400001, root 0x15d, subw 0x4400002, hora 2699773, (44,45), root:(1352,298), estado 0x10, código-chave 116 (keysym 0xff54, Down ), same_screen SIM, XLookupString fornece 0 bytes: XmbLookupString fornece 0 bytes: XFilterEvent retorna: False

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

Pressione as teclas Fn + seta para baixo 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

Estou pesquisando neste fórum e em outros fóruns relacionados ao Linux há horas, mas ainda não encontrei uma solução. Encontrei principalmente conselhos sobre como consertar isso ao usar um laptop ou desktop Apple real, mas não os tenho. Eles disseram para tentar algo como o seguinte

echo 2 > /sys/module/hid_apple/ ...Mas como não há diretório hid_apple presente em meus sistemas, precisei modprobe hid_appleprimeiro. Isso também não ajudou.

Não há problema em alterar alguns arquivos de configuração ou compilar meu próprio kernel corrigido, se necessário.

Atualmente tenho um sistema 10.04 e 12.04 disponível para teste.

O mesmo problema ocorre quando conectado ao Windows 7. A tecla Fn ainda não faz nada, nem por si só ou em combinação com outras teclas. Com alguns ajustes no AutoHotkey, consegui confirmar que a tecla está registrada como pressionada, mas ignorada por padrão. Um script AutoHotkey personalizado pode corrigir isso. Mas o AutoHotkey é apenas para Windows, quero que meu problema seja resolvido no Linux.

Conectado a um iPad 2 só funciona em combinação com as teclas F1-F12. Não com as setas do teclado. Se a tela do ipad estiver desligada e eu pressionar apenas a tecla Fn, a tela acenderá, então a própria tecla será registrada como pressionada.

Então, para resumir minha pergunta: Alguém pode me ajudar a fazer com que Page Up, Page Down, Home e End funcionem neste teclado, quando isso exige que eu use uma tecla Fn que não está registrada no momento?

Editar 4 de julho de 2012: Ainda sem sorte. Pensei que talvez o KDE estivesse interferindo em alguma coisa, mas aqui no XFCE o problema persiste.

Aqui estão alguns resultados do 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

Responder1

Finalmente consegui fazer a tecla fn funcionar! Eu tive que compilar meu próprio módulo do kernel para fazer isso. Acho que poderia ter resolvido de uma maneira mais fácil, mas eis o que fiz:

Encontrei este bug:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/942184

O primeiro patch postado nessa página teve minha solução:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/942184/+attachment/2788714/+files/alu2011.patch

Então comecei a corrigir e modificar meus módulos seguindo o artigo e o primeiro comentário em http://www.codewhirl.com/2012/04/how-to-compile-a-single-module-in-ubuntu-linux/

Não apliquei o patch inteiro, apenas as linhas referentes USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSIao ID 0x0255, pois esse ID estava faltando no código-fonte do kernel que obtive. Tentei isso porque notei o número 0255 no syslog anteriormente:generic-bluetooth 0005:05AC:0255.0006: input,hi...

Eu realmente não entendo completamente como fiz isso, mas funciona!

Aqui estão alguns resultados do Xev, pressionando a tecla de seta para a esquerda, primeiro com e depois sem a 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

A tecla Fn não está registrada como uma tecla separada com a qual posso me divertir no xmodmapping, mas isso é suficiente para meus objetivos, transformar um teclado da Apple em um hacker feliz, remapeando algumas teclas.

Parece que tudo isso é um bug conhecido:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/911064

Responder2

Meu teclado é o mesmo. Aqui está o patch que fiz no kernel Linux 3.4 para fazer a tecla "fn" funcionar.

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) },

informação relacionada