Linux:Apple Wireless A1314 Fn 键未注册,看起来像软件错误

Linux:Apple Wireless A1314 Fn 键未注册,看起来像软件错误

我正在尝试使用我的 Kubuntu 系统设置我的 Apple 无线键盘。这些是分别由 Intel Atom 和 Intel i5 提供支持的 PC 硬件。该键盘采用美式键盘布局,背面写有型号 A1314。它需要两节 AA 电池。我这么说是因为 A1314 型号似乎有多种类型。

我在 10.04、11.04、11.10 和 12.04 系统上尝试过此操作,但没有成功。每次使用蓝牙适配器和 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,合成 NO,窗口 0x4400001,根 0x15d,子w 0x4400002,时间 2699773,(44,45),根:(1352,298),状态 0x10,键码 116(keysym 0xff54,向下), same_screen YES, 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 相关论坛中搜索了几个小时,但仍然没有找到解决方案。我主要找到了有关如何在使用实际的苹果笔记本电脑或台式机时解决此问题的建议,但我没有。他们说尝试如下

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 键,屏幕就会亮起,因此该键本身会被注册为按下。

总结一下我的问题:当我需要使用当前未注册的 Fn 键时,任何人都可以帮助我在这个键盘上使用 Page Up、Page Down、Home 和 End 吗?

2012 年 7 月 4 日编辑:仍然没有运气。我以为 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/how-to-compile-a-single-module-in-ubuntu-linux/

我没有应用整个补丁,只应用了USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSIID 为 0x0255 的行,因为我得到的内核源代码中缺少这个 ID。我尝试这样做是因为我之前注意到系统日志中的数字 0255:generic-bluetooth 0005:05AC:0255.0006: input,hi...

我不太明白我是怎么做到的,但它确实有效!

这是一些 Xev 输出,按下左箭头键,首先使用 fn 键,然后不使用 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 进行有趣的操作,但这对于我的目标来说已经足够了,通过重新映射几个键将苹果键盘变成一个快乐的黑客键盘。

看来这都是一个已知的错误: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) },

相关内容