前言
最近想学习一下USB的相关知识,然后看大家都比较推荐《圈圈教你玩USB》这本书作为入门资料,看了一个礼拜看到了USB键盘实现章节。因为USB的内容比较多也比较复杂,特写下此文进行梳理和总结,记录了一些圈圈书中的关键点以便日后复习和查询。如果想具体了解USB可以去看原书籍和官方手册。
1.1:USB特点
低速:1.5Mb/s 全速:12Mb/s 高速:480Mb/s
1.2:拓扑结构
主机(Host) | 一个或多个USB主控制器(host controller)和根集线器(root hub) |
主控制器 | 负责数据处理 |
根集线器 | 提供一个连接主控制器与设备之间的接口和通路 |
USB集线器(USB hub) | 对原有的USB口在数量上进行扩展 |
![](https://img-blog.csdnimg.cn/fcd2a32363434301a26f258ccf3aa6a5.png)
USB拓扑:塔顶为USB主控制器和根集线器,下面接USB集线器,USB集线器将一个USB口扩展为多个USB口,多个USB口又可以通过集线器扩展出更多的接口。
1.3:USB电器属性
USB连接线:VBus、D+、D-、GND,USB OTG在标准的基础上添加了一条ID线。低速和全速模式采用电压传输模式,在高速模式中则是采用电流传输模式。
USB使用的是NRZI编码,当数据为0时电平翻转;数据为1时电平不翻转。如果长时间电平不变化会经过位填充处理。
![](https://img-blog.csdnimg.cn/3373e036e1e14ff69428f510340a208a.png)
1.4:USB的插头和插座
1.5:USB插入检测机制
USB集线器的D+和D-分别接了个15kΩ的下拉电阻到地,在USB的设备端D+或D-上接了一个1.5kΩ的上拉电阻到3.3V(全速和高速设备的上拉电阻是接D+上的,低速设备的上拉电阻是接在D-上的)。当设备插入到集线器时,接了上拉电阻的那条数据线的电压由1.5kΩ和15kΩ的下拉电阻分压决定,大概是3V左右。这对集线器的接收端来说是一个高电平信号,当集线器检测到这个信号之后就告诉USB主控制器检测到设备插入了,集线器根据检测到被拉高的数据线是D+还是D-来判断插入的是什么速度类型的设备。
1.6:USB中的描述符及其之间的关系
USB1.1中定义的标准描述符:设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端点描述符(Endpoint Descriptor)以及字符串描述符(String Descriptor)。USB描述符之间的关系是一层一层的,最上层是设备描述符,接下来是配置描述符,再接下来是接口描述符,最下面是端点描述符(这里不讨论其他的描述符像HID之类的)。
1.7:USB枚举过程
枚举过程就是从设备读取各种标准描述符,以便于主机加载合适驱动、识别插入的是什么类型的设备。
1:USB主机检测到有USB设备插入后会先对USB设备进行复位,USB设备在复位之后其地址是0。USB主机往地址为0的设备的端点0(控制端点)发送获取设备描述符的标准请求(控制传输的SetUp过程)。设备收到该请求之后会按照主机请求的参数,将对应的设备描述符(前8个字节)返回给主机。主机成功获取对应描述符且没有错误之后会返回一个长度为0确认数据包。】
2:主机对设备进行再一次复位,进入设置地址阶段。USB主机往地址为0的设备的端点0发出一个设置地址的请求,新的设备地址包含在建立过程(SetUp)的数据包中。
3:主机在次获取设备描述符(全部18个字节),这次主机不再使用地址0来访问设备,而是使用新地址。
4:主机获取配置描述符,主机在获取到配置描述符后,根据配置描述符中所描述的配置集合长度,获取配置集合。配置集合包括配置描述符、接口描述符、类特殊描述符(HID等)、端点描述符等。接口描述符、类特殊描述符、接口描述符、端点描述符是不能单独获取的,必须跟配置描述符以一个集合的方式一并返回。如果还有字符串描述符,还要获取字符串描述符。
1.8:USB包结构及包分类
包结构共同点:同步域+包标识符(PID)+包结束符(EOP)
同步域:告诉接口引擎数据要开始传输了,同步主机端(Host)和设备端(Device)的时钟。全速设备和低速设备同步域使用7个0后面跟个1;对于高速设备同步域使用的是31个0后面跟个1。
包标识符PID:它总共有8位,USB协议使用的只有4位(PID0-PID3),另外4位(PID4-PID7)是PID0-PID3取反用来校验PID。
USB中规定了4类包:令牌包、数据包、握手包、特殊包,每种包内又有细分
令牌包中OUT、IN、SETUP包结构:
SOF包结构:
数据包结构:
DATA0和DATA1等不同类型的数据包可以用在握手包出错时纠错。当数据包成功发送或者接收时,数据包会进行切换,如果对方下一次使用的数据包类型跟自己的一致,则说明对方没有切换数据包的类型,也就是说,刚刚的数据包没有发送成功。
握手包:用来表示一个传输是否被对方确认,是一种最简单的数据包。
1.9:四种传输类型
USB中数据传输的基本单位是包,必须按照一定的关系将这些包组织成事务才能传输数据。事务通常由令牌包、数据包、握手包组成。
USB中的四种传输:批量传输、等时传输(音视频数据)、中断传输(HID设备)、控制传输(用于获取描述符),其中批量传输、中断传输、等时传输都是一个事务;控制传输包括三个过程(建立过程、状态过程分别是一个事务,数据过程可能包含多个事务)。
批量传输:
中断传输:
等时传输:
控制传输:
2:USB实例过程
USB定义了8字节标准设备请求,主要用在设备的枚举过程,这8字节数据是在控制传输的建立过程通过默认端点0发出的。
USB设备请求数据结构:
标准请求(bmRequestType中的D6-5为00)中又细分11中(bRequest)
各种标准请求的结构和8个字节每个部分的意义
重点介绍一下标准请求中的GET_DESCRIPTOR、SET_ADDRESS、SET_CONFIGURATION
GET_DESCRIPTOR:主机通过发送获取描述符请求来读取USB设备的各种描述符。GET_DESCRIPTOR请求结构如下
其中wValue的第二个字节表示描述符类型的编号
SET_ADDRESS请求结构如下
SET_CONFIGURATION请求结构如下
设备描述符的定义与实现
配置描述符、接口描述符、端点描述符、HID描述符( USB键盘)的定义与实现
HID中的报告描述符要参考具体的USB_HID协议
总结
以上就是本文的全部内容了,在这里也是很感谢圈圈帮我入门了USB。