C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – libusb中断传输大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要对定制的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应用程序中,通过控制传输的输入报告即将到来.

谢谢你的指针!

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

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

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

解决方法

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

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

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

大佬总结

以上是大佬教程为你收集整理的c – libusb中断传输全部内容,希望文章能够帮你解决c – libusb中断传输所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。