libusb中断传输

我需要对定制的HID USB设备(控制面板上的某些按钮和指示灯)进行反向工程驱动程序。该驱动程序仅在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会话中捕获的等效记录。不过,我仍然无法收到设备的回复。 我跌倒了,我错过了一些设置。请注意,已正确打开设备,并且已成功声明了该设备提供的两个接口。甚至在我的linux应用程序中,通过控制传输的输入报告也将进入低谷。 感谢您的指导! 阿恩 附录一: 我想知道如何使用specify1ѭ时指定要接收的报告ID? 附录二: 将Windows驱动程序发出的请求与Wireshark中上述代码生成的请求进行比较时,我看不出任何区别(URB中的值相同)。但是,仍然只有在Windows驱动程序发出中断传输时才会返回。 在Wireshark中检查Windows驱动程序通信时,除了各种ѭ2以外,我看不到任何控制权转移。最重要:没有
SET_INTERFACE
SET_CONFIGURATION
因此,我怀疑问题与库或我的使用方式有关,与设备无关。     
已邀请:
        您发布的代码有问题。您编写的用于定义“ 5”的语法将不会生成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
)并将其张贴在此处,以便我们进行检查。     
        我遇到了同样的问题,ѭ1ever永远阻止读取端点(bEndpoinntAddress:0x81 EP 1 IN(
lsusb -v
的输出)),但解决了。 就我而言,我是这样写的。
#define ENDPOINT_IN 0x81
unsigned char buffer[8];
int len = 0;
int ret = libusb_interrupt_transfer(handle, ENDPOINT_IN, buffer, sizeof(buffer), &len, 0);
但是,我的设备在读取数据之前需要发送一些代码, 尽管
lsusb -v
的输出
bLength
为7.,但仍需要64个缓冲区的大小。
#define ENDPOINT_OUT 0x01
#define ENDPOINT_IN 0x81
unsigned char buffer[64] = {0x20, 0x01, 0x03, 0x02, 0x07};
int len = 0;
int send_ret = libusb_interrupt_transfer(handle, ENDPOINT_OUT, buffer, sizeof(buffer), &len, 0);
int recv_ret = libusb_interrupt_transfer(handle, ENDPOINT_IN, buffer, sizeof(buffer), &len, 0);
buffer[64] = {0x20, 0x01, 0x03, 0x02, 0x07}
取决于设备规格。 希望这可以帮助。     

要回复问题请先登录注册