一、基本概念
- 通用串行总线
- usb1.0 ,1.5Mbps,低速设备(LS)
- usb1.1 ,12Mbps,全速设备(FS)
- usb2.0,480Mbps,高速设备(HS)。同时2.0支持LS、FS、HS
- usb3.0,5Gbps,极速设备
- usb3.1,10Gbps,超速设备
二、拓扑结构
- Usb是一种主从设备,通信只能发生在主从之间。
- 集线器(hub)是usb主机拓展接口,电脑默认有usb根hub。
- usb2.0协议,规定最多扩展7层hub,设备总数不超过127。
- usb设备地址是7bit,范围是1-127,0地址不能用
三、电气属性
- usb传输特性
- usb在低速和全速模式下,采用的是电压传输模式;在高速模式下,采用的是电流传输模式。
- usb的实际传输速率比理论值要低,因为实际传输时,有很多协议开销
- 具体的数据传输任务由usb控制器实现
- usb热拔插检测机制
- usb的host的D+和D-接口都连接了15K的下拉电阻,slave的D+或D-外接了1.5K的上拉电阻。
- 当host与slave连接时,cpu在host接口的D+检测到高电平,说明是全速或高速设备
- cpu在host接口的D-检测到高电平,说明是低速设备
三、 usb包结构和传输过程
usb的四种传输类型:
- 批量传输、同步传输、中断传输、控制传输
- 批量、同步、中断传输,每完整传输一次数据称作一次事务
- 控制传输包括三个过程:建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务。
批量传输
用于数据量大,但实时性要求不高的场合
一次批量事务有三个阶段:
- 端点号记录了哪一种传输方式
- 批量输入时:设备收到主机应答,设备继续发送数据,PID(DATA0)累加为PID(DATA1)
- 发送后,未收到应当,会重新发,多次未收到,则启动退出机制退出
中断传输 - 这里的中断不是物理中断,而是由主机保证在不大于某个时间间隔内安排一次传输。主机实际上是靠轮询实现的
- 中断传输和批量传输的结构基本一样
同步传输 - 用于数据量大,实时性要求高,能容许少量的数据错误的场合。并有可能占用批量传输等的带宽,而优先满足同步传输的需要。
- 不能保证传输的数据%100正确,所以数据错误时,并不进行重传,也没有应答包,CRC错误时,由软件决定怎么处理。
控制传输 - 主要用于主从命令配置
- 建立过程:使用一个建立事务,SETUP+DATA0+ACK,建立过程实际就是输出数据
- 数据过程:可以没有数据过程,也可以有多笔数据事务,是由建立过程中的设置命令决定的
四、USB设备描述符及其枚举过程
描述符
描述了设备的各种行为和具体的参数类型等,能够让主机明确应该加载什么样的驱动,程序和设备之间进行怎样的操作
- 设备描述符
设备所描述的USB协议版本号、设备类型、端点0的最大包大小、厂商ID和产品ID、可能的配置数量等
- 配置描述符
设备对主机提出的配置需求,包括配置的编号、供电方式、接口数、是否支持远程唤醒、电流需求量等
-
接口描述符
-
端点描述符
-
字符串描述符
四、 USB驱动开发
主要有两类USB驱动开发
* USB设备驱动程序(USB device drivers):控制器端驱动(USB主机驱动),控制插入其中的USB设备
* USB器件驱动程序(USB gadget drivers):设备端驱动(USB设备驱动),控制该设备如何与主机通信
开发流程:
-
参考usb-skeleton.c,官方代码
-
定义一个struct usb_driver,并初始化
-
通过usb_register()注册
-
通过usb_unregister() 卸载
-
完成usb_device_id 与设备匹配的条件
-
USB数据传输过程
-
usb主机控制器获得 usb_device 信息,传递给 USB core,然后自动调用usb_driver
五、USB数据传输
USB请求块——URB
URB是用于描述与USB设备通信所用的基本载体和核心数据结构。
USB数据传输过程:
(USB设备驱动——>USB core——>USB主机控制器——>USB设备)
- 创建一个URB,usb_alloc_urb
- 初始化URB。【中断传输】usb_fill_int_urb;【批量】usb_fill_bulk_urb;【控制】usb_fill_control_urb;【同步】手动初始化URB
- 提交URB,usb_submit_urb
- 等待数据处理结果回调函数,
- 释放URB,usb_free_urb
USB基础
问1:USB设备插到电脑上,连接的是什么设备?
答:是USB控制器,是USB控制器内嵌的root hub
问2:主机插上USB设备后,为什么能知道设备的具体驱动?
答:主机的USB总线(控制器)驱动程序,会识别出插入的USB设备,并给设备找到对应的驱动程序
问3:USB设备总类非常多,为什么一接入电脑,就能识别出它的种类?
答:USB设备插入主机,主机会通过协议规范查询设备信息(描述符),设备返回描述符给主机。
问4:电脑上的USB设备很多,怎么分辨它们?
答:每插入一个USB设备,主机的USB控制器都会给它分配一个地址,主机每次访问设备,都会发出对应的地址
问5:USB设备刚接入PC,还没有地址编号,那么PC怎么把分配的地址编号告诉它
答:新接入的设备,默认地址是0
USB设备的状态切换过程
- USB设备插入,被控制器识别
- USB控制器发复位信息给USB设备
- 设备进入默认的工作状态,同时主从商量能否工作于高速模式?
- 控制器发送分配的地址给设备。
低速/全速信号电平
- 差分1: D+ > Voh && D- < Vol
- 差分0: D- > Voh && D+ < Vol
- 单边0(SE0): D+ < Vol && D- < Vol
- 单边1(SE1): D+ < Voh && D- < Voh
高速设备如何判断插拔
- 主机hub控制器检测 D+ 是高电平,将判断插入的设备是全速还是高速设备,步骤如下:
- hub端口会发出SE0信号,这就是复位信号
- 设备如果支持高速模式,就会返回K信号给Hub,
- 主机hub如果支持高速模式,会返回K-J信号(多个)给设备
- 若hub和设备都支持高速模式,设备就会把D+的上拉电阻断开,
那断开D+,设备断开了,怎么判断呢
若hub发送信号,反射回的信号无法衰减,说明设备已经断开。
数据信号
数据包组成:SOP + SYNC + Packet Content + EOP
低速/全速的SOP和EOP
- SOP:Start Of Packet,D+和D-从idle状态变为K状态的瞬间
- SYNC:3对KJ信号+2个K信号。用于传输时钟信号(传输速率)
- EOP
高速的SOP
NRZI与位填充
NRZI(反向不归0编码):要发送数据0,波形翻转;要发送数据1,波形不变。
位填充:以NRZI规则发送数据,当连续发6个1时,在后面加0,防止出错。
USB协议层数据格式
数据包格式:
SOP + SYNC + Packet Content + EOP
-
Packet Content 格式:
PID + 地址&端点 + 帧号 + 数据 + CRC。 (地址 、 帧号 、 数据不是同时出现) -
PID
- 由8位组成,前四位表示PID,后四位是对PID的取反。
- 4位可表示四大类,即16个小类包。
- 四大类:令牌类,数据类、握手类、特殊类。由bit1:0来表示
事务
主机:令牌包,数据包
设备:握手包ACK
USB传输
- 批量传输
- 保证数据的可靠性,不要求实时性。比如U盘
- 由一个事务实现
- 中断传输
- 保证数据的可靠性,要求实时性。可用于传输少量数据的场合,比如鼠标
- 由一个事务实现
- 实时传输
- 不保证数据的可靠性,要求实时性。比如摄像头
- 由一个事务实现
- 控制传输
- 由建立事务、批量事务组成,所有的USB设备都必须支持控制传输,用于"识别/枚举"
- 由多个事务组成