J'ai une multi-télécommande USB eDIO (un récepteur infrarouge) fourni avec la télécommande de navigation Web ASUS PSR 2000.
J'essaie de connecter le Remote COntroller à mon pi pour qu'il reçoive les frappes envoyées par la télécommande.
Le contrôleur est détecté en tant que périphérique HID. Voici les détails de la commande 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
Je peux également voir le périphérique cible dans le dossier de développement avec un événement créé
pi@raspberrypi /dev/input/by-id $ dir
usb-Cypress_Semiconductor_eDio_USB_Multi_Remote_Controlle-event-if00
Le gestionnaire d'événements qui lui est associé est le suivant, comme le montre la commande suivante.
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
Le problème est lorsque j'essaie de lire la sortie du gestionnaire d'événements créé pour le périphérique. La première frappe est enregistrée mais les touches suivantes ne sont pas affichées par la commande CAT.
pi@raspberrypi /dev/input $ cat event0 | xxd
0000000: e007 9450 9476 0900 0000 0000 0000 0000 ...P.v..........
Veuillez me suggérer ce que je peux faire pour que l'appareil fonctionne. Appuyer sur n'importe quelle touche après la première frappe ne renvoie rien sauf si l'appareil est rebranché.
Veuillez suggérer ce qui doit être fait pour résoudre le problème.
|xxd
? Il met en mémoire tampon la sortie. J'ai utilisé àirw
partir du packagelirc
pour obtenir les codes clés envoyés par ma télécommande.Réponses:
Le problème semble être les descripteurs USB incomplets:
Le descripteur qui pourrait être lu dit que c'est une souris.
Et qu'il y aurait un descripteur de 20 octets qui décrit le format des données:
Mais celui-là manque.
Il y a un problème étrange avec votre combinaison spécifique de matériel et de logiciel ou le programmeur était paresseux et n'a pas implémenté le descripteur de rapport, car son propre pilote n'en a probablement pas besoin. Mais très probablement, le pilote qui crée le périphérique d'entrée est confus.
Vous pouvez essayer d'utiliser libusb pour lire les 4 octets du point de terminaison. Peut-être que le sondage fonctionne. Ou jetez un œil à la communication USB lorsque vous utilisez l'appareil avec le pilote d'origine. Et oui, c'est très délicat si vous n'avez pas l'un des enregistreurs USB coûteux qui traîne. Mais le noyau Linux prend en charge la journalisation USB des logiciels et certains enregistreurs de logiciels pour Windows sont disponibles.
la source
Enfin, j'ai eu le temps d'écrire ma propre implémentation en utilisant la bibliothèque PyUSB qui est un wrapper pour Libusb.
Je publie le code ici. Peut aider quelqu'un.
J'ai un autre morceau de code qui crée le fichier de configuration qui est utilisé ici. Je n'ai pas mappé toutes les clés distantes car je n'ai pas besoin de toutes.
la source