FunctionFS (Function Filesystem) 是 Linux USB Gadget 框架的一部分,专门用于从用户空间实现和控制自定义的 USB 功能。它提供了一种文件系统接口,使用户能够在用户空间中直接定义 USB 设备的接口、端点和描述符,并管理 USB 数据的传输。FunctionFS 常用于需要用户空间控制的复杂 USB 协议和自定义设备功能,比如 USB 音频 (UAC)、视频 (UVC) 或其他特殊用途的设备。

FunctionFS 的工作原理

FunctionFS 将 USB 设备功能暴露给用户空间,允许用户空间应用程序控制 USB 设备的行为。它通过文件系统的方式让用户程序与内核 USB 子系统交互,从而避免了复杂的内核开发,使得 USB 设备的开发和调试更加灵活。

使用 FunctionFS 的步骤

  1. 加载内核模块

    • 首先,确保系统已启用 FunctionFS 支持,并加载相关的 USB Gadget 模块。g_ffs 模块是 FunctionFS 的 Gadget driver,它允许从用户空间定义 USB 功能。
    modprobe g_ffs
  2. 挂载 FunctionFS

    • 挂载 FunctionFS 文件系统到一个目录,这个目录将用于配置 USB 功能的接口和端点。通常挂载到 /dev/ffs/<function_name>
    mkdir -p /dev/ffs/my_function
    mount -t functionfs my_function /dev/ffs/my_function
  3. 用户空间程序配置

    • 用户空间程序可以在挂载的 FunctionFS 目录下创建描述符文件和端点文件。描述符文件定义了设备的 USB 描述符(设备描述符、接口描述符、端点描述符等),而端点文件用于读写数据。

    示例代码配置描述符:

    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h> int main() {
    int fd = open("/dev/ffs/my_function/ep0", O_RDWR);
    if (fd < 0) {
    perror("Failed to open ep0");
    return 1;
    } // 在这里写入描述符数据,例如设备描述符、接口描述符等
    // 描述符的详细格式需要根据 USB 协议规范填写
    write(fd, "descriptor data", sizeof("descriptor data")); close(fd);
    return 0;
    }
  4. 处理数据传输

    • 用户空间应用程序可以通过文件读写的方式操作端点文件,处理 USB 数据的收发。例如,数据可以从 ep1 写入,或从 ep2 读取。
    int ep_in = open("/dev/ffs/my_function/ep1", O_WRONLY);
    int ep_out = open("/dev/ffs/my_function/ep2", O_RDONLY); // 写数据到 IN 端点
    write(ep_in, "data to send", 12); // 从 OUT 端点读数据
    char buffer[128];
    read(ep_out, buffer, sizeof(buffer));
  5. 解除挂载

    • 当不再需要使用该功能时,可以卸载 FunctionFS,并清理相关资源。
    umount /dev/ffs/my_function

适用场景

  • 自定义 USB 功能:适合需要自定义 USB 功能的场景,例如实现用户定义的协议、特定控制传输的设备等。
  • 高层协议支持:非常适合实现高层协议,如 USB 音频(UAC)、视频(UVC)和其他需要复杂控制的设备。
  • 用户空间控制:FunctionFS 允许用户空间应用直接控制 USB 数据流,便于调试和开发。

FunctionFS 的优缺点

  • 优点

    • 灵活性:允许用户完全控制 USB 功能的行为,适合快速开发和调试。
    • 用户空间实现:无需频繁修改内核代码,可在用户空间编写逻辑代码,便于开发人员进行调试。
    • 实时性:适合需要快速响应和实时处理的 USB 功能实现。
  • 缺点

    • 实现复杂:由于需要用户空间应用参与控制,开发者需对 USB 协议有深入了解。
    • 性能限制:用户空间与内核空间的频繁交互可能带来一定的性能损耗,尤其在高吞吐量场景下。
    • 数据同步问题:用户空间和内核空间之间的数据同步和延迟控制需要仔细管理。

FunctionFS 和 CONFIGFS 的主要区别

特性 FunctionFS CONFIGFS
控制层级 用户空间控制,适合自定义 USB 协议和功能 内核空间控制,通过文件系统动态配置 USB 功能
实现复杂度 需要用户空间程序参与数据处理和控制 无需用户空间干预,功能由内核模块直接实现
适用功能 高度自定义的 USB 功能,如音频、视频 标准 USB 功能,如 RNDIS、MTP、Mass Storage
配置方式 挂载到 /dev/ffs,用户程序读写文件配置 挂载到 /sys/kernel/config,内核空间操作
性能 用户空间参与可能增加延迟 内核直接实现,性能更高

总结

  • FunctionFS 更灵活,适合自定义 USB 功能并允许用户空间控制,但实现复杂,需要用户程序处理数据流。
  • CONFIGFS 更简单,适合标准 USB 功能配置,内核直接管理数据流,配置方便快捷。

选择哪种方式取决于 USB 功能的需求:需要标准功能组合时用 CONFIGFS,需要自定义和用户空间控制时用 FunctionFS

