web-dev-qa-db-fra.com

La télécommande bluetooth ps3 connectée en tant que périphérique d'entrée Linux n'a qu'un seul type d'événement sur 13.10

J'essaie de configurer ma télécommande Harmony Smart Control en tant que télécommande Bluetooth PS3 (cette télécommande est supposée l'être) sous Ubuntu 13.10 (le dernier noyau et les mises à jour installées). Mon dongle Bluetooth ne fonctionnait pas, alors je devais faire ce qui suit:

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

Après cela, je peux coupler l'amende distante à l'aide de Bluetooth Manager à partir de l'interface graphique. Cela ressemble à une télécommande PS3 normale, selon bt-device:

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]

Je peux voir des paquets venant de bluetooth pour chaque pression sur une touche comme celle-ci:

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 

Le couplage est donc correct et les appuis sont reçus. Le périphérique est reconnu en tant que périphérique d'entrée par 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

Mais lorsque je fais un test sur l'appareil, je ne reçois que ceci:

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)

Il me semble qu'il n'y a qu'un seul type d'événement pour cette télécommande et qu'aucune pression sur une touche ne la déclenche. Sortie supplémentaire de lsusb pour mon dongle en dessous de [1]. Mes questions:

  1. Est-ce que btusb est le bon module de noyau à utiliser?
  2. Pourquoi dois-je utiliser la commande echo pour que mon dongle soit reconnu par le module?
  3. Y a-t-il une configuration supplémentaire dont j'ai besoin pour que la couche d'entrée reconnaisse les types d'événements supplémentaires?

[1] Sortie lsusb pour clé Bluetooth: http://Pastebin.com/xHM5YZXB

4
Kevin Schmidt

Vous avez peut-être déjà corrigé cela, mais juste au cas où, voici le correctif de noyau que j'ai utilisé pour le faire fonctionner sous Arch Linux avec le noyau 3.12.6:

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);

La cartographie des clés n'est pas géniale - j'examine la prochaine!

1
Joel McKee Cooper