linux usb gadget驱动
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安装虚拟网口问题求解
1.make linux-menuconfig USB support ----> <*>USB
从硬件软件角度理解Gadget框架
、USB 摄像头。基于这个角度,Gadget 框架可以分为两层: 底层 endpoint 操作 上层模拟各类 USB 设备 2.1 底层硬件操作
2023-07-13 11:32:28
USB Gadget zero应用实例程序
1. 编写程序 1.1 编程思路 涉及的程序如下图所示: PC 端基于 libusb 编写应用程序,开发板端直接使用 Linux 自带的 USB Gadget
2023-07-13 11:14:52
[嵌入式linux]将linux板卡虚拟为USB网卡设备(Ethernet Gadget)
kernel menuconfig-> Device Drivers ->USB support -> USB Gadget
资料下载
贾桂林
2021-11-02 11:36:16
工具SemExpr可实现gadget搜索与语义分析
代码重用攻击的实施过程较为繁杂,通常需要一些工具辅助人工来完成 gadget序列的构建,但现有的自动化构建工具效率较低。在分析 Ropper、 angrop和BoPC等典型开源 gadget工具语义
资料下载
佚名
2021-03-12 14:52:41
RK3288使用USB GADGET实现大容量存储脚本
(){mount -t configfs none /sys/kernel/configmkdir /sys/kernel/config/usb_gadget/rockchip -m
基于Linux内核的Rockchip USB Gadget UAC开发资料分享
1、Rockchip USB Gadget UAC开发步骤本文档提供 Rockchip 平台基于 Linux 内核的
分享一种将RK3399配置成USB gadget设备的方法
1、RK3399的USB type-c接口初始化配置RK3399中提供了USB gadget设备的支持,程序在内核中目录“kernel/driv
如何配置USB OTG为Gadget serial device?
现需要将OKA40i-C板子上的OTG下载口配置为虚拟串口,实现u***串行通信,利用linux已存在的u***转虚拟串口驱动:USB
怎样将linux板卡虚拟为USB网卡设备
kernel menuconfig-> Device Drivers ->USB support -> USB Gadget
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机