Linux: Apple Wireless A1314 Fn キーが登録されていない、ソフトウェアのバグのようだ

Linux: Apple Wireless A1314 Fn キーが登録されていない、ソフトウェアのバグのようだ

Apple Wireless Keyboard を Kubuntu システムでセットアップしようとしています。これらは、それぞれ Intel Atom と Intel i5 を搭載した PC ハードウェアです。キーボードは US キーボード レイアウトで、背面にモデル番号 A1314 と書かれています。単 3 電池 2 本が必要です。そう言っているのは、モデル A1314 には複数の種類があるように見えるからです。

私はこれを 10.04、11.04、11.10、12.04 システムで試しましたが、成功しませんでした。Bluetooth ドングルと KDE Bluetooth 通知トレイ アプレットを使用すると、キーボードを接続できます。どちらの場合も、「Apple Wireless Keyboard」として表示されます。

ほとんどすべてが期待どおりに機能し、実際、今まさに入力中です。しかし、1 つだけ機能しません。Fn キーです。Fn + 下矢印を PgDn / Page Down として使用したいのですが、これは Apple キーボードのデフォルトの動作だと理解しています。もちろん、Page Up、Home、End についても同じ動作にしたいです。私の例では、Page Down を使用します。

私は xev ツールを使用してシステムが受信するキーコードを確認しましたが、Fn を押しても何も起こらず、何も登録されません。Fn + 下矢印を押すと、xev は下矢印のみを登録します。説明のために、私の 11.04 システムからの出力を以下に示します。

Fnキーだけを押すと出力なし

下矢印キーを押す: KeyPress イベント、シリアル 36、合成 NO、ウィンドウ 0x4400001、ルート 0x15d、サブウィンドウ 0x4400002、時間 2699773、(44,45)、ルート:(1352,298)、状態 0x10、キーコード 116 (キーシンボル 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 関連のフォーラムを何時間も検索していますが、まだ解決策が見つかりません。実際の 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 キーだけを押すと、画面がオンになり、キー自体は押されたものとして登録されます。

質問をまとめると、現在登録されていない 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/+attachment/2788714/+files/alu2011.patch

その後、私は記事と最初のコメントに従ってモジュールにパッチを当てて修正しました。 http://www.codewhirl.com/2012/04/how-to-compile-a-single-module-in-ubuntu-linux/

入手したカーネル ソースにはこの ID がなかったため、パッチ全体ではなく、ID 0x0255 を参照する行のみを適用しましたUSB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI。以前 syslog に 0255 という数字があることに気付いたので、これを試しました。generic-bluetooth 0005:05AC:0255.0006: input,hi...

どうやってやったのかよく分かりませんが、うまくいきました!

以下は、左矢印キーを押したとき、最初に fn キーを押したとき、次に fn キーを押さなかったときの Xev 出力です。

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 キーボードをハッピーハッキング風に変えるという私の目標にはこれで十分です。

これらはすべて既知のバグのようです:参考:

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

関連情報