0

I have a hardware device which I'd like to communicate with in C via the HID library. But this device does not show up as HID. Is there a way to make it so (with a udev rule maybe) ?

$ 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
1

HID itself is not really a device type, but a standard protocol for interacting with a wide variety of device types (and isn't even dependent on USB, it's also used over Bluetooth, I2C, and potentially other lower-level communications protocols). The device itself has to support the protocol though, otherwise it won't understand what your software is saying to it.

In your case, the device in question presents a single endpoint identifying as a vendor specific class (VSC), which is a fancy way of saying that the designers thought it didn't fit any of the other standard USB device types. Some such devices may have special commands that can be sent to them to switch them to a different mode, which may include a command for switching it into HID mode, and should be covered in the documentation for the device.

Realistically though, you could just as easily use libusb to talk directly to the device using whatever it's normal command set is, and skip the overhead of HID.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.