我正在尝试从HID设备读取数据。我有一个USB嗅探器捕获基本上做:
Get Device Descriptor
Get Device Descriptor
Set Address
Get Configuration Descriptor
Get Configuration Descriptor
Set Configuration
Set Idle
Get Input Report
Get Input Report
Get Input Report
Get Input Report
Set Feature Report
Get Input Report
Set Feature Report
Get Input Report
Get Input Report
Set Output Report
Get Input Report
Set Feature Report
Input Report
Input Report
似乎Input Report
之前的所有内容都已设置,而Input Report
是来自设备的常规数据收集。
在libusb中,我正在执行以下操作:
usb_init();
usb_find_busses();
usb_find_devices();
loop through busses
loop through devices
if correct vendor and correct product
handle = usb_open(device)
break
usb_set_configuration(dev_handle, 1)
// Endpoint 0 is a 'write endpoint', endpoint 1 is a 'read endpoint'.
endpoint = &device->config[0].interface[0].altsetting[0].endpoint[1]
usb_claim_interface(dev_handle, 0)
usb_set_altinterface(dev_handle, 0)
usb_bulk_read(dev_handle, endpoint->bEndpointAddress, buffer, endpoint->wMaxPacketSize, 1);
我猜测驱动程序和usb_set_configuration
之前的代码与嗅探器分析一致Set Configuration
。
代码中的所有内容都会成功,直到usb_bulk_read
失败。
Set Idle
,Get Input Report
,Set Feature Report
,Set Output Report
?usb_bulk_read
会失败?答案 0 :(得分:3)
HID设备[...] usb_bulk_read
哎哟。 USB批量读取仅用于批量端点,而HID没有。
HID端点是中断端点,因此需要usb_interrupt_transfer()
。你做了查看端点描述符,不是吗?它应该将端点类型声明为中断。
答案 1 :(得分:3)
我是libusb和USB的新手,所以我不确定这是否是正确的,但是在查看USB嗅探器(如USBlyzer)的输出并进行调整之后我提出了以下协议项目:
当我声明一个界面(usb_claim_interface
)然后取消了我的应用程序时,我在后续运行中处于无法运行的状态。我尝试了各种重置(usb_reset
和usb_resetep
),但我仍无法正确使用usb_control_msg
。
USBlyzer
显示Get Descriptor
,Select Configuration
,Set Report
和Get Report
的相关数据包。 Get Descriptor
和Select Configuration
分别与usb_get_descriptor
和usb_set_configuration
明确相关。
一些Get Report
个数据包包含Feature Id
和其他Input Id
。我可以使用以下参数将这些与usb_control_msg
匹配,(libusb.c帮助
我想出来了):
requesttype = USB_ENDPOINT_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE
value = 0x01 (for GetReport)
index = id | (0x03 << 8) (for FeatureId)
Set Report
个数据包也使用Feature Id
但Output Id
。从查看细节可以清楚地看出Input Id
匹配(0x01&lt;&lt; 8)和Output Id
匹配(0x02&lt;&lt; 8)。所以为了得到Set Report
,我使用这些经过调整的参数调用了usb_control_msg
:
requesttype = USB_ENDPOINT_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE
value = 0x09 (for SetReport)
index = id | (0x03 << 8) (for FeatureId)
这可能不是完成所有这些的“正确”方式,我当然感谢对API的各种功能所发生的事情的深入了解。但这可以让我的主机从设备中捕获所有相关数据。