【发布时间】:2011-06-25 00:15:22
【问题描述】:
我需要对定制 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 应用程序中,通过控制传输的输入报告也即将到来。
感谢您的指点! 阿恩
附录一:
我想知道在使用libusb_interrupt_transfer() 时我应该如何指定要接收的报告ID?
附录二: 在将 Windows 驱动程序发出的请求与 Wireshark 中上述代码生成的请求进行比较时,我看不出有任何区别(URB 中的值相同)。但是,只有当 Windows 驱动程序发出中断传输时才会返回。
在 Wireshark 中检查 Windows 驱动程序通信时,除了各种 GET_DESCRIPTOR(...) 之外,我没有看到任何控制传输。最重要的是:没有SET_INTERFACE 或SET_CONFIGURATION 因此我怀疑问题与库或我如何使用它有关,而与设备无关。
【问题讨论】:
-
@david:我现在无法发布描述符,因为设备位于我的办公室。无论如何,描述符中肯定有两个端点 - 在两个接口中的每一个上都有一个。两个界面都提供至少一个包含设备按钮状态的输出报告。至少那些报告定义了
Usage Buttons。 -
我认为
libusb_interrupt_transfer会永远阻塞,即使我已将超时设置为 500 毫秒。但是当我注释掉那条线后,我的简单驱动程序挂断了;所以我在这里和那里插入了一些调试打印,发现libusb_open永远锁定,无论我在哪个设备上发布它。该死,从数位板获取int x,y,pressure,button_state;真的需要这么难吗?说真的,这是矫枉过正:)