USB硬件模块必要的寄存器有哪些?
USB硬件模块必要的寄存器有哪些?
| 作者 | 将狼才鲸 |
|---|---|
| 日期 | 2025-11-28 |
CSDN阅读地址
前言
- 许多想学习USB驱动的人,一看到芯片里USB模块的寄存器(IP文档)有一百多个或者好几百个,看得头大,顿时就退缩了;而当看到USB协议栈里密密麻麻的源文件,还有什么UTMI、EHCI等接口后也觉得复杂;
- 但其实USB驱动只需要把控制器+PHY与协议栈的接口匹配好就行,因此实际核心的内容不多;
- 也就是位、域、包、事务、传输这五层中实现到事务,或者到包这一层的处理;
- 物理层由控制器和PHY组成,USB1.0低速/USB1.1全速时PHY可以由GPIO模拟出来,USB2.0高速及以后必须要用专门的PHY芯片;
- 下面介绍了控制器+PHY中必要的寄存器;
- 寄存器信息参考自开源IP核cores:
- ultraembedded/cores 包含USB HOST/DEVICE/FS,Various HDL (Verilog) IP Cores
- mirrors_ultraembedded/cores
- 里面除了Verilog的IP核外,还有USB协议栈中HCD层的C代码,至于完整的USB协议栈并没有给出。
Device端寄存器:
| 地址偏移 | 寄存器名称(32bit) | 描述 |
|---|---|---|
| 0x00 | USB_FUNC_CTRL | [RW] Control Register 控制寄存器(设备挂载等) |
| 0x04 | USB_FUNC_STAT | [RW] Status Register 状态寄存器 |
| 0x08 | USB_FUNC_ADDR | [RW] Address Register 地址寄存器 |
| 0x0c | USB_EP0_CFG | [RW] Endpoint 0 Configuration 端点配置(有多少个端点就有多少组寄存器) |
| 0x10 | USB_EP0_TX_CTRL | [RW] Endpoint 0 Tx Control 端点发送控制 |
| 0x14 | USB_EP0_RX_CTRL | [W] Endpoint 0 Rx Control 端点接收控制 |
| 0x18 | USB_EP0_STS | [R] Endpoint 0 status 端点状态寄存器 |
| 0x1c | USB_EP0_DATA | [RW] Endpoint Data FIFO 端点数据 |
| 0x20 | USB_EPn_CFG | [RW] Endpoint n Configuration |
| 0x24 | USB_EPn_TX_CTRL | [RW] Endpoint n Tx Control |
| 0x28 | USB_EPn_RX_CTRL | [W] Endpoint n Rx Control |
| 0x2c | USB_EPn_STS | [R] Endpoint n status |
| 0x30 | USB_EPn_DATA | [RW] Endpoint n Data FIFO |
Register: USB_FUNC_CTRL 控制寄存器
| 比特 | 名称 | 描述 |
|---|---|---|
| 8 | HS_CHIRP_EN | High-speed Chirp Enable 高速啁啾(需外接PHY,留作扩展用,SE0帧后发送) |
| 7 | PHY_DMPULLDOWN | UTMI PHY D- Pulldown Enable D-主动下拉,默认是上拉的 |
| 6 | PHY_DPPULLDOWN | UTMI PHY D+ Pulldown Enable D+主动下拉,默认是上拉的 |
| 5 | PHY_TERMSELECT | UTMI PHY Termination Select 启动端接电阻(区分低速全速,设备D+或D-上拉,主机则是下拉) |
| 4:3 | PHY_XCVRSELECT | UTMI PHY Transceiver Select 收发器使能 |
| 2:1 | PHY_OPMODE | UTMI PHY Output Mode 输出模式(0低速、1全速、2高速、3无) |
| 0 | INT_EN_SOF | Interrupt enable - SOF reception 中断使能 |
Register: USB_FUNC_STAT 状态寄存器
| 比特 | 名称 | 描述 |
|---|---|---|
| 13 | RST | USB Reset Detected (cleared on write) 获取主机的复位状态,处理后写清零 |
| 12:11 | LINESTATE | USB line state (bit 1 = D+, bit 0 = D-) D+D-值,用于判断高速啁啾正常(留作扩展用) |
| 10:0 | FRAME | Frame number 帧号 |
Register: USB_FUNC_ADDR 地址寄存器
| 比特 | 名称 | 描述 |
|---|---|---|
| 6:0 | DEV_ADDR | Device address 设备地址 |
Register: USB_EPx_CFG 端点配置
| 比特 | 名称 | 描述 |
|---|---|---|
| 3 | INT_RX | Interrupt on Rx ready 接收完成 |
| 2 | INT_TX | Interrupt on Tx complete 发送完成 |
| 1 | STALL_EP | Stall endpoint 设备进入中止状态 |
| 0 | ISO | Isochronous endpoint 同步端点(例如多媒体数据流) |
Register: USB_EPx_TX_CTRL 端点发送控制
| 比特 | 名称 | 描述 |
|---|---|---|
| 17 | TX_FLUSH | Invalidate Tx buffer 使发送缓存无效(清缓存) |
| 16 | TX_START | Transmit start - enable transmit of endpoint data 传输开始 |
| 10:0 | TX_LEN | Transmit length 传输长度 |
Register: USB_EPx_RX_CTRL 端点接收控制
| 比特 | 名称 | 描述 |
|---|---|---|
| 1 | RX_FLUSH | Invalidate Rx buffer 使接收缓存无效(清缓存) |
| 0 | RX_ACCEPT | Receive data accepted (read) 接收到数据 |
Register: USB_EPx_STS 端点状态
| 比特 | 名称 | 描述 |
|---|---|---|
| 20 | TX_ERR | Transmit error (buffer underrun) 发送错误(如underflow) |
| 19 | TX_BUSY | Transmit busy (active) 发送忙 |
| 18 | RX_ERR | Receive error - CRC mismatch or buffer overflow 接收错误(如CRC错误) |
| 17 | RX_SETUP | SETUP request received 接收到SETUP令牌包 |
| 16 | RX_READY | Receive ready (data available) 接收成功 |
| 10:0 | RX_COUNT | Endpoint received length (RD) 端点接收到的长度 |
Register: USB_EPx_DATA 端点数据
| 比特 | 名称 | 描述 |
|---|---|---|
| 7:0 | DATA | Read or write from Rx or Tx endpoint FIFO 读写的数据 |
- Ddevice端流程:
寄存器初始化(清收发缓存、进入低速/全速、D+或D-上拉);
循环读状态寄存器:识别复位,有复位则清空缓存,重新开启关闭收发器,并将D-或D+的上拉电阻脱离一端时间;
循环读指定端点状态寄存器:
1. 识别发送、接收错误;
2. 识别令牌包的到达并进行处理;
3. 识别OUT包并开始发数据。
Host寄存器:
| 地址偏移 | 寄存器名称(32bit) | 描述 |
|---|---|---|
| 0x00 | USB_CTRL | [RW] Control of USB reset, SOF and Tx FIFO flush 控制寄存器 |
| 0x04 | USB_STATUS | [R] Line state, Rx error status and frame time 状态寄存器 |
| 0x08 | USB_IRQ_ACK | [W] Acknowledge IRQ by setting relevant bit 中断响应寄存器 |
| 0x0c | USB_IRQ_STS | [R] Interrupt status 中断状态寄存器 |
| 0x10 | USB_IRQ_MASK | [RW] Interrupt mask 中断屏蔽 |
| 0x14 | USB_XFER_DATA | [RW] Tx payload transfer length 发送数据长度 |
| 0x18 | USB_XFER_TOKEN | [RW] Transfer control info (direction, type) 传输控制信息 |
| 0x1c | USB_RX_STAT | [R] Transfer status (Rx length, error, idle) 接收状态 |
| 0x20 | USB_WR_DATA | [W] Tx FIFO address for write data 写的数据 |
| 0x20 | USB_RD_DATA | [R] Tx FIFO address for read data 收的数据 |
Register: USB_CTRL 控制寄存器
| 比特 | 名称 | 描述 |
|---|---|---|
| 8 | TX_FLUSH | Flush Tx FIFO 清发送缓存 |
| 7 | PHY_DMPULLDOWN | UTMI PHY D- Pulldown Enable 下拉D- |
| 6 | PHY_DPPULLDOWN | UTMI PHY D+ Pulldown Enable 下拉D+ |
| 5 | PHY_TERMSELECT | UTMI PHY Termination Select 启动端接电阻 |
| 4:3 | PHY_XCVRSELECT | UTMI PHY Transceiver Select 启动收发器 |
| 2:1 | PHY_OPMODE | UTMI PHY Output Mode 模式:0低速、1全速、2高速、3无 |
| 0 | ENABLE_SOF | Enable SOF (start of frame) packet generation 使能SOF起始帧生成 |
Register: USB_STATUS 状态寄存器
| 比特 | 名称 | 描述 |
|---|---|---|
| 31:16 | SOF_TIME | Current frame time (0 - 48000) 当前帧时间 |
| 2 | RX_ERROR | Rx error detected (UTMI). Clear on new xfer. 接收错误 |
| 1:0 | LINESTATE_BITS | Line state (1 = D-, 0 = D+) 当前D+D-电平 |
Register: USB_IRQ_ACK 中断响应寄存器
| 比特 | 名称 | 描述 |
|---|---|---|
| 3 | DEVICE_DETECT | Interrupt on device detect (linestate != SE0). 设备检测 |
| 2 | ERR | Interrupt on error conditions. 错误 |
| 1 | DONE | Interrupt on transfer completion. 传输完成 |
| 0 | SOF | Interrupt on start of frame. 帧开始 |
Register: USB_IRQ_STS 中断状态寄存器
| 比特 | 名称 | 描述 |
|---|---|---|
| 3 | DEVICE_DETECT | Interrupt on device detect (linestate != SE0). 设备检测 |
| 2 | ERR | Interrupt on error conditions. 错误 |
| 1 | DONE | Interrupt on transfer completion. 传输完成 |
| 0 | SOF | Interrupt on start of frame. 帧开始 |
Register: USB_IRQ_MASK 中断屏蔽寄存器
| 比特 | 名称 | 描述 |
|---|---|---|
| 3 | DEVICE_DETECT | Interrupt on device detect (linestate != SE0). 设备检测 |
| 2 | ERR | Interrupt on error conditions. 错误 |
| 1 | DONE | Interrupt on transfer completion. 传输完成 |
| 0 | SOF | Interrupt on start of frame. 帧开始 |
Register: USB_XFER_DATA 发送数据长度
| 比特 | 名称 | 描述 |
|---|---|---|
| 15:0 | TX_LEN | Tx transfer data length 发送数据长度 |
Register: USB_XFER_TOKEN 令牌包传输
| 比特 | 名称 | 描述 |
|---|---|---|
| 31 | START | Transfer start request 传输开始 |
| 30 | IN | IN transfer (1) or OUT transfer (0) 数据输入 |
| 29 | ACK | Send ACK in response to IN data 令牌包响应 |
| 28 | PID_DATAX | DATA1 (1) or DATA0 (0) PID数据类型 |
| 23:16 | PID_BITS | Token PID (SETUP=0x2d, OUT=0xE1 or IN=0x69) 令牌包命令值 |
| 15:9 | DEV_ADDR | Device address 设备地址 |
| 8:5 | EP_ADDR | Endpoint address 端点地址 |
Register: USB_RX_STAT 接收状态寄存器
| 比特 | 名称 | 描述 |
|---|---|---|
| 31 | START_PEND | Transfer start pending 一个USB传输请求已经被主机控制器驱动接受,并且已经排入调度队列,但尚未被物理硬件(主机控制器)真正开始执行 |
| 30 | CRC_ERR | CRC error detected 校验错误 |
| 29 | RESP_TIMEOUT | Response timeout detected (no response) 超时 |
| 28 | IDLE | SIE idle 空闲 |
| 23:16 | RESP_BITS | Received response PID PID响应 |
| 15:0 | COUNT_BITS | Received data count 接收长度 |
Register: USB_WR_DATA 写数据
| 比特 | 名称 | 描述 |
|---|---|---|
| 7:0 | DATA | Date byte 写的数据 |
Register: USB_RD_DATA 读数据
| 比特 | 名称 | 描述 |
|---|---|---|
| 7:0 | DATA | Date byte 读的数据 |
- Host端流程:
- 这里只能提供出HCD (Host Controller Driver),USB协议栈的最底层接口;其它包含文件系统、U盘识别与读写的部分还需移植完整的USB协议栈。
- 可以使用标准接口(UHCI, OHCI, EHCI, xHCI),也可以自定义接口,此处建议用自定义接口。
