USB2.0协议学习笔记---描述符
USB设备描述符
字段名 | 长 度(字节) | 地址偏移 | 含 义 |
bLenth | 1 | 0 | 描述符长度 |
bDescriptorType | 1 | 1 | 描述符类型 (这里为 1) |
bcdUSB | 2 | 2 | USB规范版本号(BCD码) |
bDeviceClass | 1 | 4 | 类代码 |
bDeviceSubClass | 1 | 5 | 子类代码 |
bDeviceProtocol | 1 | 6 | 协议代码 |
bMaxPackSize0 | 1 | 7 | 端点0最大支持数据包长度 |
idVendor | 2 | 9 | 供应商ID |
idProduct | 2 | 11 | 产品ID |
bcdDevice | 2 | 13 | 设备版本号(BCD码) |
iManufacturer | 1 | 14 | 供应商字符串描述索引 |
iProduct | 1 | 15 | 产品字符描述字符串索引 |
iSerialNumber | 1 | 16 | 产品序列好描述符索引 |
bNumConfigurations | 1 | 17 | 所支持的配置数 |
bLenth :该描述符的长度,单位字节一般USB设备描述符都是固定的18字节即0x12;
bDescriptorType :描述符种类代码。USB设备描述符为0x01;
bcdUSB :USB协议版本,采用BCD编码如2.0就是0x0200,但是USB是小端结构,因此实际就是 【0x00 ,0x20】
bDeviceClass: 设备类代码,大多数是0而在接口描述符中的bInterfaceClass中指定该接口实现的功能,注意的是当bDeviceClass为0时,bDeviceSubClass也必须为0;
bDeviceSubClass :配合bDeviceClass代码决定,USB标准定义。
bDeviceProtocol:设备所使用类的协议,如果没有定义类就为0 ,字段为0xFF表示使用自定义协议。
bMaxPackSize0 :端点0的最大包长,最小是8,因为枚举过程,第一次获取设备描述符只会读取一次,因此需要在这个包中包含USB设备描述符的长度。
idVendor:厂商ID VID,需要交保护费申请。
idProduct :产品ID PID由厂商自己定义。通常主机会根据VID和PID来加载本地或源的驱动程序。
bcdDevice :设备版本号,也采用BCD码,同理USB协议版本号。
iSerialNumber :设备序列号字符串索引值。
bNumConfigurations :设备有多少种配置,大部分USB设备就只有一个配置。
USB配置描述符
需要注意的是在有些时候,配置描述符中会包含接口描述符,特殊类描述符,端点描述符等信息,并在主机枚举请求设备配置描述符时一起返回给主机,不能单独返回给主机。
字段名 | 长 度 (字 节) | 地址偏移量 | 含义 |
bLenth | 1 | 0 | 配置描述符长度 |
bDescriptorType | 1 | 1 | 配置描述符类型 |
wTotalLength | 2 | 2 | 配置信息总长度 |
bNumInterfaces | 1 | 4 | 配置接口数 |
bConfigurationValue | 1 | 5 | 配置值 |
iConfiguration | 1 | 6 | 字符串描述符索引值 |
bmAttributes | 1 | 7 | 配置特性 |
bMaxPower | 1 | 8 | 最大电流(2mA为单位) |
bLenth :该描述符长度
bDescriptorType:描述符类型,配置描述符为0x02;
wTotalLength:表示整个配置描述符的总长度,包括配置描述符,接口描述符,类特殊描述符和端点描述符。
bNumInterfaces:配置支持的接口数。
bConfigurationValue:每个配置都有一个标识值。
iConfiguration:配置描述符索引。
bmAttributes:描述特性 D7保留,D6辨识供电方式,为1表示自供电的,否则是总线供电,D5标识是否支持远程唤醒(1),D4-D0保留。
bMaxPower:总线供电时的最大电流,如值为100则最大电流为200mA。
USB接口描述符
字 段 名 | 长 度 (字节) | 地址偏移 | 含 义 |
bLenth | 1 | 0 | 描述符的长度 |
bDescriptorType | 1 | 1 | 描述符的类型 |
bInterfaceNumber | 1 | 2 | 接口号 |
bAlterateSetting | 1 | 3 | 可替换设置值 |
bNumEndpoint | 1 | 4 | 端点0以外的端点数 |
bInterfaceClass | 1 | 5 | 类代码 |
bInterfaceSubClass | 1 | 6 | 子类代码 |
bInterfaceProtocol | 1 | 7 | 协议代码 |
iInterface | 1 | 8 | 字符串描述符索引值 |
bLenth: 描述符的长度。
bDescriptorType: 描述符的类型(接口描述符为4)
bInterfaceNumber: 表示该接口的编号,用在配置有多个接口,每个接口有唯一放入编号,从0 开始编号。
bAlterateSetting:接口的备用编号,规则同上。一般不用
bNumEndpoint:该接口使用的端点数,不包括端点0。即如果为0 就只有控制端点。
bInterfaceClass:接口使用的类
bInterfaceSubClass:接口使用的子类
bInterfaceProtocol:接口使用的协议。三个一起定义了设备的功能,鼠标键盘就只需要改协议部分就可以。其他两个都是HID类。
iInterface:接口字符串描述符的索引值。
USB端点描述符
域 | 大小(字节) | 偏移 |
bLenth | 1 | 0 |
bDescriptorType | 1 | 1 |
bEndpointAddress | 1 | 2 |
bmAttributes | 1 | 3 |
wMaxPackSize | 2 | 4 |
bInterval | 1 | 6 |
bLenth: 该描述符的长度(字节)
bDescriptorType: 该描述符的类型(0x05)
bEndpointAddress:端点的地址,D7表示端点的传输方向,为1则为输入,为0则为输出,D3-D0为端点号,其他位没有用。
bmAttributes:一个字节的属性描述字节,D1~D0表示端点传输类型,0 为控制传输,1为等时传输,2为批量传输,3为中断传输。如果为等时传输,D3-D2表示等时传输的类型,0表示无同步,1为异步,2为适配,3为同步;D5-D4辨识用途,0为数据端点,1为反馈端点,2为暗反馈端点,3保留;D7-D6保留。但是如果不是同步传输则只用到D1-D0其他位全部保留。
wMaxPackSize:该端点支持的最大数据长度,对于低速和全速设备而言,D10-D0表示数据包最大长,其他位未用,对于高速设备D12-D11表示每个帧的附件传送次数,具体参考USB标准协议。
bInterval:表示该端点的查询时间,对于中断传输表示查询的帧间隔数;对于其他传输方式参考USB标准协议。
类特殊描述符
有些设备还需要有类特殊描述符,这里拿HID设备举例,HID设备的特殊描述符如下
域 | 大小 | 偏移 | 说明 |
bLenth | 1 | 0 | 描述符长 |
bDescriptorType | 1 | 1 | 描述符类型 |
bcdHID | 2 | 2 | HID 协议版本 |
bCountryCode | 1 | 4 | 国家代码 |
bNumDescriptors | 1 | 5 | 下级描述符数量 |
bDescriptorType | 1 | 6 | 下级描述符类型 |
bDescriptorLength | 2 | 7 | 下级描述符长度 |
bDescriptorType | 1 | 9 | 下级描述符的类型(可选) |
wDescriptorLength | 2 | 10 | 下级描述符的长度(可选) |
... | ... | ... | ... |
类比前面描述符的作用这里只需要记一下一下几个字段的意义:
bcdHID:为 HID设备的版本,用BCD码表示,两个字节,如下表示版本为1.10
bCountryCode: 国家代码(这个用在特殊情况下 比如键盘,美式键盘等)。
bNumDescriptors:下级描述符的数量,在HID设备中至少有一个是报告描述符。
bDescriptorType:HID报告描述符为0x22.
bDescriptorLength:对应描述符的大小。
因为下级描述符至少有一个因此,HID类描述至少是10个字节,底下就是一个HID描述符的例子。
0x09, /* bLength: HID Descriptor size */
HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
0x10, /* bcdHID: HID Class Spec release number */
0x01,
0x00, /* bCountryCode: Hardware target country */
0x01, /* bNumDescriptors: Number of HID class descriptors to follow */
0x22, /* bDescriptorType */
CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */
0x00,
看了这么多,现在我对USB协议的理解是这样的:USB设备可以理解为一个类,描述符就是这个类的属性,而枚举过程就是host主动请求调用,获取属性的方法,从而知道这个类的属性,其余在主机和设备数据交换过程的处理细节就是设备类的方法,我们实现一个USB设备就是在定义设备属性和定义方法接口的过程,只是定义属性需要了解到以上USB标准中的这些规则(profile),同时枚举过程的一些操作就是必须要实现的接口,其余的部分就要看我们的设备,设计出来支持的操作有哪些,选择的实现了,好了暂时就这些,后面还有一部分概念需要学习,待续。。。
参考:《圈圈教你玩USB(第二版)》
2019-06-02 11:39:57
USB2.0协议学习笔记---描述符的更多相关文章
- USB2.0协议学习笔记---基本概念
概念 USB是一种串行通信总线(Universal Serial Bus),经历的版本有USB1.0,USB1.1.USB2.0等.USB是一种主从模式的结构,因此它无法在设备与设备.主机与主机之间 ...
- USB2.0协议学习笔记---USB工作过程(类的方法)
前面学习了那么多的概念,这里需要记住一点分层概念即设备 ---> 配置 ---> 接口 ---> 端点,这种分层的概念结构 . 也可以理解为端点构成接口,接口组成配置,配置组成设备. ...
- USB2.0协议学习笔记---USB数据包结构
USB包类型和传输过程 USB是一种串行总线,因此数据都是一位一位传输的,如同串口那样,但是USB在真实物理电路上却不是TTL电平,而是一种差分信号采用NRZI编码,就是用变化表示0,不变表示1,同 ...
- usb2.0 规范学习笔记
1.一个USB HOST 最多可以同时支持128 个地址,地址0 作为默认地址,只在设备枚举期间临时使 用,而不能被分配给任何一个设备,因此一个USB HOST 最多可以同时支持127 个地址,如果一 ...
- USB协议-USB的描述符及其之间的关系
USB只是一个总线,只提供一个数据通路而已.USB总线驱动程序并不知道一个设备具体如何操作,有哪些行为.具体的一个设备实现什么功能,要由设备自己来决定.那么,USB主机是如何知道一个设备的功能以及行为 ...
- HTTP协议学习笔记(一)
HTTP协议学习笔记(一) 1.HTTP协议用于客户端和服务端之间的通信 客户端:请求访问文本或图像等资源的一端服务端:提供资源响应的一端 在两台计算机之间使用HTTP协议通信时,在一条通信线路上必定 ...
- java学习笔记05--字符串 .
java学习笔记05--字符串 . 一.String类 由字符所组成的一串文字符号被称之为字符串.在java中字符串不仅仅是字符数组,而且是String类的一个实例,可以使用String类来构建. 字 ...
- HTTP协议学习笔记(三)
HTTP协议学习笔记(三) 1.状态码告知从服务器端返回的请求结果 状态码的职责是当客户端向服务端向服务端发送请求时,描述返回的请求结果.借助状态码,用户可以知道服务端是正常处理了请求,还是出现了错误 ...
- HTTP协议学习笔记(二)
HTTP协议学习笔记(二) 1.HTTP报文 HTTP报文:用于HTTP协议交互的信息.请求报文:请求端(客户端)的HTTP报文叫做请求报文.响应报文:响应端(服务端)的HTTP报文叫做响应报文. H ...
随机推荐
- Py数据类型—整形与字符串
数据类型 在指针的右边输入.可以触发功能列表: 数字(整形):也就是123之类的,不能是abcd和中文之类的,数据类型为int 1.强制字符转换 a="123" b=int(a) ...
- U盘UEFI+GPT模式安装CentOS7.X系统
1.制作CentOS7安装盘 还是老套路,开局先制作安装盘,UltraISO软碟通,上图 (1) 打开UltraISO软件,选择"文件"-> "打开" ...
- Go 如何实现热重启
https://mp.weixin.qq.com/s/UVZKFmv8p4ghm8ICdz85wQ Go 如何实现热重启 原创 zhijiezhang 腾讯技术工程 2020-09-09
- 主题模型(Topic)
消息队列 RocketMQ - 打造金融级消息服务 - 阿里云 https://www.aliyun.com/product/rocketmq 主题模型(Topic) 发布/订阅(Pub/Sub) 一 ...
- You shouldn't use *any* general-purpose hash function for user passwords, not BLAKE2, and not MD5, SHA-1, SHA-256, or SHA-3
hashlib - Secure hashes and message digests - Python 3.8.3 documentation https://docs.python.org/3.8 ...
- 动态库与静态库的学习 博主写的很好 静态库 编译的时候 需要加上 static 动态库编译ok运行不成功就按照文章中的方法修改
来源连接 http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库 ...
- loj2587铁人两项
无向图,图中选出定点三元组(a,b,c),a->b->c的路径没有重复边.问方案有多少? -------------------------------------------- 首先求出 ...
- Centos7部署FytSoa项目至Docker——第一步:安装Docker
FytSoa项目地址:https://gitee.com/feiyit/FytSoaCms 部署完成地址:http://82.156.127.60:8000/ 先到腾讯云申请一年的云服务器,我买的是一 ...
- jQuery基础介绍
最近在学习JavaScript,当学习Javascript之后,不得不学习的肯定是jQuery了,所以开始利用网络的便捷浏览各大博客寻找可学习的资源.这篇博客关于jQuery的学习让我有很多收获,也明 ...
- ESRI,空间数据处理,WKT,GeoJson
ESRI,空间数据处理,WKT,GeoJson 一.WKT 二.GeoJson 三.WKT转GeoJson 四.GeoJson 转 WKT 一.WKT WKT(well-known text)是一种文 ...