Gadget legacy和Gadget Function的区别
2025-08-19
本文链接为:http://www.usbzh.com/article/detail-1560.html ,欢迎转载,转载请附上本文链接。
在 Linux 的 USB Gadget 子系统中,Legacy Gadget 和 Gadget Function(FunctionFS 或 configfs) 是两种不同的实现方式,用于将 Linux 设备配置为 USB 外设(如 U 盘、网卡、串口等)。它们的区别主要体现在架构、使用方式和灵活性上:
1. Legacy Gadget(传统 Gadget 驱动)
Legacy Gadget 使用 预编译的内核模块,每个模块对应一种固定的 USB 功能,无法动态组合。
特点:
- 基于 内核模块静态配置,通常通过
g_ether
、g_serial
、g_mass_storage
等预编译的内核模块实现。 - 功能较为固定,每种模块对应一种特定的 USB 功能(如
g_ether
仅支持 USB 网络功能)。 - 配置方式简单,直接加载对应模块并传递参数即可(如
modprobe g_ether
)。 - 适用于简单的、单一功能的 USB 设备。
- 基于 内核模块静态配置,通常通过
缺点:
- 灵活性差:无法动态组合多个功能(例如同时实现 U 盘 + 串口)。
- 依赖内核模块:需要为每种功能编译单独的内核模块。
- 已逐渐被弃用:Linux 社区推荐使用更新的 FunctionFS 或 configfs 方式。
依赖关系
- 所有 Legacy Gadget 模块依赖
libcomposite
(但 Legacy 模式不直接使用configfs
)。 - 需要启用
CONFIG_USB_LIBCOMPOSITE
(基础支持)。
常用 Legacy Gadget 模块
模块名 | 功能描述 | 内核配置选项 (make menuconfig ) |
---|---|---|
g_ether |
USB 以太网(支持 RNDIS/CDC ECM) | CONFIG_USB_ETH |
g_mass_storage |
USB 大容量存储(模拟 U 盘) | CONFIG_USB_MASS_STORAGE |
g_serial |
USB 串口(CDC ACM 模式) | CONFIG_USB_G_SERIAL |
g_acm_ms |
复合设备(CDC ACM 串口 + 大容量存储) | CONFIG_USB_G_ACM_MS |
g_multi |
多功能复合设备(RNDIS 网络 + CDC ACM 串口 + 大容量存储) | CONFIG_USB_G_MULTI |
g_hid |
USB HID 设备(键盘/鼠标/游戏手柄等输入设备) | CONFIG_USB_G_HID |
g_audio |
USB 音频设备(支持 UAC 1.0/UAC 2.0) | CONFIG_USB_G_AUDIO |
g_webcam |
USB 视频设备(UVC 摄像头) | CONFIG_USB_G_WEBCAM |
g_ncm |
USB 网络设备(NCM 模式,替代 CDC ECM) | CONFIG_USB_G_NCM |
g_cdc |
USB CDC 设备(通用通信设备类,如 CDC ACM/ECM/NCM) | CONFIG_USB_G_CDC |
g_printer |
USB 打印机设备 | CONFIG_USB_G_PRINTER |
g_zero |
空设备(仅用于测试,模拟零传输) | CONFIG_USB_G_ZERO |
g_ffs |
FunctionFS 测试模块(已废弃,现代系统改用 usb_f_ffs + ConfigFS) |
CONFIG_USB_G_FFS |
2. Gadget Function(FunctionFS / configfs)
特点:
- 基于 用户空间驱动 和 动态配置,通过 Linux 的
configfs
文件系统实现。 - 允许将多个 USB 功能(Function)组合成一个复合设备(Composite Device),例如同时实现 U 盘 + RNDIS 网络 + 串口。
- 通过 FunctionFS(ffs)机制,可以将部分逻辑放到用户空间(如 USB 大容量存储的文件操作)。
- 需要内核启用
CONFIG_USB_CONFIGFS
和对应的功能模块(如usb_f_rndis
、usb_f_mass_storage
)。
- 基于 用户空间驱动 和 动态配置,通过 Linux 的
优点:
- 高度灵活:动态组合功能,无需重新编译内核。
- 用户空间控制:通过配置文件或工具(如
libcomposite
)管理。 - 主流推荐:适用于现代 Linux 系统(如 Android、嵌入式设备)。
核心依赖模块
模块名 | 作用 | 内核配置选项 |
---|---|---|
libcomposite |
提供 USB Gadget 核心框架 | CONFIG_USB_LIBCOMPOSITE |
usb_f_acm |
USB 串口(CDC ACM) | CONFIG_USB_F_ACM |
usb_f_rndis |
USB 以太网(RNDIS) | CONFIG_USB_F_RNDIS |
usb_f_mass_storage |
USB 大容量存储(U盘) | CONFIG_USB_F_MASS_STORAGE |
usb_f_hid |
USB HID(键盘/鼠标) | CONFIG_USB_F_HID |
usb_f_ecm |
USB 以太网(CDC ECM) | CONFIG_USB_F_ECM |
usb_f_serial |
USB 串口(老式 TTY) | CONFIG_USB_F_SERIAL |
usb_f_mtp |
USB MTP(媒体传输协议) | CONFIG_USB_F_MTP |
usb_f_ptp |
USB PTP(相机图片传输) | CONFIG_USB_F_PTP |
usb_f_uvc |
USB 摄像头(UVC) | CONFIG_USB_F_UVC |
依赖关系
- 必须启用:
CONFIG_USB_CONFIGFS
(动态配置支持)CONFIG_USB_LIBCOMPOSITE
(基础框架)
- 按需加载功能模块(如
usb_f_rndis
、usb_f_mass_storage
)。
关键区别总结
特性 | Legacy Gadget | Gadget Function (configfs) |
---|---|---|
配置方式 | 静态内核模块 | 动态通过 configfs 配置 |
功能组合 | 单一功能 | 支持多功能复合设备 |
用户空间参与 | 无(纯内核驱动) | 可通过 FunctionFS 在用户空间实现 |
灵活性 | 低 | 高 |
维护状态 | 逐步淘汰 | 主流推荐 |
使用场景示例
- Legacy Gadget:
或#uac扬声器 depmod modprobe libcomposite.ko modprobe usb_f_uac1.ko modprobe g_audio.ko
# 加载 USB 大容量存储(U盘) depmod modprobe libcomposite.ko modprobe usb_f_mass_storage.ko modprobe g_mass_storage.ko file=/dev/sda1 removable=1
- Gadget Function (configfs)
脚配配置insmod libcomposite.ko mount -t configfs none /sys/kernel/config insmod usb_f_mass_storage.ko
# 动态配置一个复合设备(U盘 + RNDIS) mkdir /sys/kernel/config/usb_gadget/my_gadget cd /sys/kernel/config/usb_gadget/my_gadget echo 0x1d6b > idVendor # Linux Foundation echo 0x0104 > idProduct # Multifunction Composite Gadget mkdir functions/mass_storage.usb0 # 添加U盘功能 mkdir configs/c.1 ln -s functions/mass_storage.usb0 configs/c.1/ ls /sys/class/udc > UDC # 绑定USB控制器 《ci_hdrc.0》
- configfs支持动态调整功能组合。
总结
- Legacy Gadget 适合简单场景,但已过时。
- Gadget Function (configfs) 是现代标准,推荐用于需要多功能或动态配置的场景(如 IoT 设备、USB 多功能工具)。