web-dev-qa-db-ja.com

Linux入力デバイスとして接続されたPS3 Bluetoothリモートのイベントタイプは13.10で1つのみ

Ubuntu 13.10(最新のカーネルと更新プログラムがインストールされている)でHarmony Smart ControlをPS3 Bluetoothリモートコントロール(このリモートのふりをする)としてセットアップしようとしています。 Bluetoothドングルはそのままでは機能しないため、次のことをしなければなりませんでした。

modprobe btusb
echo "050d 065a" >> /sys/bus/usb/drivers/btusb/new_id

その後、GUIからBluetoothマネージャーを使用してリモートファインをペアリングできます。 bt-deviceによると、通常のPS3リモートのように登録されています。

root@server:/dev/input# bt-device -i "BD Remote Contol"
[00:04:20:E8:B4:B4]
  Name: BD Remote Contol
  Alias: BD Remote Contol [rw]
  Address: 00:04:20:E8:B4:B4
  Icon: undefined
  Class: 0x250c
  Paired: 1
  Trusted: 1 [rw]
  Blocked: 0 [rw]
  Connected: 1
  UUIDs: [HumanInterfaceDevice, PnPInformation, 00001800-0000-1000-8000-00805f9b34fb]

このようにキーを押すたびに、bluetoothからのパッケージが表示されます。

root@server:/dev/input# hcidump -x -i hci0
HCI sniffer - Bluetooth packet analyzer ver 2.5
device: hci0 snap_len: 1500 filter: 0xffffffffffffffff
> ACL data: handle 11 flags 0x02 dlen 17
    L2CAP(d): cid 0x0041 len 13 [psm 0]
      A1 01 00 00 00 00 FF FF FF FF FF 01 05 
> ACL data: handle 11 flags 0x02 dlen 17
    L2CAP(d): cid 0x0041 len 13 [psm 0]
      A1 01 00 00 00 FF FF FF FF FF FF 00 05 

そのため、ペアリングは間違いなく正常に行われ、キーが押されます。デバイスは、syslogごとに入力デバイスとして認識されます。

Bluetooth: HIDP (Human Interface Emulation) ver 1.2
Bluetooth: HIDP socket layer initialized
input: Bluetooth HID Boot Protocol Device as /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/bluetooth/hci0/hci0:11/input14

しかし、デバイスでevtestを実行すると、これしか得られません。

root@server:/dev/input# evtest /dev/input/event6 
Input driver version is 1.0.1
Input device ID: bus 0x5 vendor 0x46d product 0xc129 version 0x0
Input device name: "Bluetooth HID Boot Protocol Device"
Supported events:
  Event type 0 (EV_SYN)
Properties:
Testing ... (interrupt to exit)

このリモートにはイベントタイプが1つしかなく、キーを押してもトリガーされないようです。以下の私のドングルのlsusbからの追加出力[1]。私の質問:

  1. Btusbは使用に適したカーネルモジュールですか?
  2. モジュールがドングルを認識するためにechoコマンドを使用する必要があるのはなぜですか?
  3. 入力レイヤーが追加のイベントタイプを認識するために必要な追加の構成はありますか?

[1] Bluetoothドングルのlsusb出力: http://Pastebin.com/xHM5YZXB

4
Kevin Schmidt

これはすでに修正されているかもしれませんが、念のために、カーネル3.12.6のArch Linuxで動作させるために使用したカーネルパッチを次に示します。

diff -u linux-3.12.org/drivers/hid/hid-core.c linux-3.12/drivers/hid/hid-core.c
--- linux-3.12.org/drivers/hid/hid-core.c       2013-11-03 16:41:51.000000000 -0700
+++ linux-3.12/drivers/hid/hid-core.c   2014-01-10 19:53:45.000000000 -0700
@@ -1738,6 +1738,7 @@
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3) },
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_SMART_PS3) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_DESKTOP) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_Edge) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI) },
@@ -2347,7 +2348,8 @@
                        return true;
                break;
        case USB_VENDOR_ID_LOGITECH:
-               if (hdev->product >= USB_DEVICE_ID_LOGITECH_HARMONY_FIRST &&
+               if (hdev->product != USB_DEVICE_ID_LOGITECH_HARMONY_SMART_PS3 &&
+                   hdev->product >= USB_DEVICE_ID_LOGITECH_HARMONY_FIRST &&
                                hdev->product <= USB_DEVICE_ID_LOGITECH_HARMONY_LAST)
                        return true;
                /*
diff -u linux-3.12.org/drivers/hid/hid-ids.h linux-3.12/drivers/hid/hid-ids.h
--- linux-3.12.org/drivers/hid/hid-ids.h        2013-11-03 16:41:51.000000000 -0700
+++ linux-3.12/drivers/hid/hid-ids.h    2014-01-10 19:47:39.000000000 -0700
@@ -542,6 +542,7 @@
 #define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST  0xc110
 #define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f
 #define USB_DEVICE_ID_LOGITECH_HARMONY_PS3 0x0306
+#define USB_DEVICE_ID_LOGITECH_HARMONY_SMART_PS3 0xc129
 #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD_CORD  0xc20a
 #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD       0xc211
 #define USB_DEVICE_ID_LOGITECH_EXTREME_3D      0xc215
diff -u linux-3.12.org/drivers/hid/hid-sony.c linux-3.12/drivers/hid/hid-sony.c
--- linux-3.12.org/drivers/hid/hid-sony.c       2013-11-03 16:41:51.000000000 -0700
+++ linux-3.12/drivers/hid/hid-sony.c   2014-01-10 19:47:39.000000000 -0700
@@ -709,6 +709,9 @@
        /* Logitech Harmony Adapter for PS3 */
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
                .driver_data = PS3REMOTE },
+       /* Logitech Harmony Smart Control for PS3 */
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_SMART_PS3),
+               .driver_data = PS3REMOTE },
        { }
 };
 MODULE_DEVICE_TABLE(hid, sony_devices);

キーマッピングは素晴らしいものではありません-次にそれを検討しています!

1