Linux: клавиша Fn на Apple Wireless A1314 не зарегистрирована, похоже, программная ошибка

Linux: клавиша Fn на Apple Wireless A1314 не зарегистрирована, похоже, программная ошибка

Я пытаюсь настроить свою беспроводную клавиатуру Apple с моими системами Kubuntu. Это компьютерное оборудование на базе Intel Atom и Intel i5 соответственно. Клавиатура имеет раскладку клавиатуры для США и имеет номер модели A1314, написанный сзади. Она работает от двух батареек типа AA. Я говорю это, потому что, похоже, существует несколько типов модели A1314.

Я пробовал это на системах 10.04, 11.04, 11.10 и 12.04, но безуспешно. Каждый раз при использовании bluetooth-донгла и апплета уведомления bluetooth KDE клавиатура может быть подключена. В обоих случаях она отображается как "Apple Wireless Keyboard".

Почти все работает так, как и ожидалось, на самом деле, я печатаю на нем прямо сейчас. Но одно не работает: клавиша Fn. Я бы хотел использовать Fn + Стрелка вниз как PgDn / Page Down, я понимаю, что это поведение по умолчанию на клавиатурах Apple. И, конечно, я бы хотел то же самое для Page Up, Home и End. Я буду придерживаться Page Down в своем примере.

Я использовал инструмент xev, чтобы увидеть коды клавиш, которые получает система, и если я нажимаю Fn, ничего не происходит и ничего не регистрируется. Если я нажимаю Fn + Стрелка вниз, xev регистрирует только стрелку вниз. Вот вывод моей системы 11.04 для иллюстрации:

Нажмите только клавишу Fn: нет вывода

Нажмите клавишу со стрелкой вниз: событие KeyPress, серийный номер 36, синтетический НЕТ, окно 0x4400001, корень 0x15d, subw 0x4400002, время 2699773, (44,45), корень:(1352,298), состояние 0x10, код клавиши 116 (символ клавиши 0xff54, Вниз), тот же экран ДА, XLookupString возвращает 0 байт: XmbLookupString возвращает 0 байт: XFilterEvent возвращает: 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

Нажмите клавиши Fn+стрелка вниз одновременно:

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

Я искал этот форум и другие форумы, связанные с Linux, часами, но так и не нашел решения. В основном я нашел советы о том, как исправить это, используя настоящий ноутбук или настольный компьютер Apple, но у меня его нет. Они сказали попробовать что-то вроде следующего

echo 2 > /sys/module/hid_apple/ ...Но поскольку в моих системах нет каталога hid_apple, мне пришлось modprobe hid_appleсначала это сделать. Это тоже не помогло.

Я не против изменения некоторых конфигурационных файлов или компиляции собственного пропатченного ядра, если это необходимо.

В настоящее время у меня есть системы 10.04 и 12.04, доступные для тестирования.

Та же проблема возникает при подключении к Windows 7. Клавиша Fn по-прежнему ничего не делает, ни сама по себе, ни в сочетании с другими клавишами. Немного повозившись с AutoHotkey, я смог подтвердить, что клавиша регистрируется как нажатая, но по умолчанию игнорируется. Пользовательский скрипт AutoHotkey может это исправить. Но AutoHotkey предназначен только для Windows, я хочу, чтобы моя проблема была исправлена ​​в Linux.

Подключен к iPad 2, работает только в сочетании с клавишами F1-F12. Не работает с клавишами со стрелками. Если экран iPad выключен, и я нажимаю только клавишу Fn, экран включается, поэтому сама клавиша регистрируется как нажатая.

Итак, подведем итог моему вопросу: может ли кто-нибудь помочь мне заставить работать клавиши Page Up, Page Down, Home и End на этой клавиатуре, если для этого мне нужно использовать клавишу Fn, которая в настоящее время не зарегистрирована?

Редактировать 4 июля 2012: Все еще безуспешно. Думал, может быть, KDE вмешивается во что-то, но здесь, в XFCE, проблема сохраняется.

Вот некоторые выходные данные 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

решение1

Я наконец-то заставил клавишу fn работать! Мне пришлось скомпилировать свой собственный модуль ядра, чтобы это сделать. Я думаю, я мог бы решить это более простым способом, но вот что я сделал:

Я нашел эту ошибку:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/942184

Самый первый патч, опубликованный на этой странице, содержал мое решение:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/942184/+attachment/2788714/+files/alu2011.patch

Затем я приступил к исправлению и изменению своих модулей, следуя статье и первому комментарию http://www.codewhirl.com/2012/04/как-скомпилировать-отдельный-модуль-в-ubuntu-linux/

Я не применил весь патч, только строки, ссылающиеся на USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSIID 0x0255, поскольку этот ID отсутствовал в исходном коде ядра, который я получил. Я попробовал это, потому что заметил номер 0255 в syslog ранее:generic-bluetooth 0005:05AC:0255.0006: input,hi...

Я не совсем понимаю, как я это сделал, но это работает!

Вот некоторые выходные данные Xev, нажимающие клавишу со стрелкой влево, сначала с клавишей 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

Клавиша Fn не зарегистрирована как отдельная клавиша, с помощью которой я мог бы развлекаться xmodmapping, но этого достаточно для моих целей: превратить клавиатуру Apple в устройство для веселого хакинга, переназначив несколько клавиш.

Похоже, это известная ошибка:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/911064

решение2

У меня такая же клавиатура. Вот патч, который я сделал для ядра Linux 3.4, чтобы заставить работать клавишу "fn".

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

Связанный контент