0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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 (用于实现用户空间驱动的自定义功能)

核心概念与工作机制

  1. 与主机驱动相反:

    • 主机端驱动(如 ehci-hcd, xhci-hcd) 让Linux控制USB端口作为主机 (Host),连接打印机、U盘等外设。
    • Gadget驱动让Linux控制USB端口作为从设备 (Peripheral),被另一台主机(如PC、手机)识别和使用。
  2. 内核框架:

    • UDC驱动 (USB Device Controller Driver): 这是底层硬件驱动,直接控制SoC或外接芯片上的USB Device控制器硬件(如DWC2, DWC3, Chipidea等)。它提供了与Gadget框架交互的接口。
    • Gadget Function驱动: 这些驱动实现了具体的USB设备功能(如存储、网络、串口)。它们构建符合USB规范的设备描述符、配置描述符、接口描述符、端点描述符,并通过UDC驱动与硬件交互处理数据传输。
    • Gadget核心层: 提供基础API和结构体,协调UDC驱动和Function驱动的交互。
  3. 关键组件:

    • 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)。
  4. 配置流程 (典型使用 configfs)

    1. 挂载configfs (通常系统已挂载)。
    2. /sys/kernel/config/usb_gadget/ 下创建一个目录(如 g1),即创建了一个Gadget实例。
    3. 在该目录下设置USB属性 (idVendor, idProduct, bcdDevice, strings/* 等)。
    4. 创建所需的功能(Function) 目录 (如 mass_storage.usb0, ecm.usb0, ffs.adb)。这些目录通常链接到相应Function驱动的配置节点。
    5. 配置具体的Function参数(如在 mass_storage.usb0 里设置 lun.0/file=/path/to/backing-file)。
    6. 创建一个配置(Configuration) 目录 (如 configs/c.1),并在其中创建指向所需Function的符号链接(如 ln -s ../../functions/mass_storage.usb0 configs/c.1/)。一个Gadget可以有多个配置(但主机通常只激活一个)。
    7. 绑定UDC: 将Gadget关联到一个可用的USB Device控制器 (如 echo dwc3.0.auto > UDC)。这一步通常会自动启用USB连接。
    8. 对于FunctionFS,通常在创建 ffs.[name] Function后,还需要挂载FunctionFS (mount -t functionfs [name] /mount/point) 并启动处理通信的用户空间程序。

启用USB Gadget支持

  1. 内核配置: 在内核源码中启用:

    • 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)
  2. 加载模块: 如果未编译进内核,需要加载相应模块 (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是掌握该技术的关键。

AMD Xilinx Linux 2022.1 USB Gadget使用

有客户使用Linux中的USB Gadget功能,把MPSoC器件做USB从设备

2023-07-07 14:15:03

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 ----&gt

笑过就走 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 USB驱动实验USB是很常用的接口,目前大多数的设备都是USB接口的,比如鼠标、

靓仔峰 2022-02-17 06:35:20

Linux USB驱动框架分析(一)

分享一下Linux驱动开发。但这次只先针对LinuxUSB子系统作分析,因为周五研讨老板催货。当然,还会顺带提一下其他的驱动程序写法。        事实上,Linux的设备驱动都遵循一个惯例——表征

2019-04-02 14:35:55

怎样理解Gadget框架

。 意思是说,一个开发板,可以当 USB 主机,接鼠标、键盘等从机;一个开发板也可以当 U 盘,接入 PC 电脑,此时开发板是从机。因此,我们要掌握两套驱动框架。这是 LinuxUSB 相对于 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

基于LinuxUSB设备驱动方法有什么优点?

设备、串口设备、网络设备等设备驱动程序及各种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

Mini Linux

Mini Linux EMMC

2023-03-28 13:06:25

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

加载更多
相关标签