USB从设备获取数据

时间:2012-02-29 19:06:32

标签: c usb libusb

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

  1. 我如何Set IdleGet Input ReportSet Feature ReportSet Output Report
  2. 为什么usb_bulk_read会失败?
  3. 我需要做什么才能与我的设备建立通信?

2 个答案:

答案 0 :(得分:3)

  

HID设备[...]   usb_bulk_read

哎哟。 USB批量读取仅用于批量端点,而HID没有。

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

答案 1 :(得分:3)

我是libusb和USB的新手,所以我不确定这是否是正确的,但是在查看USB嗅探器(如USBlyzer)的输出并进行调整之后我提出了以下协议项目:

usb_claim_interface

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

SetReport / GetReport

USBlyzer显示Get DescriptorSelect ConfigurationSet ReportGet Report的相关数据包。 Get DescriptorSelect 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 IdOutput 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的各种功能所发生的事情的深入了解。但这可以让我的主机从设备中捕获所有相关数据。