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,同一硬件可以在不同场景下扮演不同角色。
USB Gadget 软件架构层次图 用户空间应用 / 配置工具 (configfs / gadgetfs) Function Drivers (Ethernet / Mass Storage / Serial / Audio / HID) g_ether.ko · g_mass_storage.ko · g_serial.ko · g_audio.ko · g_hid.ko Gadget API / UDC Core (drivers/usb/gadget/udc/) UDC 硬件驱动 (DWC2 / DWC3 / Chipidea / Renesas / …) 说明: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 模式让设备“变成”外设,而不是主机。
USB Host vs Gadget 角色对比图 USB Host PC / 笔记本 / 服务器 EHCI / xHCI 控制器 USB Gadget 嵌入式设备 / 手机 / 开发板 UDC 控制器 主动发起枚举 控制 VBUS 供电 被动等待 SETUP 包 响应主机请求 Host 是“大脑”,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 模式。
嵌入式 USB Gadget 典型应用场景 嵌入式设备 (UDC + Gadget 框架) USB 虚拟以太网 大容量存储 USB 虚拟串口 USB 音频 USB HID 设备 复合设备 复合设备:同时提供多种功能 如 以太网 + 串口 + 存储

1.4 Gadget 驱动的核心价值

在嵌入式 Linux 系统中,Gadget 驱动的移植适配是产品开发中的关键环节。其核心价值体现在:

  1. 硬件复用: 同一 USB 硬件接口,通过软件配置实现不同外设功能,降低 BOM 成本。
  2. 快速原型: 利用 Gadget 框架,开发者可以在数小时内实现一个 USB 虚拟设备,无需编写硬件驱动。
  3. 标准化接口: Gadget 框架遵循 USB-IF 标准规范,确保与主流操作系统(Windows / macOS / Linux)的兼容性。
  4. 生态丰富: Linux 内核已内置大量 Function Driver,覆盖绝大多数常见 USB 设备类型。
总结: USB Gadget 是嵌入式设备实现“一机多用”的关键技术。掌握 Gadget 驱动的移植适配,意味着能够灵活地将嵌入式设备接入 PC 生态,大幅扩展产品的连接能力和应用场景。