hooku

Please enjoy some eccentric technologies.

USB笔记

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 包的类型:

  1. In: 通知Device Host想要读取信息
  2. Out: 通知Device Host想要发送信息
  3. Setup: 开始传输控制
Data(数据包)

Data包:

Sync PID Data CRC16 EOP

Data包的类型:

  1. Data0
  2. Data1
  3. Data2 (High Speed)
  4. MDATA (High Speed)
速度 Data载荷
Low Speed 8B
Full Speed 1023B
High Speed 1024B
Handshake(握手包)

Handshaka包:

Sync PID EOP

Handshaka包的类型:

  1. ACK: 包成功接收
  2. NAK: 表示Device不能发送或接收数据或者Host没有数据需要发送/remove
  3. STALL: 表示当前Device的状态需要Host干预
SOF (Start of Frame Marker)

Host每隔1ms发送一次SOF,用于作为Device的时间基准,以及防止Device进入Suspend State(作Keep-alive用)。?

USB 1.1 Host控制器接口Spec

分为两种:

  1. UHCI(Universal Host Controller Interface),支持LS、FS,更依赖软件,PC中较为常见。
  2. 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

  1. 等待USB Port稳定

Hub驱动会至少等100ms来确保Port连接稳定。如果超过200ms仍然没有稳定,Hub驱动将不会进行枚举,并且会禁用该。

  1. 发出第一个Port Reset

Port的状态变为Connected & Enabled,USB Device会响应地址为0的请求。

  1. 发出第一个Device Descriptor Request

  2. 发出第二个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?