繁体   English   中英

libusb中断传输

[英]libusb interrupt transfer

我需要对定制的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会话中捕获的等效项完全相同。 我仍然没有收到设备的回复。

我失败了我错过了一些设置。 请注意,设备已正确打开,并且设备提供的两个接口均已成功声明。 即使在我的linux应用程序中,通过控制传输的输入报告即将到来。

谢谢你的指针! 阿恩

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

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

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

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

我有同样的问题, libusb_interrupt_transfer()永远阻塞读取端点(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);

但是,我的设备需要在读取数据之前发送一些代码,
并且需要sizeof 64缓冲区,尽管lsusb -v的输出bLength是7。

#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}取决于器件规范。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM