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 OTG 硬件接口与模式检测逻辑 SoC USB 控制器 (Dual-Role) ID 检测逻辑 USB OTG PHY (收发器) 电平转换 USB 连接器 (Type-C / Micro-AB) ID / CC 引脚 UTMI+ / ULPI D+/D- / ID 模式检测逻辑 (基于 ID 引脚) • ID = GND (接地) : 设备作为 Host,提供 VBUS 电源 • ID = Floating (悬空) : 设备作为 Peripheral,接收 VBUS 电源 • 对于 Type-C 连接器,通过 CC (Configuration Channel) 引脚实现类似检测
硬件选型避坑: 并非所有标有“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 模式:

  1. 检查内核配置: 确认内核已启用 CONFIG_USB_GADGET 和对应的 UDC (USB Device Controller) 驱动。
  2. 查看 UDC 列表: 在目标板上执行 ls /sys/class/udc/,如果输出不为空(例如显示 ci_hdrc.0 或 dwc2),则说明 UDC 驱动已加载。
  3. 绑定 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)。