USB gadget functionfs的更多相关文章

  1. Android USB gadget configfs学习笔记总结

    1.一个config_item 是通过显式用户空间mkdir操作创建的,通过rmdir销毁.属性(文件)在mkdir之后出现,可以通过read和write读取或修改属性文件.与sysfs一样,read ...

  2. Android USB gadget框架学习笔记

    一 Gadget框架结构 kernel/drivers/usb/gadget,这个目录是android下usbgadget的主要目录. Gadget功能组织单元:主要文件android.c,usb g ...

  3. USB gadget 驱动 printer.c 分析

    1. modprobe g_printer idVendor=0x0525 idProduct=0xa4a8 modprobe后面也可以加模块参数 2. prn_example从stdout获取数据然 ...

  4. Linux usb gadget框架概述

    很幸运,在公司开发了gadget相关驱动,总结下来,大大小小开发了四个与gadget相关的驱动,字符驱动.g_multi.g_ether.g_zero,在这里把自己对gadget的开发中自己的感悟记录 ...

  5. CVE-2016-2502-drivers/usb/gadget/f_serial.c in the Qualcomm USB driver in Android. Buffer Overflow Vulnerability reported by #plzdonthackme, Soctt.

    CVE-2016-2502-drivers/usb/gadget/f_serial.c in the Qualcomm USB driver in Android.Buffer Overflow Vu ...

  6. 【随笔记】linux usb gadget ncm wrong ndp sign 问题修复

    一.模拟网卡简介 在 Linux 通过 usb 模拟网卡时,有四种方式: 1. 使用 usb gadget rndis 2. 使用 usb gadget ecm 3. 使用 usb gadget nc ...

  7. Android USB Gadget复合设备驱动(打印机)测试方法

    启动Android打印机设备,并用USB线连接电脑主机及Android打印机. Android打印机系统启动完成后,在Windows设备管理器中,可以看到Android Phone设备和USB打印支持 ...

  8. usb gadget虚拟串口【转】

    本文转载自:https://blog.csdn.net/luckywang1103/article/details/61917916 配置 配置好之后编译重新烧写到开发板,发现出现了/dev/ttyG ...

  9. USB gadget学习笔记

    1.usb-OTG-ADP-HNP-SRP https://blog.csdn.net/xiongjiao0610/article/details/44150849

  10. AM335X的USB otg网卡(RNDIS /Ethernet Gadget)调试

    重新编译内核(2.6.29)       2.6.29内核        Device Drivers ---> USB support --->   USB Gadget Support ...

随机推荐

  1. springboot 3.x MultipartFile 参数总是为空 参数传递不进来

    场景: 在写一个统一文件上传的时候,MultipartFile参数一直传递不进来,一直为空. 排错方法: 我先是将业务简化,使用api文档进行测试,测试是前端问题还是后端问题. 简化后业务: 用api ...

  2. 一个专为量化投资开发的强化学习算法框架:ElegantRL

    链接: https://github.com/AI4Finance-Foundation/ElegantRL 这是一个专为量化投资开发的强化学习算法框架. 相关论文: ElegantRL-Podrac ...

  3. DQN2013代码尝试复现版(存在各种实现问题及Bug,个人尝试复现版,没有follow价值)

    在网上找的各种dqn代码修改而成,只实现了基本功能,对各个游戏的适配性没有进行,代码中还存在各种bug,属于草稿品质,不适合fellow,只是一时学习之用而进行尝试的残次半成品.核心代码已实现,为DQ ...

  4. 【简单菊花图】Codeforce 1583Problem - B.md

    1583Problem - B - Codeforces 题目大意:n个点的无根树 给出m个限制条件 (a,c,b)在a到b路径上不能存在c点,求任意一种可能的树的所有边 注意数据范围:1<m& ...

  5. 什么是MMU

    一.MMU的定义   MMU是Memory Management Unit的缩写,中文名是内存管理单元,有时也称作分页内存管理单元(Paged Memory Management Unit,缩写为PM ...

  6. NuminaMath 是如何荣膺首届 AIMO 进步奖的?

    今年,Numina 和 Hugging Face 合作角逐 AI 数学奥林匹克 (AI Math Olympiad,AIMO) 的首届进步奖.此次比赛旨在对开放 LLM 进行微调,以使其能解决高中难度 ...

  7. 暑假Java自学进度总结05

    一.今日所学: 1.if的第一个表达式: if(关系表达式){ 语句: } 执行流程: 1>首先执行关系表达式的值 2>如果关系表达式的值为true则执行语句,否则不执行 3>继续执 ...

  8. .NETCORE 下使用 NLog

    NLog帮助类 1 public enum LogType 2 { 3 [Description("网站")] 4 Web, 5 [Description("数据库&qu ...

  9. SearXNG与LLM强强联合:打造用户隐私保护的智能搜索解答流程,隐私无忧,搜索无忧

    SearXNG与LLM强强联合:打造用户隐私保护的智能搜索解答流程,隐私无忧,搜索无忧 SearXNG 是一个免费的互联网元搜索引擎,整合了各种搜索服务的结果.用户不会被跟踪,也不会被分析. gith ...

  10. Shell 目录栈操作

    Shell 目录栈允许你将一系列目录压入栈中,然后方便地在这些目录之间进行切换.以下是一些常见的命令及其用途: 常见命令 pushd:将当前目录压入栈中,并切换到指定目录. popd:从栈中移除顶部的 ...