目录
《圈圈教你学 USB》第 3 章学习笔记 说明:本文章节顺序按照 《圈圈教你学USB》 一书的学习顺序来组织,其中跳过了硬件代码相关的章节。 参考: 1)《圈圈教你学USB》2009 年第 1 版 2)B 站 沁恒微电子《USB技术应用与开发》:https://www.bilibili.com/video/BV1d5411J74M 3)USB 官网(直接搜索 usb 或 hid): USB 协议定义了一个 8 字节的标准设备请求,主要用在设备的枚举过程中,是在控制传输的SETUP(建立)过程中,通过默认控制端点 0 发出的。 1)标准设备请求的结构: 2)标准设备请求: 3)bRequest 请求代码如下表: 4)描述符类型(Descriptor Types)如下表: 上述内容除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.3 小节 示例:80 06 00 01 00 00 40 00 示例:00 05 0B 00 00 00 00 00 设备收到设置地址请求时,直接进入状态过程,等待主机读取 0 长度的状态数据包。 示例:00 09 01 00 00 00 00 00 设备描述符的结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.1 小节) 示例:当我们请求设备描述符时,设备返回的数据为:12 01 10 01 00 00 00 08 3C 41 07 21 15 01 01 02 00 01 关于厂商 ID: 每个 USB 设备至少有一个配置描述符。设备描述符中指明该设备有多少种配置。 配置描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.3 小节) bmAttributes 可取值为: 示例:配置描述符集合(视频 12:28 处) 接口描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.5 小节) 端点描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.6 小节) bEndpointAddress 说明: bmAttributes 说明: HID 描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《Device Class Definition for HID 1.11》 第 6.2.1 小节) 关于 bDescriptorType:表示 HID 描述符类型时为 0x21;表示下级描述符类型时,0x22 表示报告描述符,0x23 表示物理描述符。 示例:配置描述符(视频 12:32 处) USB 协议中,字符串描述符是可选的。描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.7 小节) 报告描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《Device Class Definition for HID 1.11》 第 6.2.2 小节)
前言
5 USB 标准请求
5.1 USB 标准设备请求的结构
5.2 GET_DESCRIPTOR 请求
来源:https://www.bilibili.com/video/BV1d5411J74M 第三讲的 06:31 处。80 表示请求输入,即设备到主机
06 表示 GET_DESCRIPTOR,获取描述符
00 01 低字节 00 表示索引号为 0;高字节 01 表示请求的描述符类型为 1,即设备描述符
00 00 wIndex 域只在获取字符串描述符时有用,表示字符串的语言 ID 号,除此外值为 0
40 00 应该为 0x0040,表示请求的设备描述符长度为 0x40,即 64 个字节
5.3 SET_ADDRESS 请求
来源:同上。00 表示请求输出,即输出待设置的地址
05 表示 SET_ADDRESS
0B 00 表示设置地址为 000B
00 00 未使用
00 00 无数据
主机成功读取状态数据包且用 ACK 响应后,设置启用新地址。5.4 SET_CONFIGURATION 请求
来源:视频 12:36 处00 表示请求输出,即设置配置
09 表示 SET_CONFIGURATION
01 00 0x0001,表示选中配置编号为 1 的配置。
00 00
00 00
6 设备描述符的实现
来源:视频 08:01 处12 表示描述符长度为 0x12,即 18 个字节
01 表示描述符类型为 01
10 01 表示 USB 协议版本为 USB 1.1,如 0x0200 为 USB2.0
00
00
00
08 端点 0 最大包长为 8,可取值为 8,16,32,64
3C 41 表示厂商 ID 为 0x413C
07 21 表示产品 ID 为 0x2107
15 01 表示设备版本号为 1.15
01
02
00
01 表示设备有多少种配置
需要向 USB 申请,我们可以去 https://www.usb.org/developers 查看,去 “Valid USB Vendor ID Numbers” 里下载一个文档,根据上述厂商 ID 来查询该设备的生产商。9 配置描述符集合的结构
9.1 配置描述符结构
bit7: 保留,设置为 1
bit6: 0,设备由总线供电;1,设备自供电。
bit5: 是否支持远程唤醒
bit[4:0]:保留,设置为 0
# 获取配置描述符 9 个字节(解析见 GET_DESCRIPTOR 请求)
80 06 00 02 00 00 09 00
# 设备返回的配置描述符
09 表示描述符长度为 9
02 表示描述符类型,配置描述符为 0x02
22 00 表示配置描述符集合总长度为 0x0022,即 34 字节
01 表示该配置支持的接口数为 1(功能单一设备只有一个接口,而复合设备有多个接口,如音频设备)
01 表示配置的值,每个配置的标识(设置配置时,如果匹配该配置值,则表示选中该配置)
00 表示字符串索引值,0 表示没有字符串
A0 表示设备属性。
32 表示设备需要从总线获取的最大电流量,单位 2mA。这里表示 0x32*2=100mA
9.2 接口描述符的结构
9.3 端点描述符的结构
bit7: 传输方向。1,输入;0,输出;
bit[6:4]:保留
bit[3:0]:端点号
bit[7:6]:保留。
bit[5:4]:等时传输时表示用途。0,数据端点;1,反馈端点;2,数据端点;3,保留。其它传输时保留。
bit[3:2]:等时传输时表示同步类型。0,无同步;1,异步;2,适配;3,同步。其它传输时保留
bit[1:0]:传输类型。0,控制传输;1,等时传输;2,批量传输;3,中断传输。
9.4 HID 描述符的结构
9.5 [示例:描述符]
# 获取配置描述符 34 个字节(解析见 GET_DESCRIPTOR 请求)
80 06 00 02 00 00 22 00
# 设备返回
# (1)配置描述符
09 表示描述符长度为 9
02 表示描述符类型,配置描述符为 0x02
22 00 表示配置描述符集合总长度为 0x0022,即 34 字节
01 表示该配置支持的接口数为 1(功能单一设备只有一个接口,而复合设备有多个接口,如音频设备)
01 表示配置的值,每个配置的标识(设置配置时,如果匹配该配置值,则表示选中该配置)
00 表示字符串索引值,0 表示没有字符串
A0 表示设备属性。
32 表示设备需要从总线获取的最大电流量,单位 2mA。这里表示 0x32*2=100mA
# (2)接口描述符
09 长度
04 类型,0x04 表示接口描述符
00 接口编号,从 0 开始
00 接口备用编号
01 接口使用的端点数(不包括端点 0)
03 接口使用的类
01 接口使用的子类
01 接口使用协议
00 接口字符串索引
# (3)HID 描述符
09 长度
21 类型,0x21 表示 HID 描述符
10 01 HID 协议版本,1.1
00 国家代码
01 下级描述符数量为 1
22 下级描述符类型为 “报告描述符”
41 00 下级描述符长度为 65 个字节
# (3)端点描述符
07 长度
05 类型,0x05 表示端点描述符
81 端点地址。表示输入且端点号为 1
03 端点属性。表示中断传输
08 00 端点支持的最大包长,这里为 0x0008
0A 端点查询时间
11 字符串及语言 ID 请求的实现
13 报告描述符的结构及实现