USB Gadget
+ -

Gadget legacy和Gadget Function的区别

2025-08-19 本文链接为:http://www.usbzh.com/article/detail-1560.html ,欢迎转载,转载请附上本文链接。

在 Linux 的 USB Gadget 子系统中,Legacy GadgetGadget Function(FunctionFS 或 configfs) 是两种不同的实现方式,用于将 Linux 设备配置为 USB 外设(如 U 盘、网卡、串口等)。它们的区别主要体现在架构、使用方式和灵活性上:


1. Legacy Gadget(传统 Gadget 驱动)

Legacy Gadget 使用 预编译的内核模块,每个模块对应一种固定的 USB 功能,无法动态组合。

  • 特点

    • 基于 内核模块静态配置,通常通过 g_etherg_serialg_mass_storage 等预编译的内核模块实现。
    • 功能较为固定,每种模块对应一种特定的 USB 功能(如 g_ether 仅支持 USB 网络功能)。
    • 配置方式简单,直接加载对应模块并传递参数即可(如 modprobe g_ether)。
    • 适用于简单的、单一功能的 USB 设备。
  • 缺点

    • 灵活性差:无法动态组合多个功能(例如同时实现 U 盘 + 串口)。
    • 依赖内核模块:需要为每种功能编译单独的内核模块。
    • 已逐渐被弃用:Linux 社区推荐使用更新的 FunctionFSconfigfs 方式。

依赖关系

  • 所有 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_rndisusb_f_mass_storage)。
  • 优点

    • 高度灵活:动态组合功能,无需重新编译内核。
    • 用户空间控制:通过配置文件或工具(如 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

依赖关系

  1. 必须启用
    • CONFIG_USB_CONFIGFS(动态配置支持)
    • CONFIG_USB_LIBCOMPOSITE(基础框架)
  2. 按需加载功能模块(如 usb_f_rndisusb_f_mass_storage)。

关键区别总结

特性 Legacy Gadget Gadget Function (configfs)
配置方式 静态内核模块 动态通过 configfs 配置
功能组合 单一功能 支持多功能复合设备
用户空间参与 无(纯内核驱动) 可通过 FunctionFS 在用户空间实现
灵活性
维护状态 逐步淘汰 主流推荐

使用场景示例

  1. 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
    
  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 多功能工具)。
本文链接为:http://www.usbzh.com/article/detail-1560.html ,欢迎转载,转载请附上本文链接。

0 篇笔记 写笔记

USB Gadget CDC-ECM网卡实例
ECM和NCM网卡类似,也需要安装ECM驱动设备兼容ID为:USBClass_02&SubClass_06&Prot_00USBClass_02&SubClass_06USBClass_02创建脚本:#!/bin/bashmodprobe libcompos......
Linux Gadget驱动结构关系图
Linux Gadget驱动层级如下:Gadget Function驱动/gadget legacy驱动Gadget Compoiste驱动USB UDC驱动(USB Device Control)Gadget Function驱动/gadget legacy驱动function, 更加现......
gadget probe过程-以g_audio为例
g_audio中通过如下代码调用usb_composite_probe,其中入参为audio_driverstatic struct usb_composite_driver audio_driver = { .name = "g_audio", ......
configfs文件系统
Linux内核使用CONFIGFS配置项支持可以通过用户创建USB Compoiste Gadget。CONFIG_CONFIGFS_FS项用于支持配置文件系统。Menconfig -> FileSystems -> Psuedo File System -> {M}User......
Gadget legacy和Gadget Function的区别
在 Linux 的 USB Gadget 子系统中,Legacy Gadget 和 Gadget Function(FunctionFS 或 configfs) 是两种不同的实现方式,用于将 Linux 设备配置为 USB 外设(如 U 盘、网卡、串口等)。它们的区别主要体现在架构、使用方式和灵活性......
usb_gadget复合HID键盘和U盘实例
#!/bin/bash# 加载模块modprobe libcompositemodprobe usb_f_hidmodprobe usb_f_mass_storage.komount -t configfs none /sys/kernel/config# 创建 Gadgetcd......
usb gadget创建uvc相机脚本实例
#!/bin/bashmodprobe libcompositemodprobe usb_f_uvcmount -t configfs none /sys/kernel/configmkdir -p /sys/kernel/config/usb_gadget/g1cd /sys/kern......
USB Gadget CDC-ACM串口实例
符合USB ACM规范的设备由Windows提供其驱动程序usbser.sysuserser.infLinux Gadget对应的ACM驱动依赖为root@ATK-IMX6U:/sys/kernel/config/usb_gadget/g1# lsmodModule ......
USB Gadget CDC-NCM网卡实例
USG Gadget也提供了CDC-NCM网卡驱动程序,使用USB Gadget CDC-NCM驱动,这样在Windows主机端和Linux设备端都会创建一个USB网卡设备。root@ATK-IMX6U:/lib/modules/4.1.15# ifconfig -ausb0 Lin......
USB Gadget 打印机实例
打印机这一块应该要与实例相连,具体这一块没有研究过。生成的设备如下:设备模块如下:root@ATK-IMX6U:/lib/modules/4.1.15# lsmodModule Size Used byusb_f_printer 1137......
USB Gadget CDC-EEM网卡实例
从理论上来讲,EEM网卡Windows是应该支持的,实际上也确实不用像NCM、ECM需要手动安装驱动,系统会自动匹配兼容ID来进行安装驱动,但是驱动启动失败,这个Linux系统下就没有问题。#!/bin/bashmodprobe libcompositemodprobe usb_f_eemm......
USB Gadget LoopBack实例
Loopback Function 提供的功能简单,它分配了两个 bulk endpoint,所做的就是把 out_ep 接收到的数据转发到 in_ep。#!/bin/bashmodprobe libcompositemodprobe usb_f_ss_lbmount -t configfs......
USB Gadget RNDIS网络适配器实列
和NCM一样,由于兼容ID的问题,RNDIS网络适配器也需要手动安装驱动。其对应的驱动为:netrndis.infrndismp6.sys其创建脚本如下:#!/bin/bashmodprobe libcompositemodprobe usb_f_rndismount -t conf......
USB Gadget实例分析usb_function_instance和usb_function
linux usb gadtet的设备类驱动有两个很重要的概念:usb_function_instance和usb_function从名来上看,usb_function_instance像是usb_function的实例化,但实际是恰恰相反。这里以f_loopback为示例解释:USB设备信息执......
USB Gadget数据收发-批量传输
当执行命令ln -s functions/Loopback.0 configs/c.1之后,会调用loopback_alloc函数创建usb_functionstruct f_loopback { struct usb_function function; struct......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!