加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – libusb中断传输

发布时间:2020-12-16 06:56:49 所属栏目:百科 来源:网络整理
导读:我需要对定制的HID USB设备(控制面板上的一些按钮和LED)进行反向工程.该驱动程序仅在 Windows上可用,我们需要* nix实现. 该设备显然是HID设备,但不属于特定类别.它提供两个接口,每个接口都有一个中断端点. 我的设置目前涉及在Ubuntu主机上运行Windows的Virtu
我需要对定制的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)并在这里发布它们以便我们检查它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读