4

我正在尝试从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_readwhich 失败。

  1. 我怎么Set Idle,,,,?Get Input Report_Set Feature ReportSet Output Report
  2. 为什么会usb_bulk_read失败?
  3. 我还需要做什么才能与我的设备建立通信?
4

2 回答 2

3

一般来说,我是libusb 和USB的新手,所以我不确定这是否正确,但是在查看了 USB 嗅探器(如USBlyzer )的输出并调整了几件事后,我想出了以下协议项:

usb_claim_interface

当我声明一个接口 ( usb_claim_interface) 然后取消我的应用程序时,我在随后的运行中处于不可操作状态。我尝试了各种重置(usb_resetusb_resetep),但仍然无法正确使用usb_control_msg.

设置报告/获取报告

USBlyzer显示了相关数据包,其中Get DescriptorSelect ConfigurationSet ReportGet Report. Get Descriptor并且分别与和Select Configuration明显相关。usb_get_descriptorusb_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 << 8) 和Output Id匹配 (0x02 << 8)。所以要让Set Reportusb_control_msg用这些调整后的参数调用:

requesttype = USB_ENDPOINT_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE
value = 0x09 (for SetReport)
index = id | (0x03 << 8) (for FeatureId)

这可能不是做这一切的“正确”方式,我当然希望能更深入地了解API的各种功能正在发生的事情。但这能够让我的主机从设备中捕获所有相关数据。

于 2012-03-02T21:19:18.313 回答
3

HID 设备 [...] usb_bulk_read

哎哟。USB Bulk 读取仅用于 Bulk 端点,HID 没有。

HID 端点是中断端点,因此需要usb_interrupt_transfer(). 您确实查看了端点描述符,不是吗?它应该将端点类型声明为中断。

于 2012-03-02T04:22:46.573 回答