ps3 remoto Bluetooth conectado como dispositivo de entrada linux tem apenas um tipo de evento em 13.10

4

Estou tentando configurar meu Harmony Smart Control como um controle remoto Bluetooth PS3 (ele finge ser este remoto) no Ubuntu 13.10 (o kernel e as atualizações mais recentes instalados). O meu dongle bluetooth não funcionava de imediato, por isso tive de fazer o seguinte:

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

Depois disso, posso emparelhar o controle remoto usando o Gerenciador de Bluetooth da GUI. Está registrado parecendo um controle normal do PS3, de acordo com o 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]

Eu vejo pacotes vindos do bluetooth para cada tecla pressionada assim:

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 

Assim, o emparelhamento é definitivamente ok e as teclas pressionadas são recebidas. O dispositivo é reconhecido como um dispositivo de entrada por 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

Mas quando eu faço um evtest no dispositivo, eu só entendo isso:

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)

Parece-me que existe apenas um tipo de evento para este controle remoto e nenhuma tecla pressionada o aciona. Saída adicional do lsusb para meu dongle abaixo [1]. Minhas perguntas:

  1. O btusb é o módulo do kernel correto para usar?
  2. Por que preciso usar o comando echo para que meu dongle seja reconhecido pelo módulo?
  3. Existe uma configuração adicional necessária para a camada de entrada para reconhecer os tipos de eventos adicionais?

[1] Saída lsusb para dongle bluetooth: link

    
por Kevin Schmidt 22.11.2013 / 22:18

1 resposta

1

Você pode já ter corrigido isso, mas apenas no caso, aqui está o patch do kernel que eu usei para fazê-lo funcionar no Arch Linux com o kernel 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);

O mapeamento de chaves não é ótimo - estou analisando isso em seguida!

    
por Joel McKee Cooper 11.01.2014 / 07:08