通过USB与“USB HID红色可视指示器”交互时,wValue会扮演什么角色?

时间:2014-10-12 18:50:21

标签: c libusb

unsigned char command = strcmp("on", argv[1]) == 0 ? 0x02 : 0x00;

// From Delcom documentation
unsigned char buffer[] = { 
    0x65, // 8 byte packet size
    0x0C, // Command type
    command, // DataLSB - Command parameter
    0xFF, // DataMSB - Command parameter
    0x00, // HID, first byte
    0x00, // HID, second byte
    0x00, // HID, third byte
    0x00  // HID, fourth byte
};

libusb_control_transfer (
    devh,
    0x21, // bmRequestType (host to device)
    0x09, // bRequest (set configuration)
    0x0635, // wValue (configuration value)
    0x000, // wIndex
    buffer, // Data / message
    sizeof(buffer), // wLength, Number of bytes to be sent
    0 // Timeout
);

我已经购买了Delcom USB控制灯以连接到我们的构建服务器,但事实证明Delcom提供的C示例不再在Ubuntu 14.04上编译,所以我认为这将是一个很好的机会学习一点C以及关于USB如何工作的一点。

在找到类似Delcom设备的Ruby实现后,我能够通过我的C程序控制小工具,但我想更多地了解它是如何工作的。上面代码中添加的注释是搜索和阅读时间的结果,但仍有很多空白需要填写:-)

  1. wValue(0x0635)扮演什么角色?它是标准化配置(bRequest / SET_CONFIGURATION参数)吗?
  2. wIndex(0x000) - 是否意味着应该从头开始读取数据?为什么需要这个?
  3. 为什么需要像wLength这样的论点? '
  4. 我是否在评论中做出了其他不正确的假设?
  5. 希望这个问题对于Stackoverflow来说不是太模糊: - )

    有问题的小工具: http://www.delcomproducts.com/productdetails.asp?PartNumber=904402

1 个答案:

答案 0 :(得分:2)

bmRequestTypemore than the direction of the transfer。 它还指示请求的类型,此处为Class请求,以及收件人,此处为接口。

当收件人是接口时,wIndex表示接口号。 USB设备可以有多个不同类别的接口。

bRequest = 0x09表示SET_CONFIGURATION,如果它是标准设备请求。

对于HID类请求,bRequest = 0x09表示SET_REPORT请求(请参阅HID document, section 7.2,其余部分有关HID报告的更多信息)。

如何解释wValue取决于请求。对于SET_REPORT请求,它表示高字节中的报告类型和低字节中的报告ID。

报告类型为0x01 =输入,0x02 =输出,0x03 =功能,0x04-FF =保留。所以在你的情况下,我猜它是特定于这个设备。

数据是"报告"。

可以在standard HID usage tables中定义哪些报告包含,就像标准键盘,鼠标一样......但它并非必须如此。

对于作为参数传递的长度,这与许多C函数中的相同:数据参数是unsigned char *,指针,如果你不知道,那么大小是不可知的交上来。您可以使用sizeof,因为您的buffer是一个数组。