Estou tentando me comunicar com um dispositivo USB que é um controlador a laser. Existe um controlador Windows para este dispositivo que tanto escreve (liga ou desliga o laser) quanto lê (obtém o status do laser, ligado ou desligado). Agora eu quero replicar isso em uma máquina Linux usando Python. Consegui ler com sucesso no dispositivo, mas por algum motivo não consigo escrever nele (consulte esta pergunta SO para obter mais detalhes).
Não tenho muita experiência em comunicação USB, mas vi em algum lugar que o IN
endpoint é para leitura e o OUT
endpoint é para gravação, e notei que, quando faço lsusb -v -d <my_device>
, recebo um IN
endpoint, mas não há OUT
endpoint, então isso pode seja a razão do meu problema. Parece um "dispositivo somente leitura" (posso estar errado).
Minha pergunta agora é: É possível que no Linux eu não consiga ver o OUT
endpoint devido a algum driver ausente ou alguma configuração?
Esta é a saída de lsusb -v -d <my_device>
:
Bus 002 Device 010: ID c251:2201 Keil Software, Inc. LASER Driver IJS
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0xc251 Keil Software, Inc.
idProduct 0x2201
bcdDevice 1.00
iManufacturer 1 LASER Driver
iProduct 2 LASER Driver IJS
iSerial 3 0001A0000000
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0022
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 4 HID
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.00
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 33
Report Descriptor: (length is 33)
Item(Global): Usage Page, data= [ 0x00 0xff ] 65280
(null)
Item(Local ): Usage, data= [ 0x01 ] 1
(null)
Item(Main ): Collection, data= [ 0x01 ] 1
Application
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Report Count, data= [ 0x40 ] 64
Item(Local ): Usage, data= [ 0x10 ] 16
(null)
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Report Count, data= [ 0x40 ] 64
Item(Local ): Usage, data= [ 0x10 ] 16
(null)
Item(Main ): Output, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Report Count, data= [ 0x01 ] 1
Item(Local ): Usage, data= [ 0x01 ] 1
(null)
Item(Main ): Feature, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Main ): End Collection, data=none
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
can't get device qualifier: Resource temporarily unavailable
can't get debug descriptor: Resource temporarily unavailable
Device Status: 0x0001
Self Powered
Cada dispositivo USB aceitará comandos de controle no endpoint padrão, ou seja, endpoint #0. Este também é um requisito básico para configurar o barramento USB, portanto, isso não precisa ser mencionado nos descritores de endpoint, pois o endpoint #0 deve sempre existir. O endpoint padrão também é bidirecional, portanto, uma única transferência de controle pode incluir um comando do computador para o dispositivo e a resposta do dispositivo.
É bastante provável que seu controlador a laser use o ponto final #0 para comandos do computador para o controlador a laser. O ponto final #1 é um ponto final de interrupção , portanto, provavelmente está sendo usado pelo controlador para relatar quaisquer alterações no status do laser ou condições de erro que devem ser respondidas em tempo hábil (por exemplo, "o laser está superaquecendo").
A interface USB do controlador a laser usa a classe de interface HID, porque a especificação da classe HID inclui recursos para controles diversos e específicos do fornecedor.
O descritor de interface do dispositivo tem
bNumEndpoints
como1
, portanto, confirma que deve haver apenas um endpoint além do endpoint de controle sempre presente #0, e você não está perdendo nada.