USB设备用描述符报告他们的属性,一个描述符是一个已定义格式的数据结构体。每个描述符以一个表示描述符长度的字节和一个表示描述符类型的字节开始。

USB描述符信息存储在USB设备中,在枚举过程中,USB主机会向USB设备发送GetDescriptor请求,USB设备在收到这个请求之后,会将USB描述符信息返回给USB主机,USB主机分析返回来的数据,判断出该设备是哪一种USB设备,建立相应的数据链接通道。那么USB描述符信息到底是一个什么样的数据呢,USB协议中有详细描述。

USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。每个USB设备的都提供不同级别的配置信息,可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合(在探测/连接期间需要从其中选定一个),配置由多个接口组成。

在USB协议中,接口由多个端点组成,代表一个基本的功能,是USB设备驱动程序控制的对象,一个功能复杂的USB设备可以具有多个接口。设备接口是端点的汇集(Collection)。例如,USB扬声器可以包含一个音频接口以及对旋钮和按钮的接口。一个配置中的所有接口可以同时有效,并可被不同的驱动程序连接。每个接口可以有备用接口,以提供不同质量的服务参数。

端点是USB通信的最基本形式,每一个USB设备接口在主机看来就是一个端点的集合。主机只能通过端点与设备进行通信,以使用设备的功能。在USB系统中每一个端点都有唯一的地址,这是由设备地址和端点号给出的。每个端点都有一定的属性,其中包括传输方式、总线访问频率、带宽、端点号和数据包的最大容量等。一个USB端点只能在一个方向上承载数据,从主机到设备(输出端点)或者从设备到主机(输入端点),因此端点可看作是一个单向的管道。端点0通常为控制端点,用于设备初始化参数等。只要设备连接到USB上并且上电,端点0就可以被访问。端点1、2等一般用作数据端点,存放主机与设备间往来的数据。

这种层次化配置信息在设备中通过一组标准的描述符来描述。

kernel\msm-3.18\include\uapi\linux\usb\ch9.h定义了这些描述符

kernel\msm-3.18\include\uapi\linux\usb\ch11.h----有usb hub相关的定义

  1. 设备描述符

设备描述符描述USB设备的通用信息,它包括适用于设备的全局信息和所有的设备配置。一个USB设备只有一个设备描述符。

bLength:表示描述符长度。

bDescriptorType:描述符类型

USB HUB描述符类型值为29H。

bcdUSB:

BCD(Binary-Coded Decimal二进制码十进制数)版本号(USB总线版本号),bcdUSB的值是0xJJMN (JJ – major version number, M – minor version number, N – sub-minor version number)。比如版本2.13用0x0213表示,版本2.0用0x0200表示。

bDeviceClass:

由USB-IF(USB Implementers Forum)分配的设备类代码,比如USB HUB为HUB_CLASSCODE (09H)。

如果该字段为0x00,表示由接口描述符来指定(有可能该USB设备是一个复合设备,USB设备的各个接口相互独立,分别属于不同的设备类)。如果是0x01~0xfe,表示为USB-IF定义的设备类,例如0x03为HID设备,0x09为HUB设备。如果是0xff,表示由厂商自定义设备类型。

bDeviceSubClass:

USB子类代码,由USB-IF分配,如果bDeviceClass为0x00,那么该字段也必须为 0x00,其它情况可以参考USB关于对于USB Device Class的定义。如果bDeviceClass,则bDeviceSubClass的值由USB-IF分配;如果bDeviceClass为0xFF,则bDeviceSubClass的值的值由厂家自定义。

bDeviceProtocol

协议代码,由USB-IF分配,如果bDeviceClass和bDeviceSubClass定义为0x00,那么该字段也必须为0x00。如果该字段为0xFF,则设备使用厂家自定义的值。

bMaxPacketSize0

端点0最大包大小,只有8、16、32或64有效。

idVendor

USB-IF分配的厂商ID

IdProduct

厂商自行指定的产品ID

BcdDevice

设备编号。

iManufacturer

用于描述厂商的字符串描述符索引

iProduct

用于描述产品的字符串描述符索引

iSerialNumber

用于描述产品序列号的字符串描述符索引,注意,所有的字符串描述符是可选的,如果没有字符串描述符,指定这些索引为0x00

bNumConfigurations

配置描述符数量

比如我们主板上USB设备描述符信息如下,具体每项的意义后面再深入去对应起来学习

2. 配置描述符

配置描述符描述关于特定设备的配置信息。当host请求配置描述符,它下面所有相关的接口和端点描述符也一起返回。

bLength: 配置描述符长度,配置描述符长度为9字节大小。

bDescriptorType: 描述符类型,配置描述符类型为0x02。

wTotalLength: 配置描述符信息总的大小,包括接口描述符、端点描述符等等。

