【问题标题】:USB getting data from a deviceUSB 从设备获取数据
【发布时间】:2012-03-19 07:00:43
【问题描述】:

我正在尝试从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. 我还需要做什么才能与我的设备建立通信?

【问题讨论】:

  • 你是用哪个usb-sniffer得到上述报告的?

标签: c usb libusb


【解决方案1】:

HID 设备 [...] usb_bulk_read

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

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

【讨论】:

  • 一些隐藏设备还具有用于 set_Outputreport 和 get_InputReport 的控制端点(端点输入和端点输出)。基本上用于配置部分 - 设置功能报告。
【解决方案2】:

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

usb_claim_interface

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

设置报告/获取报告

USBlyzer 显示相关数据包位于Get DescriptorSelect ConfigurationSet ReportGet ReportGet 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 Output Id 匹配 (0x02 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 的各种功能正在发生的事情。但这能够让我的主机从设备中捕获所有相关数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多