头图
《圈圈教你学 USB》第 3 章学习笔记

前言

说明:本文章节顺序按照 《圈圈教你学USB》 一书的学习顺序来组织,其中跳过了硬件代码相关的章节。

参考:

5 USB 标准请求

USB 协议定义了一个 8 字节的标准设备请求,主要用在设备的枚举过程中,是在控制传输的SETUP(建立)过程中,通过默认控制端点 0 发出的。

5.1 USB 标准设备请求的结构

1)标准设备请求的结构:

2)标准设备请求:

3)bRequest 请求代码如下表:

4)描述符类型(Descriptor Types)如下表:

上述内容除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.3 小节

5.2 GET_DESCRIPTOR 请求

示例:80 06 00 01 00 00 40 00
来源:B 站 沁恒微电子《USB技术应用与开发》 第三讲的 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 0B 00 00 00 00 00
来源:同上。

00    表示请求输出,即输出待设置的地址 
05    表示 SET_ADDRESS
0B 00 表示设置地址为 000B
00 00 未使用
00 00 无数据
设备收到设置地址请求时,直接进入状态过程,等待主机读取 0 长度的状态数据包。
主机成功读取状态数据包且用 ACK 响应后,设置启用新地址。

5.4 SET_CONFIGURATION 请求

示例:00 09 01 00 00 00 00 00
来源:视频 12:36 处

00    表示请求输出,即设置配置
09    表示 SET_CONFIGURATION 
01 00 0x0001,表示选中配置编号为 1 的配置。
00 00 
00 00 

6 设备描述符的实现

设备描述符的结构:(除《圈圈教你学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
来源:视频 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    表示设备有多少种配置
关于厂商 ID:
需要向 USB 申请,我们可以去 https://www.usb.org/developers 查看,去 “Valid USB Vendor ID Numbers” 里下载一个文档,根据上述厂商 ID 来查询该设备的生产商。

9 配置描述符集合的结构

每个 USB 设备至少有一个配置描述符。设备描述符中指明该设备有多少种配置。

9.1 配置描述符结构

配置描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.3 小节)

bmAttributes 可取值为:
bit7:    保留,设置为 1
bit6:    0,设备由总线供电;1,设备自供电。
bit5:    是否支持远程唤醒
bit[4:0]:保留,设置为 0
示例:配置描述符集合(视频 12:28 处)
# 获取配置描述符 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 接口描述符的结构

接口描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.5 小节)

9.3 端点描述符的结构

端点描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.6 小节)

bEndpointAddress 说明:
bit7:    传输方向。1,输入;0,输出;
bit[6:4]:保留
bit[3:0]:端点号
bmAttributes 说明:
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 描述符的结构

HID 描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《Device Class Definition for HID 1.11》 第 6.2.1 小节)

关于 bDescriptorType:表示 HID 描述符类型时为 0x21;表示下级描述符类型时,0x22 表示报告描述符,0x23 表示物理描述符。

9.5 [示例:描述符]

示例:配置描述符(视频 12:32 处)
# 获取配置描述符 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 请求的实现

USB 协议中,字符串描述符是可选的。描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.7 小节)

13 报告描述符的结构及实现

报告描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《Device Class Definition for HID 1.11》 第 6.2.2 小节)

送南阳马生序
7 声望3 粉丝

余之业有不精、德有不成,非天质之卑,则心不若他之专耳,岂他人之过哉!