4. 内核配置与编译:USB Gadget 相关选项详解
在嵌入式 Linux 开发中,正确配置内核是启用 USB Gadget 功能的前提。本章将深入讲解 menuconfig 中与 USB Gadget 相关的核心选项,包括 USB Gadget Support、UDC 驱动以及 Function 驱动的配置方法与依赖关系。
配置原则: 先选顶层开关(USB Gadget Support),再选底层硬件(UDC 驱动),最后选功能层(Function 驱动)。顺序错误可能导致依赖选项不可见。
4.1 USB Gadget Support 顶层开关
进入内核源码根目录,执行 make menuconfig 后,通过以下路径找到 USB Gadget 支持选项:
Device Drivers --->
[*] USB support --->
<*> USB Gadget Support --->
该选项是 USB Gadget 功能的全局开关,必须选中(<*> 或 [y])才能显示后续的 UDC 和 Function 配置项。其依赖关系如下:
| 配置项 | 符号名 | 类型 | 说明 |
|---|---|---|---|
| USB Gadget Support | CONFIG_USB_GADGET |
bool / tristate | 编译为模块(M)或内置(Y);模块方式便于调试 |
| 依赖上层 | CONFIG_USB_SUPPORT |
bool | 必须选中 USB Support 顶层菜单 |
常见错误: 部分 BSP 默认关闭
CONFIG_USB_SUPPORT,导致无法进入 USB Gadget 菜单。请先确认 Device Drivers → USB support 已启用。
4.2 UDC 驱动配置
UDC(USB Device Controller)驱动是连接 SoC USB 控制器与 Gadget 框架的底层软件层。配置路径通常位于 USB Gadget Support 子菜单内:
USB Gadget Support --->
*** UDC Controller Drivers ***
<*> DesignWare USB2 DRD Core Support
<*> Chipidea USB2 Device Controller
<*> MUSB (Inventra) USB Device Controller
[*] Support for Mentor USB OTG Port
常见 UDC 驱动与对应 SoC 平台对照表:
| UDC 驱动 | Kconfig 符号 | 典型 SoC / 平台 | 备注 |
|---|---|---|---|
| DWC2 | CONFIG_USB_DWC2 |
Rockchip RK3288/RK3399, Allwinner H3/H5 | 支持 DRD 模式,需选 USB_DWC2_PERIPHERAL |
| Chipidea | CONFIG_USB_CHIPIDEA |
NXP i.MX6/7/8, TI AM335x | 需额外选中 USB_CHIPIDEA_UDC |
| MUSB | CONFIG_USB_MUSB_HDRC |
TI OMAP/DM37xx, Allwinner A10/A20 | 需选择对应 MUSB_DA8XX 或 MUSB_OMAP2PLUS |
| DWC3 | CONFIG_USB_DWC3 |
Qualcomm Snapdragon, Xilinx ZynqMP | 高性能 USB 3.0 控制器 |
调试技巧: 编译后通过
ls /sys/class/udc/ 查看系统识别的 UDC 实例名称。若为空,说明 UDC 驱动未正确加载或设备树未使能。
4.3 Function 驱动配置
Function 驱动定义了 USB Gadget 的具体功能角色,如串口、网络、存储等。配置路径位于 USB Gadget Support 子菜单的 USB Gadget Drivers 部分:
USB Gadget Support --->
*** USB Gadget Drivers ***
<M> USB Gadget Functions (configfs based)
<M> Serial Gadget (with CDC ACM and CDC OBEX support)
<M> Ethernet Gadget (with CDC ECM support)
<M> Mass Storage Gadget
<M> Audio Gadget
<M> Video Gadget (UVC)
<M> HID Gadget
常用 Function 驱动功能对比:
| Function 驱动 | Kconfig 符号 | 主机端识别为 | 典型应用场景 |
|---|---|---|---|
| Serial Gadget | CONFIG_USB_G_SERIAL |
CDC ACM 串口 | 调试终端、AT 命令交互 |
| Ethernet Gadget | CONFIG_USB_G_ETHER |
CDC ECM / RNDIS 网卡 | 网络共享、SSH 连接 |
| Mass Storage Gadget | CONFIG_USB_G_MASS_STORAGE |
U 盘 / 移动硬盘 | 文件传输、固件升级 |
| Audio Gadget | CONFIG_USB_G_AUDIO |
USB 声卡 | 音频播放、语音采集 |
| Video Gadget (UVC) | CONFIG_USB_G_VIDEO |
USB 摄像头 | 视频采集、监控设备 |
| HID Gadget | CONFIG_USB_G_HID |
键盘 / 鼠标 / 游戏手柄 | 人机交互设备模拟 |
推荐做法: 新项目优先使用
CONFIG_USB_CONFIGFS(configfs 方式),它允许在用户空间动态组合多个 Function,无需重新编译内核。
4.4 配置依赖与常见问题
内核配置中存在隐式依赖关系,未满足依赖会导致选项不可见或编译失败。以下为关键依赖链:
- USB Gadget Support 依赖
USB_SUPPORT和USB(或USB_OTG) - DWC2 UDC 依赖
USB_DWC2且需选中USB_DWC2_PERIPHERAL或USB_DWC2_DUAL_ROLE - Chipidea UDC 依赖
USB_CHIPIDEA且需选中USB_CHIPIDEA_UDC - ConfigFS 方式 依赖
CONFIGFS_FS(必须挂载 configfs 文件系统) - Ethernet Gadget 依赖
NET和PHYLIB - Mass Storage Gadget 依赖
BLOCK和SCSI
避坑提示: 使用
make olddefconfig 或 make savedefconfig 前,务必确认所有依赖选项已手动选中。部分 BSP 的 defconfig 可能遗漏 UDC 子选项,导致 Gadget 功能无法启用。
4.5 编译验证
配置完成后,执行以下步骤验证:
# 清理旧编译产物
make clean
# 编译内核与模块
make -j$(nproc)
# 编译设备树(如需要)
make dtbs
# 安装模块到目标根文件系统
make modules_install INSTALL_MOD_PATH=/path/to/rootfs
编译完成后,检查关键模块是否生成:
# 检查 UDC 模块
find . -name "dwc2.ko" -o -name "chipidea.ko" -o -name "musb_hdrc.ko"
# 检查 Function 模块
find . -name "g_serial.ko" -o -name "g_ether.ko" -o -name "g_mass_storage.ko"
# 检查 configfs 模块
find . -name "libcomposite.ko" -o -name "usb_f_*.ko"
快速验证: 在目标板上执行
modprobe libcomposite,若无错误提示,则 Gadget 框架已就绪。接着挂载 configfs:mount -t configfs none /sys/kernel/config,即可开始创建 USB Gadget 实例。