1. USB Gadget 概述
USB Gadget 是嵌入式 Linux 系统中一个核心概念,它允许设备在 USB 总线上扮演“外设”角色,而非传统的“主机”角色。理解 USB Gadget 的本质、它与 USB Host 的区别以及典型应用场景,是掌握 ConfigFS 配置复合 USB Gadget 设备的基础。
1.1 什么是 USB Gadget
USB Gadget 是指运行在嵌入式设备(如开发板、手机、IoT 网关)上的软件与硬件组合,使该设备能够通过 USB 接口连接到另一台主机(如 PC、笔记本电脑),并模拟出特定的 USB 设备功能。例如,一个嵌入式 Linux 开发板可以通过 USB Gadget 模拟成一个 USB 键盘、鼠标、U 盘、串口、网卡,甚至同时模拟多个设备(复合设备)。
从 USB 协议的角度看,Gadget 设备始终处于 USB 总线的 从设备(Peripheral) 端,它不能主动发起数据传输,只能响应主机(Host)的请求。
关键概念: USB Gadget 的核心在于“角色反转”——嵌入式设备不再作为主机去控制外设,而是作为外设被主机控制。这种能力极大地扩展了嵌入式设备的互联互通场景。
1.2 USB Gadget 与 USB Host 的区别
USB 总线采用主从架构,USB Host 和 USB Gadget 在总线角色、硬件接口、软件栈以及功能职责上存在本质差异。下表从多个维度进行对比:
| 对比维度 | USB Host(主机) | USB Gadget(外设/从设备) |
|---|---|---|
| 总线角色 | 主控制器,管理总线事务 | 从设备,响应主机请求 |
| 硬件接口 | 通常使用 A 型 USB 接口(或 OTG 的 A 角色) | 通常使用 B 型、Micro-B 或 OTG 的 B 角色 |
| 供电方向 | 对外提供 5V 电源(VBUS) | 从 VBUS 取电(或自供电) |
| 软件栈 | USB 主机控制器驱动 + USB 核心 + 设备类驱动 | UDC(USB Device Controller)驱动 + Gadget 框架 + 功能驱动 |
| 典型设备 | PC、笔记本电脑、树莓派(作为主机时) | 手机、嵌入式开发板、USB 外设(键盘、U 盘) |
| 枚举发起方 | 主动检测设备插入并发送枚举请求 | 被动等待主机枚举,提供描述符 |
| 数据传输方向 | 可主动发起 IN/OUT 事务 | 只能响应主机发起的事务 |
下图直观展示了 USB Host 与 USB Gadget 在系统架构中的位置差异:
1.3 USB Gadget 的应用场景
USB Gadget 在嵌入式领域应用广泛,尤其在需要与 PC 或其他主机设备进行数据交互、设备模拟或调试的场景中。以下是几个典型的应用场景:
- 设备模拟与测试: 使用嵌入式开发板模拟 USB 键盘、鼠标、游戏手柄,用于自动化测试或人机交互原型验证。
- 数据通信与网络共享: 通过 USB 以太网 Gadget(ECM/RNDIS)或 USB 串口 Gadget(CDC ACM),实现嵌入式设备与主机之间的网络连接或串口调试。
- 存储设备模拟: 将嵌入式设备的 Flash 分区或 RAM 模拟为 USB 大容量存储设备(U 盘),方便主机直接读写数据。
- 复合设备(Composite Device): 同时模拟多个 USB 功能,例如一个设备同时提供串口、网卡和 U 盘功能,通过 ConfigFS 灵活组合。
- 固件升级与恢复模式: 在设备启动阶段模拟为 USB 下载模式(如 DFU),用于烧录固件或进入恢复模式。
实战案例: 在工业物联网网关中,常使用 USB Gadget 同时模拟 CDC ACM 串口(用于主机调试)和 RNDIS 网卡(用于主机访问网关的 Web 管理界面)。通过 ConfigFS 可以轻松实现这种复合配置,无需修改内核代码。
下图展示了 USB Gadget 在复合设备场景下的典型应用架构: