Eu tenho um controlador remoto múltiplo eDIO USB (um receptor infravermelho) que acompanha o controle remoto ASUS PSR 2000 Web Surfing.
Estou tentando conectar o controlador remoto ao pi, para que ele receba as teclas enviadas pelo controle remoto.
O controlador é detectado como um dispositivo HID. Aqui estão os detalhes do comando 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
Também posso ver o dispositivo de destino na pasta dev com um evento criado
pi@raspberrypi /dev/input/by-id $ dir
usb-Cypress_Semiconductor_eDio_USB_Multi_Remote_Controlle-event-if00
O manipulador de eventos associado a ele é o seguinte, conforme visto no comando a seguir.
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
O problema é quando estou tentando ler a saída do manipulador de eventos criado para o dispositivo. O primeiro pressionamento de tecla é registrado, mas os pressionamentos de teclas subsequentes não são exibidos pelo comando CAT.
pi@raspberrypi /dev/input $ cat event0 | xxd
0000000: e007 9450 9476 0900 0000 0000 0000 0000 ...P.v..........
Sugira-me o que posso fazer para que o dispositivo funcione. Pressionar qualquer tecla após o primeiro pressionamento de tecla não retorna nada, a menos que o dispositivo seja reconectado.
Sugira o que precisa ser feito para corrigir o problema.
|xxd
? Ele armazena em buffer a saída. Eu useiirw
do pacotelirc
para obter os códigos de chave enviados pelo meu controle remoto.Respostas:
O problema parece ser o descritor de USB incompleto:
O descritor que pode ser lido diz que este é um mouse.
E que haveria um descritor de 20 bytes que descreva o formato dos dados:
Mas esse está faltando.
Existe um problema estranho com sua combinação específica de hardware e software ou o programador foi preguiçoso e não implementou o descritor de relatórios, pois seu próprio driver provavelmente não precisa dele. Mas provavelmente isso confundiu o driver que cria o dispositivo de entrada.
Você pode tentar usar o libusb para ler os 4 bytes do nó de extremidade. Talvez a votação funcione. Ou dê uma olhada na comunicação USB ao usar o dispositivo com o driver original. E sim, isso é muito complicado se você não tiver um dos caras USB Loggers por aí. Mas o Kernel do Linux tem suporte para Software USB Logging e existem alguns softwares Loggers para Windows disponíveis.
fonte
Finalmente, tive tempo de escrever minha própria implementação usando a biblioteca PyUSB, que é um invólucro para o Libusb.
Estou postando o código aqui.Pode ajudar alguém.
Eu tenho outro pedaço de código que cria o arquivo de configuração usado aqui. Não mapeei todas as chaves remotas, pois não preciso de todas.
fonte