浅析windows下hid.lib库驱动IN,OUT数据组成和linux下移植注意事项
使用hid.lib与hid设备进行通信时,在每次发送数据之前都要在头部添加内容为0的1个字节数据report_id报告id,
对于output report该数据供hid.lib解析,hid.lib库驱动会将该1个字节的report_id报告id数据添加到usb_control_msg
发送的value低8位中cpu_to_le16(((report->type + 1) << 8) | report->id);即:0x200,并不会将第1个字节
report_id报告id数据作为实际待发数据,实际数据从第2个字节开始,interrupt in接收也一样,从hid物理设备接收到的数据,
hid.lib库驱动先提取report_id报告id,然后打到in数据的最开始头部,发送给调用ReadFile的vc程序,
在interrupt in输入接收到的raw数据前面hid.lib驱动会自动追加内容为0的1个字节数据report_id报告id,
使用usb hound截获到的数据有如下规律[luther.gliethttp].
20.0表示CTL或者OUT输出,实际发送给hid物理设备的数据log
20.1表示IN输入,实际从hid物理设备读取到的数据log
22和18表示hid.lib库驱动OUT和IN数据,所以上面加上小数点的log才是与hid物理设备进行的raw数据[luther.gliethttp].
所以linux下使用libusb进行移植时,需要注意libusb实现IN,OUT数据传输时,参考的是
带有小数点的log数据,比如20.0和20.1,而不是参考22和18等hid.lib库驱动添加了第1个字节数据的report_id报告id的log[luther.gliethttp].
使用hid.lib与hid设备进行通信时,usb hound抓获的部分log数据如下:[luther.gliethttp]
20.0 CTL 21 09 00 02 00 00 08 00 SET REPORT 1.1.0
20.0 DO 51 47 53 0d 2a e0 0f 19 QGS.*... 1.2.0
22 DO 00 51 47 53 0d 2a e0 0f 19