1. 课程导论:USB协议基础回顾、USB Host控制器类型与课程目标
1.1 USB协议基础回顾
USB(Universal Serial Bus)自1996年问世以来,已成为嵌入式系统与PC平台最通用的外设连接标准。理解USB协议的核心分层模型是分析Host驱动移植差异的前提。
核心要点:USB协议采用分层架构,从物理层到功能层逐级抽象,Host端与Device端通过管道(Pipe)进行逻辑通信。
1.1.1 USB系统拓扑结构
USB系统采用星形-菊花链混合拓扑,Host控制器位于根集线器(Root Hub)之上,最多支持127个设备(含Hub)。
1.1.2 USB通信模型与传输类型
USB采用轮询式总线,所有通信由Host发起。端点(Endpoint)是设备端通信的基本单元,通过管道与Host的软件缓冲区连接。
| 传输类型 | 特点 | 典型应用 | 带宽保证 |
|---|---|---|---|
| 控制传输 | 双向、可靠、用于枚举与配置 | 设备描述符获取、Set Address | 10% 保留 |
| 批量传输 | 可靠、非实时、尽力而为 | U盘、打印机、以太网适配器 | 无保证 |
| 中断传输 | 低延迟、轮询、有保证 | 键盘、鼠标、游戏手柄 | ≤90% 帧时间 |
| 等时传输 | 实时、无重传、固定带宽 | 音频、视频、摄像头 | 预先分配 |
RTOS移植提示:在RTOS环境下,中断传输和等时传输的实时性要求更高,Host驱动需要适配RTOS的中断管理机制,避免在中断上下文中执行耗时操作。
1.2 USB Host控制器类型:OHCI / EHCI / xHCI
USB Host控制器是硬件层面的总线主控单元,其寄存器接口与描述符格式直接决定了驱动软件架构。主流控制器规范包括OHCI、EHCI和xHCI,分别对应USB 1.x、2.0和3.x时代。
1.2.1 三种控制器规范对比
| 特性 | OHCI | EHCI | xHCI |
|---|---|---|---|
| 支持USB版本 | USB 1.1 (Full/Low Speed) | USB 2.0 (High Speed) | USB 3.x / 2.0 / 1.1 |
| 速度 | 12 Mbps / 1.5 Mbps | 480 Mbps | 5 Gbps / 10 Gbps / 20 Gbps |
| 描述符结构 | ED(端点描述符)+ TD(传输描述符) | qTD(队列传输描述符)+ qH(队列头) | TRB(传输请求块)+ 分段环 |
| 调度方式 | 软件调度 + 硬件帧列表 | 异步列表 + 周期列表(硬件调度) | 硬件调度 + 中断事件环 |
| 中断处理 | 每帧中断 | 中断聚合(可配置) | MSI-X / 中断聚合 |
| 典型SoC | NXP i.MX28, STM32MP1 | TI AM335x, NXP i.MX6 | Renesas R-Car, Intel Apollo Lake |
1.2.2 控制器选择对驱动移植的影响
不同控制器规范在描述符管理、中断模型和DMA操作上存在显著差异,这些差异直接决定了Linux内核驱动与RTOS驱动在移植时的改造工作量。
- OHCI:软件需要维护ED/TD链表,中断频率高,适合对实时性要求不高的低功耗场景。RTOS移植时需注意链表操作的原子性。
- EHCI:硬件维护qTD队列,支持异步/周期列表调度,中断聚合降低CPU负载。RTOS下需适配中断聚合定时器。
- xHCI:使用TRB环和事件环,支持MSI-X中断,硬件完成大部分调度。RTOS移植重点在于事件环的轮询与中断协同。
移植避坑:在RTOS中,xHCI的事件环(Event Ring)通常需要与中断服务线程(IST)配合使用,避免在ISR中直接处理TRB完成事件,否则可能导致优先级反转。
1.3 课程目标与学习路径
1.3.1 课程核心目标
本课程旨在帮助嵌入式开发者系统掌握Linux USB Host驱动框架,并理解将其移植到RTOS环境时的关键差异与工程实践。完成本课程后,学员应能够:
- 理解USB协议栈分层:从物理层到功能层的完整数据流。
- 掌握Linux USB Host驱动架构:包括HCD(Host Controller Driver)、usbcore、usb-storage等核心模块。
- 分析RTOS移植差异:涵盖中断管理、内存管理、DMA一致性、调度模型等关键维度。
- 独立完成移植项目:针对OHCI/EHCI/xHCI控制器,在FreeRTOS或RT-Thread上实现最小可用的Host驱动。
1.3.2 学习路径与章节规划
| 阶段 | 章节范围 | 核心内容 | 实践产出 |
|---|---|---|---|
| 基础篇 | 第1-4章 | USB协议、控制器规范、Linux USB驱动框架 | 搭建Linux USB Host驱动实验环境 |
| 深入篇 | 第5-12章 | HCD实现、URB处理、DMA与中断、设备枚举 | 完成OHCI/EHCI/xHCI驱动代码分析 |
| 移植篇 | 第13-22章 | RTOS中断适配、内存管理、调度差异、驱动封装 | 在RT-Thread上移植xHCI驱动 |
| 实战篇 | 第23-30章 | U盘、HID、CDC-ACM设备驱动移植与调试 | 完成USB Host综合移植项目 |
1.3.3 预备知识要求
为获得最佳学习效果,建议学员具备以下基础:
- 熟悉C语言编程,了解指针、链表、回调函数等基础概念。
- 了解Linux内核模块开发基础(如module_init、file_operations)。
- 有RTOS使用经验(FreeRTOS、RT-Thread或uC/OS-II均可)。
- 了解基本的总线协议概念(I2C、SPI或PCIe经验更佳)。
学习建议:每章结束后,建议在真实硬件(如STM32MP157、NXP i.MX8M或Raspberry Pi)上运行配套实验代码,将理论分析与实际调试结合,加深对移植差异的理解。