Mam wielofunkcyjny kontroler USB eDIO (odbiornik podczerwieni), który został dostarczony z pilotem do surfingu w sieci ASUS PSR 2000.
Próbuję podłączyć Zdalny kontroler do mojego pi, aby odbierał naciśnięcia klawiszy wysyłane przez pilota.
Kontroler jest wykrywany jako urządzenie HID. Oto szczegóły komendy 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
Mogę również wyświetlić urządzenie docelowe w folderze deweloperskim z utworzonym zdarzeniem
pi@raspberrypi /dev/input/by-id $ dir
usb-Cypress_Semiconductor_eDio_USB_Multi_Remote_Controlle-event-if00
Powiązana z nim procedura obsługi zdarzeń wygląda następująco:
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
Problem polega na tym, że próbuję odczytać dane wyjściowe z procedury obsługi zdarzeń utworzonej dla urządzenia. Pierwsze naciśnięcie klawisza jest zarejestrowane, ale kolejne naciśnięcia klawiszy nie są wyświetlane przez polecenie CAT.
pi@raspberrypi /dev/input $ cat event0 | xxd
0000000: e007 9450 9476 0900 0000 0000 0000 0000 ...P.v..........
Proszę zasugerować mi, co mogę zrobić, aby urządzenie działało. Naciśnięcie dowolnego klawisza po pierwszym naciśnięciu klawisza nie zwróci niczego, chyba że urządzenie zostanie ponownie podłączone.
Proszę zasugerować, co należy zrobić, aby rozwiązać problem.
|xxd
? Buforuje dane wyjściowe. Użyłemirw
z paczki,lirc
aby uzyskać kody dostępu wysłane przez mojego pilota.Odpowiedzi:
Problemem wydają się niekompletne opisy USB:
Deskryptor, który można odczytać, mówi, że to Mysz.
I że będzie deskryptor 20 bajtów, który opisuje format danych:
Ale tego brakuje.
Występuje albo dziwny problem z konkretną kombinacją sprzętu i oprogramowania, albo programista był leniwy i nie wdrożył deskryptora raportu, ponieważ ich własny sterownik prawdopodobnie go nie potrzebuje. Ale najprawdopodobniej wprowadzono w błąd sterownik, który tworzy urządzenie wejściowe.
Możesz spróbować użyć libusb do odczytania 4 bajtów z punktu końcowego. Być może odpytywanie działa. Lub spójrz na komunikację USB, gdy używasz urządzenia z oryginalnym sterownikiem. I tak, jest to bardzo trudne, jeśli nie masz przy sobie jednego z drogich rejestratorów USB. Ale jądro Linuksa obsługuje programowe rejestrowanie USB i dostępne są niektóre rejestratory oprogramowania dla systemu Windows.
źródło
Wreszcie miałem czas na napisanie własnej implementacji przy użyciu biblioteki PyUSB, która jest opakowaniem dla Libusb.
Publikuję kod tutaj, może komuś pomóc.
Mam inny fragment kodu, który tworzy plik konfiguracyjny, który jest tutaj używany. Nie zmapowałem wszystkich kluczy zdalnych, ponieważ nie potrzebuję ich wszystkich.
źródło