bNumInterfaces: 此配置支持的USB接口数量。

bConfigurationValue: 当使用SetConfiguration和GetConfiguration请求时所指定的配置索引值。

iConfiguration: 描述配置的字符串描述符索引。

bmAttributes: 供电配置,位详细定义如下:

D7              保留,必须置1

D6              自供电模式

D5              远程唤醒

D4~D0      保留

如果设备描述符支持远程唤醒,D5要设置为1

bMaxPower: 最大功耗,以2mA为单位,例如0x32为50*2=100mA。

3. 接口描述符

接口描述符描述一个配置下的特定接口,当一个配置支持多个接口,那一个接口下的所有端点描述符经常是作为一个配置描述符下的一部分返回。接口描述符不能使用GetDescriptor() 或SetDescriptor()请求直接访问。

bLength: 描述符长度,接口描述符长度为9个字节。

bDescriptorType: 描述符类型,接口描述符的类型为0x04。

bInterfaceNumber: 该接口编号,接口编号从0开始分配,当一个配置有多个接口时,就用该字段来区分不同的接口。

bAlternateSetting: USB设备配置与USB配置描述符是一一对应的, 即一个配置只能有一个配置描述符。虽然由bInterfaceNumber字段可知, 每一个接口都有一个惟一确定的接口编号, 但是一个接口却可以由不只一个接口描述符来描述它。USB 允许多个接口描述符来描述同一个接口, 且这些描述符都可通过命令切换。此字段就是每一个这类描述符惟一的编号。USB可通过调用这个字段来切换描述同一个接口的不同描述符。控制传输中的Get_Inter face 命令可以用来得到目前正在使用的描述一个确定接口的接口描述符的编号, 即此字段。而Set_Inte rface 命令则以此字段值为参数, 用来使相应的接口描述符描述某个确定的接口

bNumEndpoints:  端点数量,不包括端点0。

bInterfaceClass:USB-IF分配的类代码,0预览未来使用,0xFF表示接口类是厂家自定义,其他值由USB-IF指定。

bInterfaceSubClass:USB-IF分配的子类代码,由bInterfaceClass字段限制。

bInterfaceProtocol:  如果一个接口支持特定类请求,此代码标识由特定设备类定义的协议,如果该字段为0,设备部在此接口不使特定类的协议,如果该字段为0xFF,设备为此接口使用厂家自定义协议。

iInterface: 描述该接口的字符串描述符索引。

4. 端点

端点描述符包含的信息被host用来决定每个端点所需带宽,一个端点描述符经常作为通过GetDescriptor(Configuration)请求配置信息的一部分被获取。一个端点描述用GetDescriptor() or SetDescriptor()请求直接访问。端点0没有描述符。

bLength: 描述符长度,这里有两个值如果是audio设备的端点,那么端点描述符长度就为9个字节,对于其它设备端点,端点描述符长度就为7个字节。

bDescriptorType: 描述符类型,端点描述符类型为0x05。

bEndpointAddress: 端点地址,详细定义如下:

D7 端点方向

0                  OUT端点

1                  IN端点

D6~D4       保留

D3~D0       端点编号

bmAttributes: 端点类型,详细定义如下:

D5~D4 用途

00     数据端点

01     反馈端点

10     隐式反馈数据端点

11     保留

D3~D2 同步类型

00     非同步

01     异步

10     自适应

11     同步

D1~D0 传输类型

00     控制传输

01     同步传输

10     块传输

11     中断传输

如果该端点不是同步端点,D5~D2保留且必须置0。

wMaxPacketSize: 端点所支持最大数据包的长度,详细定义如下:

D10~D0 最大数据包长度

D12~D11

其余位保留且必须置0。

bInterval:端点数据传输的访问时间间隔。对于全速/低速的中断端点,取值范围为 1~255,对于高速中断端点,取值范围为1~16,详细定义可以参考USB协议。

5. 字符串描述符

字符描述符是可选的,如果一个设备不支持字符串描述符,设备描述符、配置描述符和接口描述符中对字符串描述符的引用必须设置为0.

下图是我们产品/sys/kernel/debug/usb/devices的内容

参考链接:

USB2.0协议标准描述符

https://blog.csdn.net/hushiganghu/article/details/54929066

USB描述符【整理】

https://www.cnblogs.com/Daniel-G/p/3993904.html

