我需要对定制的 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);
在 Wireshark 中检查生成的 URB 时,它看起来与在 Windows 会话中捕获的等效 URB 完全一样。我仍然没有得到设备的回复。
我跌倒了,我错过了一些设置。请注意,设备已正确打开,并且设备提供的两个接口均已成功声明。即使在我的 linux 应用程序中,通过控制传输的输入报告也正在出现。
感谢您的任何指示!阿恩
附录 I:我想知道在使用时我应该如何指定要接收的报告 ID libusb_interrupt_transfer()
?
附录二:当将 Windows 驱动程序发出的请求与 Wireshark 中上述代码生成的请求进行比较时,我没有看到任何差异(URB 中的值相同)。但是,只有当 Windows 驱动程序发出中断传输时才会返回。
在 Wireshark 中检查 Windows 驱动程序通信时,除了各种GET_DESCRIPTOR(...)
. 最重要的是:否SET_INTERFACE
或SET_CONFIGURATION
因此我怀疑问题与库或我如何使用它有关,与设备无关。