1. USB Gadget 概述
1.1 USB Gadget 的概念
USB Gadget 是嵌入式 Linux 系统中用于实现 设备端(Device Side) USB 功能的软件框架。它使得一个嵌入式设备(如开发板、手机、IoT 网关)能够模拟成标准的 USB 外设,例如:U 盘、以太网卡、串口、音频设备或复合设备。
从 USB 协议体系来看,Gadget 框架位于 UDC(USB Device Controller)硬件驱动 之上,向上提供统一的 API,供各类功能驱动(Function Driver)调用。其核心架构如下:
核心概念: Gadget = 软件定义的 USB 外设。通过配置不同的 Function Driver,同一硬件可以在不同场景下扮演不同角色。
1.2 USB Gadget 与 USB Host 的区别
在 USB 协议中,Host(主机) 和 Gadget(设备) 是两个完全不同的角色。Host 负责总线调度、枚举发起、电源管理;Gadget 则被动响应主机请求,提供具体功能。下表从多个维度对比两者的核心差异:
| 对比维度 | USB Host | USB Gadget |
|---|---|---|
| 角色定位 | 总线主控者,发起所有传输 | 外设从设备,响应主机请求 |
| 硬件控制器 | EHCI / xHCI / OHCI / UHCI | UDC (USB Device Controller) |
| 软件栈 | USB Core → HCD → Hub Driver | Gadget API → Function Driver → UDC Driver |
| 枚举发起方 | 主动发送 GET_DESCRIPTOR 等请求 | 被动等待主机 SETUP 包 |
| 电源管理 | 控制 VBUS 供电、挂起/唤醒 | 响应主机挂起/远程唤醒 |
| 典型应用 | PC、笔记本、服务器、OTG Host | 手机、开发板、IoT 设备、嵌入式系统 |
| Linux 驱动目录 | drivers/usb/host/ |
drivers/usb/gadget/ |
关键理解: 一个嵌入式设备的 USB 控制器通常只能工作在 Host 或 Gadget 模式之一(除非支持 OTG)。Gadget 模式让设备“变成”外设,而不是主机。
1.3 Gadget 在嵌入式系统中的应用场景
USB Gadget 在嵌入式系统中应用极为广泛,它使得一个设备无需额外硬件即可模拟多种 USB 外设。以下是几个典型的应用场景:
- USB 虚拟以太网(RNDIS / ECM / EEM): 嵌入式设备通过 USB 线缆模拟网卡,与 PC 进行网络通信,常用于开发调试、数据采集。
- USB 大容量存储(Mass Storage): 将嵌入式设备上的 Flash 分区或 SD 卡模拟为 U 盘,方便用户通过 PC 直接读写文件。
- USB 虚拟串口(CDC ACM / Serial): 模拟串口设备,用于嵌入式设备的控制台、AT 指令交互或传感器数据输出。
- USB 音频(UAC): 模拟声卡,实现 USB 耳机、扬声器或麦克风功能。
- USB HID(键盘/鼠标/游戏手柄): 模拟人机交互设备,用于工业控制面板、POS 机等场景。
- 复合设备(Composite): 同时提供多种功能,例如“以太网 + 串口 + 大容量存储”三合一设备。
注意: 在移植 Gadget 驱动时,必须确认 SoC 的 UDC 硬件是否支持所需的功能(如端点数量、传输类型、DMA 能力)。部分低端 MCU 可能不支持高速(High Speed)或 OTG 模式。
1.4 Gadget 驱动的核心价值
在嵌入式 Linux 系统中,Gadget 驱动的移植适配是产品开发中的关键环节。其核心价值体现在:
- 硬件复用: 同一 USB 硬件接口,通过软件配置实现不同外设功能,降低 BOM 成本。
- 快速原型: 利用 Gadget 框架,开发者可以在数小时内实现一个 USB 虚拟设备,无需编写硬件驱动。
- 标准化接口: Gadget 框架遵循 USB-IF 标准规范,确保与主流操作系统(Windows / macOS / Linux)的兼容性。
- 生态丰富: Linux 内核已内置大量 Function Driver,覆盖绝大多数常见 USB 设备类型。
总结: USB Gadget 是嵌入式设备实现“一机多用”的关键技术。掌握 Gadget 驱动的移植适配,意味着能够灵活地将嵌入式设备接入 PC 生态,大幅扩展产品的连接能力和应用场景。