USB基础---设备、配置、接口、端点和字符串描述符相关推荐

  1. 二,usb描述符-设备 配置 接口 端点

    一,基础概念 在USB设备的逻辑组织中,包含设备.配置.接口和端点4个层次. 每个USB设备都提供了不同级别的配置信息,可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合(在探测/连接期间需 ...

  2. Linux那些事儿 之 戏说USB(33)字符串描述符

    关于字符串描述符,前面的前面已经简单描述过了,地位仅次于设备/配置/接口/端点四大描述符,那四大设备必须得支持,而字符串描述符对设备来说则是可选的. 这并不是就说字符串描述符不重要,对咱们来说,字符串 ...

  3. 从零开始学USB(二十四、USB接口HID类设备(六)_物理描述符)

    物理描述符也称作实体描述符.被用来描述设备的行为特性. 物理描述符是一种数据结构,它提供有关激活控件或控件的人体特定部分的信息. 例如,物理描述符可能指示右手拇指用于激活按钮5.应用程序可以使用此信息 ...

  4. USB鼠标-字符串描述符(七)

    USB 鼠标详解阅读顺序 1.枚举 2.设备描述符 3.设置地址 4.配置描述符 5.接口描述符 6.HID 描述符 7.端点描述符 8.字符串描述符 9.HID 报告描述符 10.HID 报告的返回 ...

  5. USB键盘实现——字符串描述符(四)

    目录 字符串描述符 获取字符串描述符请求 标准设备请求 语言 ID 获取(字符串索引为 0) USB 控制端点收到的数据 语言 ID 返回 厂商字符串获取(字符串索引为 1) USB 控制端点收到的数 ...

  6. lpc1768usb端点响应以及描述符定义

    #ifndef __USBEP1_H_ #define __USBEP1_H_ #include "usb.h" #include "usbhw.h" exte ...

  7. 从零开始学USB(二十二、USB接口HID类设备(四)_报表描述符Local类)

    本地项目标签定义控件的特征. 这些项目不会转移到下一个主要项目. 如果Main项定义了多个控件,则可能会有几个类似的Local项标签. 例如,一个Input项可能有几个与之关联的Usage标签,每个控 ...

  8. 从零开始学USB(二十一、USB接口HID类设备(三)_报表描述符Global类)

    Global Item 用于描述一个操作( Main Item )所用到的数据格式,它可以改变一个 state table 的量, 这个 state table 的参数用于修饰 Main Item . ...

  9. ZigBee_端点管理_描述符

    ZigBee网络中的所有设备都有一些描述符,用来描述设备类型和应用方式.描述符的定义和创建配置项在文件ZDOCConfig.h和ZDOConfig.c中完成. IEEE地址,设备地址,全球唯一 每个节 ...

最新文章

  1. Go 学习笔记(46)— Go 标准库之 fmt(输入/输出格式化参数、Printf/Fprintf/Sprintf区别、Println/Fprintln/Sprintln 区别)
  2. 上海大学c语言程序设计,上海大学2009-C语言程序设计秋季学期试卷.doc
  3. Pycharm中导入的模块名下出现红色波浪线问题
  4. CFLAGS,CPPFLAGS,CXXFLAGS in Makefile
  5. 牛客练习赛44 A 小y的序列 (模拟,细节)
  6. vue 给checkbox 赋值_Vue动态生成el-checkbox点击无法赋值的解决方法
  7. 交互式 shell 玩转 Python
  8. 【转】LoadRunner中事务和集合点的放置顺序问题
  9. 【sklearn第十八讲】神经网络模型
  10. python制作gif动图_Python几行代码制作Gif动图
  11. Strategy(策略模式)
  12. 传染病模型系统动力学VENSIM模拟
  13. 工作 3 年和读研 3 年哪个更值?
  14. 分享一个千万数据的磁力搜索网站 bt书虫 php+mysql+nginx
  15. 贪婪的大脑:为何人类会无止境地寻求意义 目录
  16. NMock学习系列(三)--- NMock在DDD领域驱动的单元测试中的应用
  17. 7 Papers Radios | SIGGRAPH 2020最佳博士论文;南开等提出新型自校准卷积
  18. Python--------随机生成四位数字与大写英文字母组合的验证码(简单版)
  19. python变量名必须以字母或下划线开头不区分字母大小写_Python变量名必须以字符或下划线开头,并且区分字母大小写。...
  20. 约瑟夫环的两种实现方法

热门文章

  1. python数学公式代码导入_在Matplotlib图中插入LaTex公式实例
  2. uc浏览器为什么安装在c盘_你肯定不知道为什么Windows上面的软件都想把自己安装在C盘...
  3. 026_元素执行函数
  4. 智点创科机器人_秒会机器人教育_秒会机器人教育加盟_秒会机器人教育加盟费多少钱-武汉智点创科机器人科技发展有限公司-项目网...
  5. matlab 通过矩阵变换使图像旋转平移_数字图像处理|P11 第三章 第四节 图像的几何变换...
  6. oracle学习的方法:
  7. AI CC2018软件安装教程
  8. 高性能MySQL(第3版)
  9. vc2010中开始执行不调试灰的_反编译动态调试smali全过程
  10. python从入门到精通学习笔记_Python从入门到精通之基础概念