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

4

Estou tentando configurar meu teclado Apple Wireless Keyboard com meus sistemas Kubuntu. São hardware de PC com processador Intel Atom e Intel i5, respectivamente. O teclado tem um layout de teclado dos EUA e tem o número do modelo A1314 escrito na parte de trás. Leva duas pilhas AA. Estou dizendo que, 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 pode 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 é: a tecla Fn. Eu gostaria de usar Fn + Down Arrow como PgDn / Page Down, eu entendo que este é o comportamento padrão nos teclados da Apple. E é claro que eu gostaria do mesmo para Page Up, Home e End. Eu vou ficar com Page Down no meu exemplo.

Eu usei a ferramenta xev para ver os códigos de tecla que o sistema recebe, e se eu pressionar Fn nada acontece, e nada é registrado. Se eu pressionar Fn + Seta para baixo, xev registra somente 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:     KeyPress evento, serial 36, sintético NO, janela 0x4400001,         raiz 0x15d, subw 0x4400002, hora 2699773, (44,45), raiz: (1352,298),         estado 0x10, código de acesso 116 (keysym 0xff54, Down), same_screen YES,         XLookupString dá 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 Fn + teclas de 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

Eu tenho procurado este fórum e outros fóruns relacionados ao Linux por horas, mas ainda não encontrei uma solução. Eu encontrei principalmente conselhos sobre como consertar isso ao usar um laptop de maçã ou desktop real, mas eu não tenho isso. Eles disseram para tentar algo como o seguinte

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

Eu sou legal 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 chaves. Com alguns mexer no AutoHotkey, consegui confirmar que a chave está registrada como pressionada, mas ignorada por padrão. Um script personalizado do AutoHotkey pode corrigir isso. Mas o AutoHotkey é apenas para Windows, quero que meu problema seja corrigido no Linux.

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

Então, para resumir a minha pergunta: alguém pode me ajudar a fazer Page Up, Page Down, Home e End trabalhar neste teclado, quando isso requer que eu use uma tecla Fn que não está registrada atualmente?

Editar 4 de julho de 2012: Ainda sem sorte. Pensei que talvez o KDE estivesse interferindo em algo, 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
    
por ramplank 25.06.2012 / 00:49

2 respostas

1

Eu finalmente consegui a chave fn funcionando! Eu tive que compilar meu próprio módulo do kernel para fazer isso. Eu acho que poderia ter resolvido isso de uma maneira mais fácil, mas aqui está o que eu fiz:

Eu encontrei este bug: link

O primeiro patch postado nessa página teve minha solução: link

Então eu continuei a corrigir e modificar meus módulos seguindo o artigo e primeiro comentário sobre link

Eu não apliquei o patch inteiro, apenas as linhas referentes a USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI com ID 0x0255, já que esse ID estava faltando na fonte do kernel que eu recebi. Eu tentei isso porque notei o número 0255 no syslog anterior: generic-bluetooth 0005:05AC:0255.0006: input,hi...

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

Aqui está uma saída do Xev, pressionando a tecla de seta para a esquerda, primeiro com e 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 chave separada com a qual eu posso me divertir xmodmapping, mas isso é suficiente para meus objetivos, transformando um teclado da Apple em um hackear feliz ao remapear algumas teclas.

Parece que tudo isso é um bug conhecido: link

    
por 04.07.2012 / 14:37
1

Meu teclado é o mesmo. Aqui está o patch que eu fiz contra o kernel do Linux 3.4 para fazer a chave "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) },
    
por 15.07.2012 / 10:09