libusb中断传输

Arn*_*rne 6 c c++ linux usb libusb

我需要对定制 HID USB 设备(控制面板上的一些按钮和 LED)驱动程序进行逆向工程。该驱动程序仅在 Windows 上可用,我们需要 *nix 实现。

该设备显然是 HID 设备,尽管不属于特定类别。它提供两个接口,每个接口都有一个中断端点。

我的设置当前涉及在 Ubuntu 主机上运行 Windows 的 VirtualBox,以通过 Wireshark 捕获 USB 流量。该协议相当简单,我已经有了很好的理解。

我在一个简单的 C++ 控制台程序中使用 libusb-1.0 进行原型设计。我已经设法通过发出 SET_REPORT 控制传输来切换 LED,但在通过传输中断接收按钮按下时遇到了困难。

事实上,以下调用将永远阻塞:

unsigned char bytes[8] = { 0 };
int len = 0;
int ret = libusb_interrupt_transfer(handle, 0x81, bytes, 8, &len, 0); 
Run Code Online (Sandbox Code Playgroud)

在 Wireshark 中检查生成的 URB 时,它看起来与在 Windows 会话中捕获的等效内容完全相同。但我仍然没有收到设备的回复。

我觉得我缺少一些设置。请注意,设备已正确打开,并且设备提供的两个接口已成功声明。即使在我的 Linux 应用程序中,通过控制传输的输入报告也会出现。

感谢您的指点!阿内

附录一:我想知道在使用时我应该如何指定我想要接收的报告ID libusb_interrupt_transfer()

附录二:将 Windows 驱动程序发出的请求与 Wireshark 中上述代码生成的请求进行比较时,我没有看到任何差异(URB 中的值相同)。但是,只有当 Windows 驱动程序发出中断传输时才会返回。

在 Wireshark 中检查 Windows 驱动程序通信时,除了各种GET_DESCRIPTOR(...). 最重要的是:否SET_INTERFACESET_CONFIGURATION因此我怀疑问题与库或我如何使用它有关,而与设备无关

Dav*_*son 2

您发布的代码有问题。您编写的定义语法bytes不会产生 8 字节数组,但您请求 libusb 将 8 字节写入该地址,因此可能会出现错误或内存损坏。试试这个:

unsigned char buffer[8];
int len = 0;
int ret = libusb_interrupt_transfer(handle, 0x81, buffer, sizeof(buffer), &len, 0);
Run Code Online (Sandbox Code Playgroud)

每个 HID 报告都有其自己的端点,因此您可以通过指定正确的端点来指定要接收的报告。您指定了端点 1 IN (0x81)。您确定端点已在设备描述符中定义吗?也许你应该获取描述符(lsusb -v在 Ubuntu 中)并将它们发布在这里,以便我们可以检查它们。