Como tornar um dispositivo USB registrado como HID?

0

Eu tenho um dispositivo de hardware com o qual eu gostaria de me comunicar em C através da biblioteca HID. Mas este dispositivo não aparece como HID. Existe uma maneira de fazer isso (com uma regra do udev talvez)?

$ dmesg
usb 1-2: new full-speed USB device number 7 using xhci_hcd
usb 1-2: New USB device found, idVendor=104d, idProduct=3001
usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-2: Product: ESP301 Motion Control 
usb 1-2: Manufacturer: NEWPORT Corp.    
usb 1-2: SerialNumber: 0000000000000000

$ lsusb -v
Bus 001 Device 007: ID 104d:3001 Newport Corporation 
Device Descriptor:
bLength                18
bDescriptorType         1
bcdUSB               1.10
bDeviceClass          255 Vendor Specific Class
bDeviceSubClass         0 
bDeviceProtocol         0 
bMaxPacketSize0         8
idVendor           0x104d Newport Corporation
idProduct          0x3001 
bcdDevice            1.01
iManufacturer           1 NEWPORT Corp.    
iProduct                2 ESP301 Motion Control 
iSerial                 3 0000000000000000
bNumConfigurations      1
Configuration Descriptor:
 bLength                 9
 bDescriptorType         2
 wTotalLength           39
 bNumInterfaces          1
 bConfigurationValue     2
 iConfiguration          0 
 bmAttributes         0xa0
 (Bus Powered)
 Remote Wakeup
 MaxPower              100mA
 Interface Descriptor:
 bLength                 9
 bDescriptorType         4
 bInterfaceNumber        0
 bAlternateSetting       0
 bNumEndpoints           3
 bInterfaceClass       255 Vendor Specific Class
 bInterfaceSubClass      0 
 bInterfaceProtocol      0 
 iInterface              0 
 Endpoint Descriptor:
  bLength                 7
  bDescriptorType         5
  bEndpointAddress     0x81  EP 1 IN
  bmAttributes            2
  Transfer Type            Bulk
  Synch Type               None
  Usage Type               Data
  wMaxPacketSize     0x0040  1x 64 bytes
  bInterval               0
 Endpoint Descriptor:
  bLength                 7
  bDescriptorType         5
  bEndpointAddress     0x01  EP 1 OUT
  bmAttributes            2
  Transfer Type            Bulk
  Synch Type               None
  Usage Type               Data
  wMaxPacketSize     0x0040  1x 64 bytes
  bInterval               0
 Endpoint Descriptor:
  bLength                 7
  bDescriptorType         5
  bEndpointAddress     0x83  EP 3 IN
  bmAttributes            3
  Transfer Type            Interrupt
  Synch Type               None
  Usage Type               Data
  wMaxPacketSize     0x0002  1x 2 bytes
  bInterval               1
Device Status:     0x0001
Self Powered
    
por dargaud 28.11.2018 / 15:26

1 resposta

1

O próprio HID não é realmente um tipo de dispositivo, mas um protocolo padrão para interagir com uma ampla variedade de tipos de dispositivos (e não depende nem mesmo de USB; ele também é usado por meio de Bluetooth, I2C e possivelmente outras comunicações de nível inferior protocolos). O dispositivo em si tem que suportar o protocolo, caso contrário, não vai entender o que seu software está dizendo.

No seu caso, o dispositivo em questão apresenta um endpoint único, identificando-se como uma classe específica de fornecedor (VSC), que é uma maneira elegante de dizer que os projetistas achavam que ele não se encaixava em nenhum outro tipo de dispositivo USB padrão. Alguns desses dispositivos podem ter comandos especiais que podem ser enviados a eles para alterná-los para um modo diferente, que pode incluir um comando para alterná-lo para o modo HID e deve ser coberto na documentação do dispositivo.

Realisticamente, você poderia facilmente usar a libusb para falar diretamente com o dispositivo usando o que é normal, e pular a sobrecarga da HID.

    
por 28.11.2018 / 21:14

Tags