2. 硬件平台选择:支持 USB Gadget 的 SoC 介绍与硬件接口要求
搭建 USB Gadget 驱动开发环境的第一步是选择合适的硬件平台。并非所有嵌入式 SoC 都支持 USB Gadget 模式,核心要求是硬件必须提供 USB OTG (On-The-Go) 接口,且 SoC 内部的 USB 控制器支持 Peripheral (Device) 或 Dual-Role (DRD) 模式。本章将介绍三款主流且文档完善的 SoC 平台,并详细说明硬件接口的选型要点。
选型核心原则: 优先选择内核主线支持良好、社区活跃、且具备完整
Device Tree 描述的 SoC 平台。这能大幅降低驱动移植和调试的复杂度。
2.1 主流 SoC 平台对比
下表对比了 i.MX6、Raspberry Pi (BCM2711) 和 Allwinner (H3/H5) 三款典型平台在 USB Gadget 开发中的关键特性:
| 特性 | NXP i.MX6 (系列) | Raspberry Pi 4B (BCM2711) | Allwinner H3/H5 |
|---|---|---|---|
| USB 控制器 | Chipidea (CI) 双角色控制器 | Synopsys DWC2 / DWC3 | 全志自研 / 标准 EHCI+OTG |
| OTG 接口数量 | 1 路 (USB_OTG1) | 1 路 (Type-C, 支持 DRD) | 1 路 (USB0) |
| 内核驱动 | chipidea / fsl-usb2-udc |
dwc2 / dwc3 |
sunxi-udc / musb |
| 主线内核支持 | 优秀 (LTS 版本) | 优秀 (Raspbian / 主线) | 良好 (社区维护) |
| Gadget 功能验证 | Ethernet, Serial, Mass Storage | Ethernet (USB-C), Serial, HID | Ethernet, Serial, Mass Storage |
| 开发板价格 | 中等 (约 300-800 元) | 较低 (约 300-500 元) | 低 (约 100-200 元) |
推荐选择: 对于初学者,Raspberry Pi 4B 凭借其完善的社区文档和
dwc2 驱动的广泛验证,是最佳入门选择。对于需要工业级稳定性的项目,i.MX6 系列是更可靠的选择。
2.2 硬件接口要求:USB OTG 详解
USB OTG 是支持 Gadget 功能的硬件基础。它允许设备在 Host (主机) 和 Peripheral (外设) 模式之间动态切换。一个典型的 OTG 接口包含以下关键信号:
- VBUS (5V 电源线): 在 Host 模式下提供电源;在 Peripheral 模式下接收电源。
- D+ / D- (差分数据线): 用于 USB 2.0 高速/全速/低速通信。
- ID (识别线): OTG 协议的核心。ID 引脚接地 (GND) 表示设备应作为 Host;ID 引脚悬空 (Floating) 表示设备应作为 Peripheral。
- GND (地线): 公共参考地。
下图展示了 USB OTG 接口在硬件层面的连接与模式检测逻辑:
硬件选型避坑: 并非所有标有“USB”的接口都支持 OTG。例如,许多开发板上的 USB Host 接口(通常为 Type-A 母座)缺少 ID 引脚,无法切换为 Peripheral 模式。务必确认板卡原理图中 USB 接口的 ID 引脚 是否连接到 SoC 的 OTG 控制器。
2.3 各平台硬件连接要点
针对上述三款 SoC,在实际开发中需要注意以下硬件连接细节:
| 平台 | OTG 接口位置 | 连接器类型 | 关键注意事项 |
|---|---|---|---|
| i.MX6 (如 Wandboard) | USB_OTG1 (通常靠近电源口) | Micro-AB 母座 | 需要外部 ID 检测电阻;部分板卡需通过跳线强制模式 |
| Raspberry Pi 4B | USB-C 接口 (唯一) | Type-C 母座 | 支持 DRD;需使用支持 eMarked 芯片的线缆或通过 dtoverlay=dwc2 启用 |
| Allwinner H3 (如 NanoPi NEO) | USB0 (通常标为 OTG) | Micro-AB 母座 | 部分板卡缺少 ID 引脚上拉电阻,需手动焊接或修改设备树 |
2.4 验证硬件是否支持 Gadget
在开始驱动开发前,可以通过以下步骤快速验证硬件平台是否已正确配置为 Gadget 模式:
- 检查内核配置: 确认内核已启用
CONFIG_USB_GADGET和对应的 UDC (USB Device Controller) 驱动。 - 查看 UDC 列表: 在目标板上执行
ls /sys/class/udc/,如果输出不为空(例如显示ci_hdrc.0或dwc2),则说明 UDC 驱动已加载。 - 绑定 Gadget 功能: 使用
configfs或gadgetfs尝试绑定一个简单的 Serial Gadget,并通过 USB 线连接主机,观察主机是否识别到新的串口设备。
快速验证命令示例 (基于 configfs):
# 挂载 configfs
mount -t configfs none /sys/kernel/config
# 创建 Gadget
mkdir /sys/kernel/config/usb_gadget/g1
cd /sys/kernel/config/usb_gadget/g1
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
mkdir functions/serial.gs0
ln -s functions/serial.gs0 configs/c.1
# 绑定 UDC (假设 UDC 名称为 ci_hdrc.0)
echo ci_hdrc.0 > UDC
执行后,主机端应出现新的 USB 串口设备 (如 /dev/ttyACM0)。