嵌入式Linux USB Gadget驱动开发与平台适配 - 第1节
1.1 USB总线拓扑结构
USB(Universal Serial Bus)采用星形-级联拓扑结构,由一个主机(Host)和最多127个设备(Device)组成。物理上通过集线器(Hub)扩展端口,逻辑上呈现分层的树形结构。
核心要点:USB拓扑中主机是唯一的总线主控者,所有通信都由主机发起,设备不能主动向主机发送数据。
1.1.1 主机与设备角色
| 角色 |
功能描述 |
典型组件 |
| USB 主机 (Host) |
总线主控者,负责调度所有传输、管理带宽、检测设备插拔 |
主机控制器 (HC)、根集线器 (Root Hub) |
| USB 设备 (Device) |
响应主机请求,不能主动发起通信;分为功能设备和集线器 |
U盘、鼠标、键盘、摄像头、串口转换器 |
| 集线器 (Hub) |
端口扩展器,负责转发信号、检测设备连接/断开、电源管理 |
根集线器、外部集线器 |
嵌入式视角:在嵌入式 Linux 系统中,USB Gadget 驱动让设备可以扮演 USB 设备 角色(如模拟串口、网卡、U盘),而 USB Host 驱动则让设备可以连接外部 USB 外设。一个硬件平台可以同时具备 Host 和 Device 两种能力(OTG)。
1.2 USB物理层与电气特性
USB 物理层定义了电缆、连接器、信号电平、编码方式等底层规范。理解物理层是进行硬件调试和驱动开发的基础。
1.2.1 电缆与连接器
USB 电缆包含 4 根导线(USB 2.0 及以下):
- VBUS(红色):+5V 电源线,提供总线供电
- GND(黑色):地线
- D+(绿色):差分数据正信号
- D-(白色):差分数据负信号
注意:USB 3.0/3.1/3.2 增加了额外的超高速差分对(SSTX+/-、SSRX+/-),共 9 根导线。在 Gadget 驱动开发中,通常以 USB 2.0 为基础,再扩展支持超高速模式。
1.2.2 信号电平与编码
| 参数 |
USB 1.0/1.1 (Low/Full Speed) |
USB 2.0 (High Speed) |
| 信号电平 |
0 ~ 3.3V(差分) |
0 ~ 400mV(差分) |
| 数据速率 |
1.5 Mbps / 12 Mbps |
480 Mbps |
| 编码方式 |
NRZI + 位填充 |
NRZI + 位填充 |
| 终端电阻 |
D+ 上拉 1.5kΩ(全速) D- 上拉 1.5kΩ(低速) |
D+ 和 D- 各接 45Ω 到地 |
NRZI 编码:Non-Return-to-Zero Inverted。数据位为 0 时信号翻转,数据位为 1 时信号保持不变。配合位填充(Bit Stuffing)机制,在连续 6 个 1 后插入一个 0,保证接收端时钟同步。
1.2.3 设备速度检测机制
USB 主机通过检测 D+ 和 D- 线上的上拉电阻 来判断设备速度:
- 低速设备(1.5 Mbps):D- 线上拉到 3.3V
- 全速设备(12 Mbps):D+ 线上拉到 3.3V
- 高速设备(480 Mbps):先以全速握手,再切换到高速模式(D+ 上拉 45Ω 到地)
1.3 USB 主机与设备角色详解
在 USB 协议中,主机(Host) 和 设备(Device) 的角色是严格不对等的。这种设计简化了设备侧的硬件和软件复杂度,但将调度负担全部放在主机侧。
1.3.1 主机职责
- 检测设备插拔:通过根集线器端口状态变化检测
- 枚举设备:分配地址、读取描述符、加载驱动
- 调度传输:管理帧/微帧时间片,分配总线带宽
- 电源管理:控制总线供电、挂起/唤醒
- 错误处理:重试、复位、断开设备
1.3.2 设备职责
- 响应主机请求:被动接收并处理主机发起的控制传输
- 报告状态:通过端点(Endpoint)返回数据或状态
- 电源管理:支持挂起/唤醒(远程唤醒需主机允许)
Gadget 驱动核心:在嵌入式 Linux 中,USB Gadget 驱动让设备侧模拟出标准 USB 设备的行为。开发者需要实现描述符(设备描述符、配置描述符、接口描述符、端点描述符)和端点处理函数,让主机能够正确识别和通信。
1.4 本章小结
| 知识点 |
关键内容 |
| USB 拓扑 |
星形-级联结构,1 个主机 + 最多 127 个设备,最多 7 层 |
| 主机角色 |
总线主控者,负责调度、枚举、电源管理 |
| 设备角色 |
被动响应,通过端点与主机通信 |
| 物理层 |
4 线(VBUS/GND/D+/D-),NRZI 编码,差分信号 |
| 速度检测 |
通过 D+/D- 上拉电阻判断速度,高速需额外握手 |
下章预告:第 2 章将深入 USB 协议栈的数据传输模型,包括端点类型、传输事务、帧/微帧结构,以及 Linux 内核中 USB 核心层的实现框架。