1. USB Gadget 概述
1.1 USB Gadget 概念
USB Gadget 是嵌入式 Linux 系统中一种特殊的 USB 设备角色。它允许一个嵌入式设备(如开发板、手机、IoT 网关)通过 USB 接口模拟成标准的外设(如键盘、鼠标、U盘、网卡、串口等),从而与 USB Host(通常是 PC 或服务器)进行通信。
从硬件角度看,支持 Gadget 功能的嵌入式设备通常配备 USB Device Controller (UDC) 硬件,该硬件能够响应 Host 的枚举请求,并按照 Gadget 驱动配置的“描述符”向 Host 报告自身类型。从软件角度看,Linux 内核提供了 USB Gadget 子系统,它位于 UDC 硬件之上,向上为应用层提供统一的接口,向下适配不同厂商的 UDC 控制器。
核心要点:USB Gadget 的本质是“让嵌入式设备在 USB 总线上扮演外设角色”,而不是传统的 Host 角色。这种角色反转是嵌入式系统实现 USB 功能扩展的关键。
常见 Gadget 功能实例:
- USB 大容量存储 (Mass Storage) — 模拟 U 盘或移动硬盘
- USB 串口 (Serial/ACM) — 模拟虚拟串口,用于调试或数据传输
- USB 以太网 (Ethernet/RNDIS/ECM) — 模拟 USB 网卡,实现网络连接
- USB 键盘/鼠标 (HID) — 模拟人机交互设备
- USB 音频 (Audio) — 模拟 USB 声卡
- USB 复合设备 (Composite) — 同时模拟多种功能(如串口+网卡)
1.2 Gadget 与 Host 的区别
USB 总线采用主从架构,Host 是总线的主控者,Gadget 是从设备。两者在硬件、软件和总线行为上存在本质差异。下表从多个维度进行对比:
| 对比维度 | USB Host | USB Gadget |
|---|---|---|
| 硬件接口 | Host 控制器(如 EHCI、xHCI) | Device 控制器(UDC) |
| 总线控制权 | 主控,发起所有传输事务 | 从属,被动响应 Host 请求 |
| 枚举过程 | 发送 SETUP 包,获取描述符 | 返回描述符,配置端点 |
| 电源角色 | 提供 VBUS 电源(通常 5V) | 从 VBUS 取电或自供电 |
| 典型应用 | PC、笔记本、服务器、OTG 主设备 | 手机、开发板、嵌入式外设 |
| Linux 驱动 | USB Host 子系统(usbcore、HCD) | USB Gadget 子系统(udc-core、function) |
| 端点方向 | OUT/IN 由 Host 视角定义 | OUT/IN 由 Device 视角定义(与 Host 相反) |
常见误区:Gadget 设备不能主动向 Host 发送数据,所有数据传输都必须由 Host 发起请求(OUT 事务)或由 Host 允许 IN 事务。Gadget 只能“等待被读取”或“等待被写入”。
1.3 Gadget 在嵌入式系统中的作用
USB Gadget 是嵌入式系统实现“一机多用”和“灵活外设扩展”的核心技术。在资源受限的嵌入式平台上,Gadget 功能可以显著降低硬件成本、减少接口数量,并提升设备的互联互通能力。
主要应用场景
- 设备调试与维护 — 通过 USB Gadget Serial 或 ACM 功能,嵌入式设备可以模拟串口,无需额外硬件调试工具即可通过 USB 线进行控制台调试。
- 数据存储与传输 — 通过 USB Mass Storage Gadget,嵌入式设备可以模拟 U 盘,方便用户通过 PC 直接读写设备中的文件系统。
- 网络连接共享 — 通过 USB Ethernet Gadget(RNDIS/ECM),嵌入式设备可以模拟 USB 网卡,实现与 PC 的网络通信,常用于 IoT 网关、路由器等场景。
- 人机交互模拟 — 通过 USB HID Gadget,嵌入式设备可以模拟键盘、鼠标、游戏手柄等,用于自动化测试、远程控制等。
- 复合设备 — 同时启用多个 Gadget Function,例如“串口 + 网卡 + 存储”,实现多功能一体化 USB 外设。
嵌入式系统使用 Gadget 的优势:
- 节省硬件接口 — 无需额外的串口芯片、网卡芯片,仅通过 USB 接口即可实现多种功能
- 降低 BOM 成本 — 减少外围芯片数量,简化 PCB 设计
- 提高灵活性 — 同一硬件可通过软件配置切换不同功能,适应多种应用场景
- 简化连接 — 一根 USB 线即可同时实现供电、数据传输、调试和网络连接
1.4 本章小结
USB Gadget 是嵌入式 Linux 系统中实现 USB 外设功能的核心机制。通过 Gadget 子系统,嵌入式设备可以灵活地模拟多种标准 USB 设备类型,从而在调试、存储、网络、交互等场景中发挥重要作用。理解 Gadget 与 Host 的角色差异、掌握 Gadget 软件栈的分层结构,是后续搭建开发环境和配置工具链的基础。
学习提示:在开始环境搭建之前,建议先确认你的开发板是否支持 UDC 硬件(如 ChipIdea、DWC2、DWC3 等),并查阅内核文档
Documentation/usb/gadget.rst 了解支持的 Gadget Function 列表。