1. USB Gadget驱动概述

1.1 USB Gadget框架简介

USB Gadget 是 Linux 内核中一套用于实现 设备端(Device Side) USB 功能的软件框架。与传统的 USB Host(主机)驱动不同,Gadget 框架允许嵌入式设备(如开发板、手机、IoT 网关)模拟成各种 USB 外设,例如 U 盘、以太网卡、串口或音频设备。

Gadget 框架的核心设计理念是 硬件无关性 与 功能可组合性。它将底层的 USB 控制器驱动(UDC,USB Device Controller)与上层的功能驱动(Function Driver)通过标准接口解耦,使得开发者无需关心具体硬件寄存器,即可快速实现自定义 USB 设备。

核心价值: Gadget 框架让嵌入式设备从“USB 使用者”转变为“USB 提供者”,极大地扩展了设备的互联能力。
USB Gadget 软件架构分层图 USB Gadget 软件架构分层 用户空间 (User Space) 应用程序 / 文件系统 / 网络协议栈 Gadget Function 驱动层 Mass Storage / Ethernet (ECM/RNDIS) / Serial (ACM) / Audio Gadget API / UDC Core (usb_gadget_probe_driver) 端点管理 / 请求队列 / 回调注册 UDC 硬件驱动层 (USB Device Controller) DMA / 中断处理 / 寄存器操作 USB 硬件 (D+/D- 收发器) 数据流向 用户 → 硬件

1.2 Gadget 与 Host 的区别

在 USB 体系中,Host(主机)与 Gadget(设备)的角色截然不同。理解两者的差异是进行驱动开发与性能优化的前提。

对比维度 USB Host(主机) USB Gadget(设备)
角色定位 总线主控,发起所有传输事务 从设备,响应主机请求
驱动框架 USB Core + HCD (Host Controller Driver) Gadget API + UDC (Device Controller Driver)
端点方向 OUT/IN 以主机视角定义 OUT/IN 以设备视角定义(与主机相反)
典型硬件 PC、笔记本、树莓派(Type-A 口) 手机、开发板(Type-C/OTG 口)
电源管理 提供 VBUS 电源 消耗 VBUS 电源
枚举过程 检测设备插入 → 复位 → 分配地址 → 读取描述符 等待主机复位 → 发送描述符 → 配置端点
开发提示: 在调试 Gadget 驱动时,务必牢记“设备视角”的端点方向。例如,主机端的 OUT 端点对应设备端的 IN 端点,反之亦然。方向混淆是导致数据传输失败的常见原因。
USB Host 与 Gadget 交互对比 USB Host 与 Gadget 交互对比 USB Host 发起事务 / 分配地址 提供 VBUS USB Gadget 响应请求 / 发送描述符 消耗 VBUS USB 总线 (D+/D-) 主机始终控制总线时钟与传输调度 Gadget 只能被动响应,不能主动发起事务

1.3 Gadget驱动的应用场景

Gadget 驱动在嵌入式与消费电子领域应用广泛。以下三种场景是性能优化的主要战场:

  • U盘(Mass Storage Gadget): 将设备内部存储(eMMC、SD卡、NAND Flash)模拟为 USB 大容量存储设备。批量传输是主要数据通道,吞吐量直接决定用户体验。
  • 网卡(Ethernet Gadget): 通过 USB 模拟虚拟网卡(ECM、RNDIS、NCM),实现设备与主机之间的网络通信。批量传输承载网络数据包,延迟与吞吐量是关键指标。
  • 串口(Serial Gadget): 模拟 USB 虚拟串口(ACM、CDC),常用于调试、AT 指令交互或工业控制。批量传输或中断传输均可,实时性要求较高。
应用场景 Gadget 功能驱动 传输类型 性能关键指标 典型瓶颈
U盘 g_mass_storage / usb_f_mass_storage 批量传输 (Bulk) 读写吞吐量 (MB/s) 存储介质 IO 延迟、DMA 带宽
网卡 g_ether / usb_f_ecm / usb_f_rndis 批量传输 (Bulk) 吞吐量 (Mbps)、延迟 (ms) 网络协议栈处理、数据拷贝次数
串口 g_serial / usb_f_acm 批量传输 / 中断传输 波特率、丢包率 中断频率、缓冲区大小
性能陷阱: 在批量传输场景中,如果 UDC 驱动未正确实现 DMA 分散/聚集(SG)支持,或者 Gadget Function 驱动频繁进行小包发送(< 512 字节),会导致 USB 总线利用率急剧下降,吞吐量可能损失 50% 以上。本课程后续章节将重点剖析这些优化点。
USB Gadget 三种典型应用场景 USB Gadget 三种典型应用场景 嵌入式设备 Linux Kernel Gadget Framework UDC Driver Mass Storage Bulk-Only Transport SCSI 命令集 Ethernet ECM / RNDIS / NCM 网络协议栈 Serial ACM / CDC TTY 层 USB Host PC / 笔记本 文件管理器 网络适配器 虚拟串口终端 批量传输 是共同核心

1.4 本章小结