libusb中断传输

我需要逆向devise一个用于定制HID USB设备的驱动程序(控制面板上的一些button和LED)。 驱动程序仅在Windows上可用,我们需要* nix实现。

该设备显然是一个HID设备,虽然不是一个特定的类。 它提供了两个接口,每个接口都有一个中断端点。

我的设置目前涉及一个在Ubuntu主机上运行Windows的VirtualBox,通过Wireshark捕获USBstream量。 协议是相当简单的,我已经获得了相当好的理解。

我在一个简单的C ++控制台程序中使用libusb-1.0进行原型devise。 我已经设法通过发出一个SET_REPORT控制传输来切换LED,但是在传输中通过中断来接收button的努力。

事实上,以下呼吁块永远:

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

在Wireshark中检查生成的URB时,它看起来就像在Windows会话中捕获的相同。 但我从来没有从设备得到答复。

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

感谢任何指针! 阿恩

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

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

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

Solutions Collecting From Web of "libusb中断传输"

您发布的代码存在问题。 您为定义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 ),并在这里发布,以便我们检查它们。