1. USB Gadget概述
USB Gadget 是嵌入式 Linux 系统中用于将设备端(Device)模拟为各种 USB 外设的核心框架。与传统的 USB Host 驱动不同,Gadget 驱动让嵌入式设备能够“扮演”键盘、鼠标、网卡、串口、U 盘等角色,从而与 PC 或其他 USB Host 设备进行通信。本章将系统介绍 Gadget 框架的基本概念、与 Host 驱动的核心差异,以及典型应用场景。
1.1 USB Gadget 框架简介
USB Gadget 框架位于 Linux 内核的 drivers/usb/gadget/ 目录下,由三层结构组成:
- UDC 层(USB Device Controller):直接操作硬件寄存器,负责 USB 协议底层传输。
- Gadget API 层:提供统一的函数接口,屏蔽不同 UDC 控制器的差异。
- Function 层:实现具体的外设功能,如 ECM(以太网控制模型)、ACM(抽象控制模型)、Mass Storage 等。
核心要点:Gadget 框架通过
configfs 或 gadgetfs 在用户空间动态组合功能,无需重新编译内核即可切换设备角色。
1.2 Gadget 与 Host 的区别
USB 总线采用主从架构,Host 端控制总线调度,Device 端响应请求。Gadget 驱动运行在 Device 端,与 Host 驱动有本质区别:
| 对比维度 | USB Host 驱动 | USB Gadget 驱动 |
|---|---|---|
| 角色 | 总线主控,发起传输 | 外设从机,响应传输 |
| 典型硬件 | PC、笔记本、开发板 Host 口 | 嵌入式设备、手机、IoT 模块 |
| 驱动位置 | drivers/usb/host/ |
drivers/usb/gadget/ |
| 枚举方向 | 检测设备插入,分配地址 | 响应 Host 枚举,报告描述符 |
| 数据传输 | URB(USB Request Block) | usb_request(Gadget 请求) |
| 电源管理 | 提供 VBUS,管理挂起/唤醒 | 接收 VBUS,支持远程唤醒 |
| 典型应用 | U 盘读取、鼠标键盘输入 | 模拟网卡、虚拟串口、ADB |
开发提示:调试 Gadget 驱动时,通常需要一台 PC 作为 Host 端,使用
lsusb、dmesg 和 USB 分析仪观察枚举过程。Gadget 端则通过 configfs 动态绑定功能。
1.3 Gadget 驱动的应用场景
Gadget 驱动在嵌入式产品中应用广泛,以下列出最常见的 6 类场景:
- 虚拟网卡(ECM / RNDIS / NCM):嵌入式设备通过 USB 模拟以太网卡,实现与 PC 的高效网络通信,常用于开发板调试、工业设备联网。
- 虚拟串口(ACM / CDC-ACM):模拟标准串口设备,用于控制台调试、AT 指令交互、传感器数据采集。
- 大容量存储(Mass Storage):将嵌入式设备的存储分区模拟为 U 盘,方便文件传输和固件升级。
- 人机交互设备(HID):模拟键盘、鼠标、游戏手柄,用于自动化测试、远程控制。
- 音频设备(UAC):模拟 USB 麦克风或扬声器,用于语音交互、音频采集。
- 复合设备(Composite):同时模拟多种功能,如网卡 + 串口 + 存储,实现多路复用。
注意事项:复合设备需要精心设计接口描述符和端点分配,避免功能间冲突。建议从单一功能开始调试,验证通过后再叠加其他功能。