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 已启用。
USB Gadget 配置层级关系 USB Support USB Gadget Support UDC 驱动 (DWC2 / Chipidea / MUSB) Function 驱动 (Serial / ECM / Mass Storage) Gadget 框架 (libcomposite / configfs) 选中 USB Gadget Support 后,UDC、Function、框架三路同时可用

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 驱动未正确加载或设备树未使能。
UDC 驱动选择流程 确定 SoC USB 控制器类型 DWC2 → 选 USB_DWC2 Chipidea → 选 USB_CHIPIDEA MUSB → 选 USB_MUSB_HDRC DWC3 → 选 USB_DWC3 确认 /sys/class/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,无需重新编译内核。
USB Gadget Function 驱动组合架构 USB Gadget Framework (libcomposite) ConfigFS 接口 Serial Function (g_serial.ko) Ethernet Function (g_ether.ko) Mass Storage Function (g_mass_storage.ko) 其他 Function (Audio/Video/HID) UDC 硬件控制器

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 实例。