Linux中的USB Gadget驱动是用于实现设备充当USB从设备(Peripheral)功能的软件框架。它允许基于Linux系统的设备(如嵌入式开发板、树莓派、手机等)模拟成各种USB设备角色,例如:
- U盘 (Mass Storage Gadget)
- USB网卡 (Ethernet Gadget, ECM/NCM/RNDIS)
- USB串口 (Serial Gadget, ACM/CDC)
- USB键盘/鼠标 (HID Gadget)
- USB MIDI设备
- USB摄像头 (UVC Gadget)
- USB音频设备 (UAC1/UAC2 Gadget)
- USB FunctionFS (用于实现用户空间驱动的自定义功能)
核心概念与工作机制
-
与主机驱动相反:
- 主机端驱动(如
ehci-hcd,xhci-hcd) 让Linux控制USB端口作为主机 (Host),连接打印机、U盘等外设。 - Gadget驱动让Linux控制USB端口作为从设备 (Peripheral),被另一台主机(如PC、手机)识别和使用。
- 主机端驱动(如
-
内核框架:
- UDC驱动 (USB Device Controller Driver): 这是底层硬件驱动,直接控制SoC或外接芯片上的USB Device控制器硬件(如DWC2, DWC3, Chipidea等)。它提供了与Gadget框架交互的接口。
- Gadget Function驱动: 这些驱动实现了具体的USB设备功能(如存储、网络、串口)。它们构建符合USB规范的设备描述符、配置描述符、接口描述符、端点描述符,并通过UDC驱动与硬件交互处理数据传输。
- Gadget核心层: 提供基础API和结构体,协调UDC驱动和Function驱动的交互。
-
关键组件:
- configfs: (强烈推荐,现代方式)一个虚拟文件系统 (
/sys/kernel/config/usb_gadget/),允许完全在用户空间动态配置Gadget设备:创建Gadget、选择功能(Function)、设置USB属性(厂商ID、产品ID、字符串描述符)、绑定UDC、激活设备等。无需重新编译内核或加载模块(除了底层UDC和Function驱动本身)。 - Legacy GadgetFS: (较旧方式)另一个用户空间接口,通过挂载一个特殊的文件系统节点 (
/dev/gadget) 来配置和控制Gadget。比configfs繁琐,渐少使用。 - FunctionFS (ffs): 一种特殊的Function驱动,允许在用户空间程序中实现USB接口逻辑(协议处理)。内核只处理标准描述符和端点通信,应用层通过libusbgadget或直接操作ep文件读写数据。非常灵活,用于实现自定义协议或复杂功能(如Android ADB、MTP)。
- configfs: (强烈推荐,现代方式)一个虚拟文件系统 (
-
配置流程 (典型使用 configfs)
- 挂载configfs (通常系统已挂载)。
- 在
/sys/kernel/config/usb_gadget/下创建一个目录(如g1),即创建了一个Gadget实例。 - 在该目录下设置USB属性 (
idVendor,idProduct,bcdDevice,strings/*等)。 - 创建所需的功能(Function) 目录 (如
mass_storage.usb0,ecm.usb0,ffs.adb)。这些目录通常链接到相应Function驱动的配置节点。 - 配置具体的Function参数(如在
mass_storage.usb0里设置lun.0/file=/path/to/backing-file)。 - 创建一个配置(Configuration) 目录 (如
configs/c.1),并在其中创建指向所需Function的符号链接(如ln -s ../../functions/mass_storage.usb0 configs/c.1/)。一个Gadget可以有多个配置(但主机通常只激活一个)。 - 绑定UDC: 将Gadget关联到一个可用的USB Device控制器 (如
echo dwc3.0.auto > UDC)。这一步通常会自动启用USB连接。 - 对于FunctionFS,通常在创建
ffs.[name]Function后,还需要挂载FunctionFS (mount -t functionfs [name] /mount/point) 并启动处理通信的用户空间程序。
启用USB Gadget支持
-
内核配置: 在内核源码中启用:
CONFIG_USB_CONFIGFS(必需 - 支持configfs接口)CONFIG_USB_LIBCOMPOSITE(必需 - 基础库)- 所需的UDC驱动 (如
CONFIG_USB_DWC2,CONFIG_USB_DWC3,CONFIG_USB_MUSB_HDRC) - 所需的Function驱动 (如
CONFIG_USB_F_MASS_STORAGE,CONFIG_USB_F_ECM,CONFIG_USB_F_SERIAL,CONFIG_USB_F_HID,CONFIG_USB_F_FS)
-
加载模块: 如果未编译进内核,需要加载相应模块 (
udc_core,libcomposite,usb_f_mass_storage,usb_f_acm, 具体的UDC驱动模块如dwc3,dwc2等)。
实用工具
lsusb(在主机端运行): 主机连接后,在主机上运行此命令查看识别到的USB设备信息和描述符。usbhid-dump(主机端): 调试HID Gadget通信。tcpdump/wireshark(主机端或设备端): 抓取和分析USB数据包(需要特定USB嗅探硬件支持或设备端网络Gadget)。libconfig:libusbg/libusbgx/gt: 用户空间库和工具(如gt),用于通过程序或脚本更方便地配置configfs Gadget。
典型应用场景
- 嵌入式设备通过USB提供虚拟串口调试接口。
- 开发板模拟U盘,方便加载文件系统或更新固件。
- 树莓派/嵌入式设备通过USB连接共享网络(USB以太网)。
- 实现自定义USB HID设备(键盘、鼠标、游戏手柄)。
- 手机通过USB连接电脑启用ADB调试或MTP文件传输(内部使用FunctionFS)。
- 创建USB测试设备或协议分析工具。
总结
Linux USB Gadget驱动框架(特别是结合configfs和FunctionFS)提供了强大的灵活性,使Linux设备能够轻松扮演各种USB从设备的角色。开发者可以通过内核配置和用户空间脚本/程序动态创建和配置复杂的复合USB设备,极大地简化了USB从设备功能的开发。理解UDC、Function驱动、configfs和FunctionFS是掌握该技术的关键。
USB Gadget serial应用实例(上)
1. 硬件体验 使用 Linux 自带的 USB Gadget 驱动 /drivers/usb/gadget/legacy/serial.c 使用 USB 线,连接板子的 OTG 口和 PC
2023-07-13 11:06:31
基于Linux内核的Rockchip USB Gadget UAC开发资料分享
1、Rockchip USB Gadget UAC开发步骤本文档提供 Rockchip 平台基于 Linux 内核的 USB Gadget UAC(USB Audio Class)驱动的使用方法
harmonin
2022-08-10 16:03:24
求助,关于USB gadget安装虚拟网口问题求解
1.make linux-menuconfig USB support ----> <*>USB Gadget Support ---->
笑过就走
2023-09-01 06:14:42
如何配置USB OTG为Gadget serial device?
现需要将OKA40i-C板子上的OTG下载口配置为虚拟串口,实现u***串行通信,利用linux已存在的u***转虚拟串口驱动:USB Gadget Drivers (Serial Gadget
山中老虎
2022-01-04 06:47:05
USB Gadget zero应用实例程序
1. 编写程序 1.1 编程思路 涉及的程序如下图所示: PC 端基于 libusb 编写应用程序,开发板端直接使用 Linux 自带的 USB Gadget 驱动 zero.c【/drivers
2023-07-13 11:14:52
从硬件软件角度理解Gadget框架
、USB 摄像头。基于这个角度,Gadget 框架可以分为两层: 底层 endpoint 操作 上层模拟各类 USB 设备 2.1 底层硬件操作_UDC 驱动 不同平台采用的 USB 控制器型号不同,确认
2023-07-13 11:32:28
RK3288使用USB GADGET实现大容量存储脚本
(){mount -t configfs none /sys/kernel/configmkdir /sys/kernel/config/usb_gadget/rockchip -m
riverdj
2022-11-18 16:33:06
怎样将linux板卡虚拟为USB网卡设备
kernel menuconfig-> Device Drivers ->USB support -> USB Gadget Support建议最好选成M,作为内核驱动模块,便于
hgimtk
2021-11-05 08:35:27
详细介绍Linux USB驱动工作流程
在Linux驱动中,USB驱动处于最底层的是USB主机控制器硬件,在其之上运行的是USB主机控制器驱动,主机控制器之上为USB核心层,再上层为USB设备驱动层(插入主机上的U盘、鼠标、USB转串口等设备驱动)。
2019-04-29 14:52:53
Linux下的硬件驱动—USB设备(下)
RESERVED FOR FUTURE USE INCLUDE FILES--> 前言在上篇《 Linux下的硬件驱动--USB设备(上)(驱动配制部分)》中,我们知道了在Linux下如何去使用一些最常
2019-04-02 14:37:35
分享一种将RK3399配置成USB gadget设备的方法
1、RK3399的USB type-c接口初始化配置RK3399中提供了USB gadget设备的支持,程序在内核中目录“kernel/drivers/u***/gadget”中,支持的设备如U盘
juju宇哥
2022-05-24 10:35:31
Linux USB驱动框架分析(一)
分享一下Linux的驱动开发。但这次只先针对Linux的USB子系统作分析,因为周五研讨老板催货。当然,还会顺带提一下其他的驱动程序写法。 事实上,Linux的设备驱动都遵循一个惯例——表征
2019-04-02 14:35:55
怎样理解Gadget框架
。 意思是说,一个开发板,可以当 USB 主机,接鼠标、键盘等从机;一个开发板也可以当 U 盘,接入 PC 电脑,此时开发板是从机。因此,我们要掌握两套驱动框架。这是 Linux 下 USB 相对于 I2C
2023-07-13 11:18:20
Beaglebone black u*** gadget 驱动加载内存识别不了
] g_multi gadget: high-speed config #1: Multifunction with RNDIS发现其中的iSerialNumber如果随便填写的话PC端驱动识别不了,现在的那个序号
60user160
2019-09-03 13:25:19
Linux下的硬件驱动—USB设备(上)
和使用他们,也越来越成为困扰我们的一大问题。本文分两部分着力从Linux系统下设备驱动的架构,去阐述怎样去使用和配置以及怎样编制USB设备驱动。对于一般用户,可以使我们明晰Linux设备驱动开发专业论坛
2019-04-02 14:35:56
基于Linux的USB设备驱动方法有什么优点?
设备、串口设备、网络设备等设备驱动程序及各种USB device控制器芯片的驱动程序。市场上USB设备控制器芯片种类繁多,大多数用户需要针对特定应用来开发相关的USB设备控制器驱动程序,才能使设备正常工作在linux操作系统下。
脑洞大赛7
2019-11-07 08:31:16
USB Gadget 应用实例ADB实现
本文关注的不是 adb 本身的实现,而是数据如何传输。 分析文件:adbd-masteradbusb_linux_client.cpp 4.1 初始化接口描述符 4.2 申请更多端点 在接口描述符里
2023-07-13 10:56:50
STM32H7是否支持usb gadget以太网?
有人知道 STM32H7 (STM32H743) 支持 usb gadget 以太网吗?我在某处读到 STM32F7,但不确定 STM32H7
站长2014
2022-12-05 06:37:15
请问linux下如何驱动USB接口
我的51开发板提供的都是win7下的软件,包括USB驱动、keil开发软件以及烧录软件。现在我想在linux(我的是CentOS 64位)能够对C51进行操作,首先USB驱动都不知道该怎么办,请问如何能让linux下驱动USB?能否有类似keil的开发软件以及烧录软件?
leetow2006
2019-11-20 09:13:36
Linux通过gadget建立的虚拟串口,PID/VIP为0xA4A7/0x0525如何修改?
Linux通过gadget建立的虚拟串口,其PID/VIP 为0xA4A7/0x0525,如何修改?
星星公交站
2023-09-01 07:35:49
Linux USB设备驱动模型查看
1. BUS/DEV/DRV 模型 "USB 接口"是逻辑上的 USB 设备 ,编写的 usb_driver 驱动程序,支持的是"USB 接口": USB 控制器或 Hub 识别出 USB 设备后
2023-07-17 17:38:52
深度剖析USB设备端驱动框架
hello 大家好,今天带领大家学习一下USB设备端驱动 内核版本:4.4.94 1. Linux USB 子系统在介绍设备端驱动前,我们先来看看 Linux USB子系统。这里的子系统是相对于整个
2021-06-07 14:12:00
我不确定U-Boot中USB的切换过程是如何工作的
我在通过 USB 对 EMMC 进行编程时遇到问题。一切似乎都很好,但是当在 U-Boot USB 中从 DFU 更改为 Linux 端的 Gadget 时,一切都堆栈(lsusb - 堆栈)。当然
五斤麻辣油
2022-12-08 06:08:30
Linux USB驱动框架分析(二)
好,了解过USB一些规范细节之后,我们现在来看看Linux的驱动框架。事实上,Linux的设备驱动,特别是这种hotplug的USB设备驱动,会被编译成模块,然后在需要时挂在
2019-04-02 14:38:12
Linux通过gadget建立的虚拟串口,其PID/VIP 为0xA4A7/0x0525,如果修改?
Linux 通过 gadget 建立的虚拟串口,其PID/VIP 为0xA4A7/0x0525,如果修改?
Tussi
2023-06-13 06:56:30
嵌入式Linux下的USB设备驱动
,而且所有的配置过程都由系统自动完成,无须用户干预。1 Linux下的USB设备驱动在Linux内核的不断升级过程中,驱动程序的结构相对稳定。由于USB设备也是外围设备的一种,因此,它的驱动
cKin_g
2018-12-07 10:29:50
如何编写一个linux系统上的USB驱动?
如何编写和修改一个linux系统上的USB驱动,使得带这个linux系统的板子跟一个windows主机进行通讯? 最好使用hid人机接口,希望给出修改的驱动代码,其带linux系统的板子为从机,windows主机为主机。
松的子子
2020-06-10 05:55:34
