2011-06-25 40 views
4

我需要逆向设计定制HID USB设备(控制面板上的某些按钮和LED)的驱动程序。该驱动程序仅在Windows上可用,我们需要* nix实现。libusb中断传输

该设备显然是一个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); 

当检查导致URB在Wireshark的它看起来就像在Windows会话中捕获的等价物。尽管如此,我从来没有从设备得到答复。

我倒了,我错过了一些设置。请注意,设备已正确打开,且设备提供的两个界面都已获得成功声明。即使在我的Linux应用程序中,通过控制传输方式输入报告也即将到来。

感谢任何指针! Arne

附录I: 我在想如何指定在使用libusb_interrupt_transfer()时想要接收哪个报告ID?

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

在Wireshark中检查Windows驱动程序通信时,我看不到除各种GET_DESCRIPTOR(...)以外的任何控制转移。最重要的是:没有SET_INTERFACESET_CONFIGURATION因此我怀疑问题是关系到图书馆或我如何使用它,并且是而不是与设备相关。

+0

@david:由于设备驻留在我的办公室,因此我无法立即发布描述符。无论如何,描述符中肯定有两个端点 - 两个接口中的每一个都有一个。两个接口都至少提供一个包含设备按钮状态的输出报告。至少这些报告定义了“使用按钮”。 – Arne

+0

你尝试过使用hidapi吗? –

+0

我以为自己'libusb_interrupt_transfer'永远被阻塞,即使我已经设置了500ms的超时时间。 但是当我注释掉那条线后,我的简单驱动程序挂了;所以我在这里和那里插入了一些debug-prints,并发现'libusb_open'永远锁定,无论我发布哪个设备。 该死的,难道真的需要这么难从数字笔中获得'int x,y,pressure,button_state;'?认真,这是矫枉过正:) – Frank

回答

1

您发布的代码存在问题。您为定义bytes而编写的语法不会生成8字节的数组,但是您要求libusb将8个字节写入该地址,以便可能出现错误或内存损坏。试试这个:

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

每个HID报告都有自己的终点,所以你指定要通过指定正确的端点接受该报告。您指定了端点1 IN(0x81)。你确定端点是在设备描述符中定义的吗?也许你应该得到描述符(在Ubuntu中使用lsusb -v)并将它们发布到这里,以便我们可以检查它们。

+0

缺失的括号是一个错字。实际的代码读取'unsigned char buffer [8]'。无论如何,感谢提示。 – Arne