参考文章:
1.https://www.usbzh.com/article/detail-104.html
本文章参考了USB中文网的资料,以及个人的一些抓包数据。
由于本人水平有限,USB协议也是一边学习一边写笔记,文章中可能会有错误以及不准确的地方,希望广大网友帮我指正,大家一起学习一起进步。
USB设备描述符是USB设备在进行插拔和初始化过程中,最先被主机读取的一部分信息,它包含了设备的一些基本属性信息,如USB规范版本、设备类、设备子类、设备协议、最大数据包长度等。
USB设备描述符通常是在设备插入时被主机读取,在获取到设备描述符后,主机可以自动加载相应的驱动程序,完成设备的初始化和配置。
设备描述符是USB设备的第一个描述符,每个USB设备都得具有设备描述符,且只能拥有一个。
每个USB设备有且只能有一个设备描述符
设备描述符的定义:
操作系统使用bDeviceClass、bDeviceSubClass和bDeviceProtocol来查找设备的类驱动程序。通常只有 bDeviceClass 设置在设备级别。大多数类规范选择在接口级别标识自己,因此将 bDeviceClass 设置为 0x00。这允许一个设备支持多个类,即USB复合设备。
在USB官网当中,包含了对各种类的定义:
网站如下:https://www.usb.org/defined-class-codes
对于此网站的类的定义,大家可以自行去翻译查看,下面贴出我学习翻译的截图,仅供大家参考(字有点丑,一些记录没有什么用处,希望大家不要介意),建议还是去官网查看一下
代码中设备描述符的应用:
下面是抓包的数据:
第一次获取设备描述时,实际上系统只是取前8字节的设备描述符
后续再次获取一次18字节的设备描述符
值得注意的地方:
在设备描述符中的定义设备类的3的变量,需要严格参考官网中的需求,同时,当bDeviceClass定义为0x00的时候,此时说明接口是独立的,各个接口分别支持什么类,需要前往接口描述符中查看,这也有可能会产生冲突,例如若想将bDeviceClass定义为0xFF(厂商自定义),同时又想增加HID功能(HID功能需要将bDeviceClass定义为0x00,在接口描述符中查看接口的功能),两者是相互冲突的。