Ich habe eine eDIO USB Multi-Fernbedienung (einen Infrarotempfänger), die mit der ASUS PSR 2000 Web Surfing-Fernbedienung geliefert wurde.
Ich versuche, den Remote COntroller mit meinem Pi zu verbinden, damit er die von der Fernbedienung gesendeten Tastenanschläge empfängt.
Der Controller wird als HID-Gerät erkannt. Hier sind die Details aus dem Befehl lsusb -v
Bus 001 Device 007: ID 147a:e001 Formosa Industrial Computing, Inc.
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x147a Formosa Industrial Computing, Inc.
idProduct 0xe001
bcdDevice 1.22
iManufacturer 1
iProduct 2
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 34
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 4
bmAttributes 0xa0
(Bus Powered)
Remote Wakeup
MaxPower 300mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 2 Mouse
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 20
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0004 1x 4 bytes
bInterval 10
Ich kann das Zielgerät auch im dev-Ordner mit einem erstellten Ereignis anzeigen
pi@raspberrypi /dev/input/by-id $ dir
usb-Cypress_Semiconductor_eDio_USB_Multi_Remote_Controlle-event-if00
Der damit verbundene Ereignishandler lautet wie folgt, wie aus dem folgenden Befehl ersichtlich.
pi@raspberrypi /proc/bus/input $ cat devices
I: Bus=0003 Vendor=147a Product=e001 Version=0110
N: Name="Cypress Semiconductor eDio USB Multi Remote Controlle"
P: Phys=usb-bcm2708_usb-1.2/input0
S: Sysfs=/devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2:1.0/input/input2
U: Uniq=
H: Handlers=event0
B: PROP=0
B: EV=1
Das Problem ist, wenn ich versuche, die Ausgabe des für das Gerät erstellten Ereignishandlers zu lesen. Der erste Tastendruck wird registriert, aber die nachfolgenden Tastenanschläge werden vom CAT-Befehl nicht angezeigt.
pi@raspberrypi /dev/input $ cat event0 | xxd
0000000: e007 9450 9476 0900 0000 0000 0000 0000 ...P.v..........
Bitte schlagen Sie mir vor, was ich tun kann, um das Gerät zum Laufen zu bringen. Durch Drücken einer beliebigen Taste nach dem ersten Tastendruck wird nichts zurückgegeben, es sei denn, das Gerät ist neu angeschlossen.
Bitte schlagen Sie vor, was getan werden muss, um das Problem zu beheben.
|xxd
? Es puffert die Ausgabe. Ich habeirw
aus dem Paket verwendetlirc
, um die von meiner Fernbedienung gesendeten Schlüsselcodes zu erhalten.Antworten:
Das Problem scheinen die unvollständigen USB-Deskriptoren zu sein:
Der Deskriptor, der gelesen werden könnte, sagt, dass dies eine Maus ist.
Und dass es einen Deskriptor von 20 Bytes geben würde, der das Datenformat beschreibt:
Aber dieser fehlt.
Es gibt entweder ein seltsames Problem mit Ihrer spezifischen Kombination aus Hardware und Software oder der Programmierer war faul und hat den Berichtsdeskriptor nicht implementiert, da sein eigener Treiber ihn wahrscheinlich nicht benötigt. Aber höchstwahrscheinlich hat das den Treiber, der das Eingabegerät erstellt, verwirrt.
Sie können versuchen, mit libusb die 4 Bytes vom Endpunkt zu lesen. Vielleicht funktioniert das Polling. Oder sehen Sie sich die USB-Kommunikation an, wenn Sie das Gerät mit dem Originaltreiber verwenden. Und ja, das ist sehr schwierig, wenn Sie nicht zufällig einen der teuren USB-Logger herumliegen haben. Der Linux-Kernel unterstützt jedoch die Software-USB-Protokollierung, und es sind einige Software-Logger für Windows verfügbar.
quelle
Endlich hatte ich Zeit, meine eigene Implementierung mit der PyUSB-Bibliothek zu schreiben, die ein Wrapper für Libusb ist.
Ich poste den Code hier. Könnte jemandem helfen.
Ich habe einen weiteren Code, der die hier verwendete Konfigurationsdatei erstellt. Ich habe nicht alle Remote-Schlüssel zugeordnet, da ich nicht alle benötige.
quelle