USB系列-LibUSB使用指南(1)-Windows下的报错与踩坑

这是USB系列的LibUSB使用指南第一篇,介绍了LibUSB描述符结构,包括设备、配置、接口和端点描述符。还阐述了Windows下USB驱动问题,如高级和低级驱动,以及驱动替换方法。此外,讲解了Open_device和Transfer过程,并给出了程序示例。

成就更好的自己

时隔一年再次开始撰写博客,这一年的时间经历了很多,现在终于稳定下来。以后很长一段时间都能够稳定的学习和更新。时间将会聚焦于USB和PCIe的开发进行,能和大家共同进步真的很高兴。

本篇为USB系列的LibUSB使用指南的第一篇。

USB系列主要围绕USB的知识、协议、开发总结、使用说明等进行。

LibUSB使用指南主要围绕LibUSB库的使用进行。


LibUSB中的描述符结构分析

LibUSB中的描述符结构主要分为一下几种层次:

设备描述符->配置描述符->接口描述符(备用接口描述符)->端点描述符

看到这篇博客的都应该知道上述描述符的包含关系和可能的存在数量,基础知识不再赘述,到时候会专门写对应的基础知识博客。

LibUSB中的描述符包含关系与结构如下图所示:

 

从图中可以看出是没有设备描述符libusb_device_descriptor的,因为设备描述符一般可以看做是以设备为对象的一种描述结构,因此每个设备只有一个而且地位特殊。

图中最高层是配置描述符libusb_config_descripto,使用libusb_get_config_descriptor函数传入索引可以获得该设备中的某一个配置描述符。配置描述符中有一项bNumInterfaces为接口描述符的个数,可通过该项获得在该配置描述符中接口描述符的个数。

在配置描述符中还有一项为libusb_interface *interface,该项就是接口描述符的结构体数组。这个接口描述符与我们广义上理解的接口描述符不同,这里的接口描述符是由备用接口描述符结构体数组和备用描述符个数组成的,也就是libusb_interface_descriptor *altsetting和num_altsetting这两项。

要注意的是bNumInterfaces所指是接口描述符数组的个数,num_altsetting所指的是每个接口描述符数组成员中的备用接口描述符的数量。因此实际的配置描述符是由备用接口描述符组成的一个二维数组,这个二维数组的主索引是bNumInterfaces,副索引是num_altsetting。

在备用接口描述符数组中的每个成员都携带着在该备用接口下所属的若干端点的描述符结构体。

整个上面的过程中只有这个备用接口的概念和广义理解上的不太一样,剩下各个描述符中的各个字段均与协议栈中我们所通识的一样。实际上,这些结构体的存在方式和使用LibUSB函数获取描述符的方式与USB设备的枚举过程和方式的有着本质上的关联(后期博客提到)。

下面就是以博主电脑上为例,输出能探测到设备的详细信息(太长了,部分截图):

Windows下的USB驱动问题

Windows下LibUSB产生的很多报错与驱动有着很大关系。

我先言简意骇的简要介绍一下在你的Windows中可能存在的各种USB驱动,我暂时驱动分为高级的功能性驱动和低级的设备性驱动:

高级的功能性驱动:比如插入MSD类设备、移动硬盘、蓝牙适配器、HID类设备、网卡等具有实际功能性意义的设备时,Windows底层会自动的识别该设备的类和功能,从而找到一款能够直接适配该设备功能的通用高级驱动,这样就实现了目前Windows下多数陌生设备的免驱。

低级的设备性驱动:当插入的设备极为特殊,Windows认不出来这个玩意是干嘛的(比如设备描述符和接口描述符中的类字段与子类字段全部为0xff,即厂家定义),这个时候仅仅只是能够进行设备的基础枚举操作和通信。此时能够支撑设备枚举和通信的驱动就是设备性驱动,比如libusb-win32或WinUSB等。

假如我现在插入一个U盘就开始调用LibUSB库进行Open操作,这样是一定会返回错误的,因为LibUSB本身不是驱动,实际上也是要调用驱动留出的系统调用接口进行数据和指令传递的(这里类比linux的特性,表述可能些许不合适)。当这个设备底层根本不是LibUSB需要的接口的时候,当然是无法正常调用。

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值