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程序控制小工具,但我想更多地了解它是如何工作的。上面代码中添加的注释是搜索和阅读时间的结果,但仍有很多空白需要填写:-)
希望这个问题对于Stackoverflow来说不是太模糊: - )
有问题的小工具: http://www.delcomproducts.com/productdetails.asp?PartNumber=904402
答案 0 :(得分:2)
bmRequestType
是more 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
是一个数组。