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) — 同时模拟多种功能(如串口+网卡)
USB Gadget 概念架构图 USB Host PC / 服务器 / 主控 发起枚举,管理总线 USB 总线 USB Gadget 嵌入式设备 响应枚举,模拟外设 Gadget 软件栈(Linux 内核) Gadget Function 层 Gadget UDC 层 UDC 硬件驱动 Function 层:实现具体外设逻辑(存储、串口、网卡等) UDC 层:抽象不同硬件控制器,提供统一接口

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 只能“等待被读取”或“等待被写入”。
Host 与 Gadget 总线交互流程 USB Host 主控者 USB Gadget 从设备 ① 复位 & 枚举请求 ② 返回设备描述符 ③ 设置地址 & 配置端点 关键区别总结 • Host 控制总线时序,Gadget 不能主动发起事务 • Host 负责枚举、分配地址、配置设备 • Gadget 只能被动响应,通过端点与 Host 交换数据

1.3 Gadget 在嵌入式系统中的作用

USB Gadget 是嵌入式系统实现“一机多用”和“灵活外设扩展”的核心技术。在资源受限的嵌入式平台上,Gadget 功能可以显著降低硬件成本、减少接口数量,并提升设备的互联互通能力。

主要应用场景

  1. 设备调试与维护 — 通过 USB Gadget Serial 或 ACM 功能,嵌入式设备可以模拟串口,无需额外硬件调试工具即可通过 USB 线进行控制台调试。
  2. 数据存储与传输 — 通过 USB Mass Storage Gadget,嵌入式设备可以模拟 U 盘,方便用户通过 PC 直接读写设备中的文件系统。
  3. 网络连接共享 — 通过 USB Ethernet Gadget(RNDIS/ECM),嵌入式设备可以模拟 USB 网卡,实现与 PC 的网络通信,常用于 IoT 网关、路由器等场景。
  4. 人机交互模拟 — 通过 USB HID Gadget,嵌入式设备可以模拟键盘、鼠标、游戏手柄等,用于自动化测试、远程控制等。
  5. 复合设备 — 同时启用多个 Gadget Function,例如“串口 + 网卡 + 存储”,实现多功能一体化 USB 外设。
嵌入式系统使用 Gadget 的优势:
  • 节省硬件接口 — 无需额外的串口芯片、网卡芯片,仅通过 USB 接口即可实现多种功能
  • 降低 BOM 成本 — 减少外围芯片数量,简化 PCB 设计
  • 提高灵活性 — 同一硬件可通过软件配置切换不同功能,适应多种应用场景
  • 简化连接 — 一根 USB 线即可同时实现供电、数据传输、调试和网络连接
Gadget 在嵌入式系统中的应用场景 嵌入式设备 (Gadget 角色) 调试与维护 USB Serial / ACM 数据存储 Mass Storage 网络连接 Ethernet / RNDIS 人机交互 HID 键盘/鼠标 复合设备 串口+网卡+存储 音频设备 USB Audio 一根 USB 线 = 调试串口 + U 盘 + 网卡 + 键盘 + 声卡 Gadget 让嵌入式设备“一专多能”,极大提升开发效率和产品价值

1.4 本章小结

USB Gadget 是嵌入式 Linux 系统中实现 USB 外设功能的核心机制。通过 Gadget 子系统,嵌入式设备可以灵活地模拟多种标准 USB 设备类型,从而在调试、存储、网络、交互等场景中发挥重要作用。理解 Gadget 与 Host 的角色差异、掌握 Gadget 软件栈的分层结构,是后续搭建开发环境和配置工具链的基础。

学习提示:在开始环境搭建之前,建议先确认你的开发板是否支持 UDC 硬件(如 ChipIdea、DWC2、DWC3 等),并查阅内核文档 Documentation/usb/gadget.rst 了解支持的 Gadget Function 列表。