USB笔记

USB结构
USB是一种Tiered Start(分层星型)拓扑结构。
一个USB总线口最多能连接127个设备(包括HUB)(因Address Field是7b)。
USB最多能接6层,每层的线缆最大长度是5M(USB 1.1及以后的Spec移除了线缆长度限制),因此总的USB连线长度最大是6*5=30M。
所有的USB的初始通信都是由Host发出的,因此Device之间是不能直接通信的。
即使Device需要向Host发送数据,也需要等到Host下次轮询的时候才能发送。
唯一的特例是Device在Suspend模式下,能够主动向Host发送一个“远程唤醒”的信号。
USB电源
USB LS的最大线缆长度要比HS、FS的小。
Device、HUB只能从上游接口取电;
Self-powered(自供电) Device不从USB Bus取电。
使用USB Bus电源的设备称为"bus-powered" device,其能获取100mA的电流;在与Host协商完成后,最大可获取500mA的电流。
接口
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
Vbus | D- | D+ | ID | 地 |
USB版本与速度
速度 | 带宽 | 版本 |
---|---|---|
USB Low Speed | 1.5Mbps | 1.0 |
USB Full Speed | 12Mbps | 1.0 |
USB High Speed | 480Mbps | 2.0+ |
USB SuperSpeed | 5Gbps | 3.0+ |
USB SuperSpeedPlus | 10Gbps | 3.1+ |
SuperSpeed 与 SuperSpeedPlus
SuperSpeed总线能够以双向约460MB/s传输数据,SuperSpeedPlus则能够达1.1GB/s。
USB电气特性
USB使用NRZI编码方式,进行差分信号传输。
USB的数据以LSB的方式传输。
传输信号“1”:
发送方将D+下拉(>2.8V),并将D-上拉(<0.3V);
接收方把D+大于D- 200mV当作“1”,把D+小于D- 200mV当作“0”。
USB速度识别
当USB Device未插入时,D+和D-都是0V(因为USB Host端的D+/D-接了15K的下拉电阻接地。
- Full Speed: D+上拉至3.3V
- Low Speed: D-上拉至3.3V
- High Speed: 先作为Full Speed接入,随后协商进入High Speed
USB暂停模式(Suspend Mode)
所有的USB设备都必须支持暂停模式。
如果USB Device的bus连续3毫秒没有数据,将进入暂停模式。
USB每个单元(Unit)允许的最大电流为500uA。例如,某个设备配置为500mA的Max Power,并且启用了“远程唤醒”的功能,那该设备在Suspend模式下可以获取0.5*(500/100)=2.5mA的电流。
USB包
Token(令牌包)
Token包:
Sync | PID | ADDR | ENDP | CRC5 | EOP |
---|---|---|---|---|---|
- Sync: 同步头(Low & Full Speed:8位,High Speed:32位)
- PID: 包ID,标记包的类型,用以区分是Token、Data还是Handshake,以及其子类型;4位*2,传输两次PID,第二次取反,这样能够检测错误
- ADDR: 设备地址(1~127),地址0供还未分配ADDR的设备使用
- ENDP: Endpoint,4位
- EOP: End of Packet,SE0+J
Token 包的类型:
- In: 通知Device Host想要读取信息
- Out: 通知Device Host想要发送信息
- Setup: 开始传输控制
Data(数据包)
Data包:
Sync | PID | Data | CRC16 | EOP |
---|---|---|---|---|
Data包的类型:
- Data0
- Data1
- Data2 (High Speed)
- MDATA (High Speed)
速度 | Data载荷 |
---|---|
Low Speed | 8B |
Full Speed | 1023B |
High Speed | 1024B |
Handshake(握手包)
Handshaka包:
Sync | PID | EOP |
---|---|---|
Handshaka包的类型:
- ACK: 包成功接收
- NAK: 表示Device不能发送或接收数据
或者Host没有数据需要发送/remove
- STALL: 表示当前Device的状态需要Host干预
SOF (Start of Frame Marker)
Host每隔1ms发送一次SOF,用于作为Device的时间基准,以及防止Device进入Suspend State(作Keep-alive用)。?
USB 1.1 Host控制器接口Spec
分为两种:
- UHCI(Universal Host Controller Interface),支持LS、FS,更依赖软件,PC中较为常见。
- OHCI(Open Host Controller Interface),支持LS、FS,更依赖硬件,嵌入式设备中较常见。
USB 2.0 Host控制器接口Spec
EHCI(Enhanced Host Controller Interface),只支持HS,LS、FS的传输任务由UHCI或OHCI控制器完成。
USB Endpoint(EP)
USB Endpoint的长度是4b,因此最大EP个数是 2^4
,即16个。
Low Speed USB最多只能有4个EP。
所有的Device必须支持对EP0的操作,由于EP0负责了在USB枚举时所有的Device控制、状态请求。
USB的4种传输类型(EP类型)
4种传输类型的比较:
名称 | 错误检测 | 时间保证 | 支持Low Speed | 使用场景 | 说明 |
---|---|---|---|---|---|
Control | ? | ? | 是 | 命令传输、状态控制 | ? |
Bulk | 是(CRC16) | 否 | 否 | 大块数据传输 | 在USB总线空闲时,传输最快 |
Interrupt | ? | ? | 是 | ? | ? |
Isochronous(同步) | ? | ? | 否 | 有最大的带宽 |
Control传输
Setup Stage:
graph LR
token(SETUP) --> data(DATA0)
data --> hanshake(ACK)
Data Stage:
IN Transaction:
graph LR
token(IN) --> data1(DATA x)
data1 --> |传输正常完成|handshake(ACK)
token --> |传输出错|data2(STALL)
token --> |传输仍在进行|data3(NAK)
OUT Transaction:
graph LR
token(OUT) --> data(DATA x)
data --> |传输正常完成|handshake1(ACK)
data --> |传输出错|handshake2(STALL)
data --> |传输仍在进行|handshake3(NAK)
Status Stage:
IN Transaction:
graph LR
token(OUT) --> data(DATA0, 长度=0)
data --> |传输正常完成|handshake1(ACK)
data --> |传输出错|handshake2(STALL)
data --> |传输仍在进行|handshake3(NAK)
OUT Transaction:
graph LR
token(IN) --> |传输正常完成|data1(DATA0, 长度=0)
data1 --> handshake1(ACK)
token(IN) --> |传输出错|handshake2(STALL)
token(IN) --> |传输仍在进行|handshake3(NAK)
Interrupt传输
Isochronous传输
Bulk传输
USB 枚举
USB Pipe
Pipe(管道)指的是Host与EP之间的逻辑连接关系。
Pipe类型 | 传输格式 | 支持的传输类型 | 控制方 |
---|---|---|---|
Stream Pipe | USB协议没有定义其格式 | Bulk, Isochronous, Interupt | Host与Device |
Message Pipe | USB协议定义了其格式 | Control | 仅Host |
USB枚举
Windows7 对USB的枚举
Windows7系统默认的USB协议栈没有包括USB3.0
- 等待USB Port稳定
Hub驱动会至少等100ms来确保Port连接稳定。如果超过200ms仍然没有稳定,Hub驱动将不会进行枚举,并且会禁用该。
- 发出第一个Port Reset
Port的状态变为Connected & Enabled,USB Device会响应地址为0的请求。
发出第一个Device Descriptor Request
发出第二个Port Reset
i.MX6处理器的USB
i.MX6处理器的USB主要分为USB Controller以及USB 2.0 PHY两部分。
USB Controller
i.MX6的USB Controller符合USB 2.0的协议,支持High Speed(HS)、Full Speed(FS)以及Low Speed(LS)。 该Controller包含了两种Core:OTG Core以及Host Core(低端的处理器不包含此Core)。
Controller中包含了3个Core。
Core名称 | 别名 | 接口 | 连接的Port | 备注 |
---|---|---|---|---|
Core0 | OTG1 Core | UTMI | OTG1 Port | 支持充电检测(Charge Detection) |
Core1 | OTG2 Core | UTMI | OTG2 Port | 不支持充电检测 |
Core2 | Host1 Core | HSCI | Host1 Port |
每个Core都有其独立的中断向量表(除了USB wake-up(唤醒)中断);USB wake-up中断是由32K时钟驱动的Power Control模块触发的。
OTG Core可以工作在Host模式或者Device模式,其只能与UTMI接口的Phy连接,最大支持8个EP。
Host Core只能工作在Host模式,其只能与HSIC接口连接。
Controller支持两种工作模式:Normal Mode, Low Power Mode。
在Device模式下,Controller能够自动进入Suspend State,而在Host模式下,需要通过Software的方式进入Suspend State(包括OTG Core以及Host Core)。
从Suspend State唤醒时,USB的wake-up中断也能够用来激活ARM platform的时钟。
Host状态下Controller可在如下事件被唤醒:
事件 | 说明 |
---|---|
远程唤醒请求 | 设备在DP/DM上发送wake-up信号 |
电流过载 | Power Control模块检测到总线上的电流大于一定值(Descriptor预设值?) |
USB断开 | 设备断开连接导致DP/DM发生改变 |
USB连接 |
USB Controller的寄存器
Controller的寄存器分为以下三类:
寄存器类型 | 读/写 | 说明 |
---|---|---|
Identification类寄存器 | 只读? | 用于配置USB硬件参数 |
Capability类寄存器 | 只读 | 表明当前Controller的功能,以及哪些功能受到限制 |
Operational类寄存器 | 读/写/写入清除 | 控制Controller的功能 |
Host Data Structure(HDS)
HDS定义了HCD(Host Controller Driver)(软件)与EHC(Enhanced Host Controller)之间控制、传输的接口。
USB 2.0 PHY
i.MX6处理器内部有2个USB 2.0的PHY,支持HS,FS及LS;PHY使用标准的UTMI接口(16位,时钟频率30MHz),与USB Controller连接。
内部?PLL提供了120MHz的时钟源,UTMI进行4分频,获得30MHz的频率。
------------------ -------------------------------------------
| | <----- =Digital Receiver Analog Receiver = <----- USB D+/D-
| USB Controller | -----> =Digital Transmitter Analog Transmitter= -----> USB D-/D+
| | UTMI | USB PHY | USB Cable
------------------ -------------------------------------------
Digital Transmitter/Receiver
在USB HS时,Digital Transmitter从USB Controller接收16b的并行数据,并以30MHz的频率将其串行化为480Mb的HS数据(包括NRZI编码,位填充等);随后将结果输出至对应HS、FS、LS的Analog Transmitter。
Analog Receiver/Transmitter
- Analog Receiver主要包含了HS差分信号Receiver、静噪Detector、LS/FS差分信号Receiver、HS断开连接Detector、USB插入Detector、单端的USB_DP/USB_DN Receiver、9X过采样模块。
- Analog Transmitter主要包含了HS45Ω电阻、LS/FS差分驱动器、HS差分驱动器、1.5KΩ DP上拉电阻、15KΩ DP下拉电阻。
USB充电检测单元
- 数据线连接检测:当USB插头插入时,电源针脚(USB Vbus、GND)会比数据针脚(DP、DM)先连接上(因为他们长一点);充电检测单元提供了对DP、DM是否连接上的检测功能。
- 充电器类型检测:充电检测单元能够检测出当前的USB连接是否能进行充电。如果需要区分连接的到底是充电器还是电脑USB,可以通过拉高DP,并检测DN电平的方式来判断充电器类型。
- Deadly Battery Protect:在电池耗尽的设备上插入USB时,充电检测单元能够自动向PMIC报告是否连接到了充电器,使得PMIC能够从USB口获取大于100mA的电流。
参考
USB in a NutShell
USB human interface device class
USB Made Simple
USB Overview
How does USB stack enumerate a device?