USB gadget functionfs
FunctionFS (Function Filesystem) 是 Linux USB Gadget 框架的一部分,专门用于从用户空间实现和控制自定义的 USB 功能。它提供了一种文件系统接口,使用户能够在用户空间中直接定义 USB 设备的接口、端点和描述符,并管理 USB 数据的传输。FunctionFS 常用于需要用户空间控制的复杂 USB 协议和自定义设备功能,比如 USB 音频 (UAC)、视频 (UVC) 或其他特殊用途的设备。
FunctionFS 的工作原理
FunctionFS 将 USB 设备功能暴露给用户空间,允许用户空间应用程序控制 USB 设备的行为。它通过文件系统的方式让用户程序与内核 USB 子系统交互,从而避免了复杂的内核开发,使得 USB 设备的开发和调试更加灵活。
使用 FunctionFS 的步骤
加载内核模块:
- 首先,确保系统已启用
FunctionFS支持,并加载相关的 USB Gadget 模块。g_ffs模块是 FunctionFS 的 Gadget driver,它允许从用户空间定义 USB 功能。
modprobe g_ffs
- 首先,确保系统已启用
挂载 FunctionFS:
- 挂载
FunctionFS文件系统到一个目录,这个目录将用于配置 USB 功能的接口和端点。通常挂载到/dev/ffs/<function_name>。
mkdir -p /dev/ffs/my_function
mount -t functionfs my_function /dev/ffs/my_function
- 挂载
用户空间程序配置:
- 用户空间程序可以在挂载的
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;
}
- 用户空间程序可以在挂载的
处理数据传输:
- 用户空间应用程序可以通过文件读写的方式操作端点文件,处理 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));
- 用户空间应用程序可以通过文件读写的方式操作端点文件,处理 USB 数据的收发。例如,数据可以从
解除挂载:
- 当不再需要使用该功能时,可以卸载
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的更多相关文章
- Android USB gadget configfs学习笔记总结
1.一个config_item 是通过显式用户空间mkdir操作创建的,通过rmdir销毁.属性(文件)在mkdir之后出现,可以通过read和write读取或修改属性文件.与sysfs一样,read ...
- Android USB gadget框架学习笔记
一 Gadget框架结构 kernel/drivers/usb/gadget,这个目录是android下usbgadget的主要目录. Gadget功能组织单元:主要文件android.c,usb g ...
- USB gadget 驱动 printer.c 分析
1. modprobe g_printer idVendor=0x0525 idProduct=0xa4a8 modprobe后面也可以加模块参数 2. prn_example从stdout获取数据然 ...
- Linux usb gadget框架概述
很幸运,在公司开发了gadget相关驱动,总结下来,大大小小开发了四个与gadget相关的驱动,字符驱动.g_multi.g_ether.g_zero,在这里把自己对gadget的开发中自己的感悟记录 ...
- 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 ...
- 【随笔记】linux usb gadget ncm wrong ndp sign 问题修复
一.模拟网卡简介 在 Linux 通过 usb 模拟网卡时,有四种方式: 1. 使用 usb gadget rndis 2. 使用 usb gadget ecm 3. 使用 usb gadget nc ...
- Android USB Gadget复合设备驱动(打印机)测试方法
启动Android打印机设备,并用USB线连接电脑主机及Android打印机. Android打印机系统启动完成后,在Windows设备管理器中,可以看到Android Phone设备和USB打印支持 ...
- usb gadget虚拟串口【转】
本文转载自:https://blog.csdn.net/luckywang1103/article/details/61917916 配置 配置好之后编译重新烧写到开发板,发现出现了/dev/ttyG ...
- USB gadget学习笔记
1.usb-OTG-ADP-HNP-SRP https://blog.csdn.net/xiongjiao0610/article/details/44150849
- AM335X的USB otg网卡(RNDIS /Ethernet Gadget)调试
重新编译内核(2.6.29) 2.6.29内核 Device Drivers ---> USB support ---> USB Gadget Support ...
随机推荐
- cpu亲和性相关函数和宏 基础讲解[cpu_set_t]
cpu亲和性相关函数和宏讲解: 写在前面: 我在查找关于linux cpu宏函数没看到有对宏函数基础的.详细的讲解,笔者便通过官方文档入手,对次进行的翻译和理解希望能帮到对这方面宏有疑惑的读者 exp ...
- AMD 驱动安装 error 192解决问题
AMD 驱动安装 error 192解决问题 环境:win10专业版.自动更新已禁止.硬件安装设置[是](window自动下载驱动) [以下环境均在安全模式下进行 (win+r msconfig,安全 ...
- vue加载三维模型
创建项目 我使用的是Vue CLI3,具体创建不再赘述,网上教程很多 下载SuperMap iClient3D for WebGL产品包 链接:http://support.supermap.com. ...
- 【Tool】常用软件地址(装机备用)
浏览器: 360极速 https://browser.360.cn/ee/ 谷歌 https://www.google.cn/chrome/ 社交通讯 微信 https://weixin.qq.com ...
- 【Git】05 分支管理
查看所有分支: git branch Git将列出所有分支,如果是当前使用的分支,前面会加一个星号表示 创建一个新的分支: git branch 分支名称 创建一个分支并且指向该分支: git che ...
- 如何在通用异常处理时获取到方法名称(获取注解参数JoinPoint)
1.背景 很多时候我们在梳理公共异常时,需要获取到接口的而具体名称,便于很好的提示是那个接口错误了 2.实现逻辑 1.在controller方法上的注解上写方法名称,一般使用了swagger都有方法名 ...
- 2024年Apache DolphinScheduler RoadMap:引领开源调度系统的未来
非常欢迎大家来到Apache DolphinScheduler社区!随着开源技术在全球范围内的快速发展,社区的贡献者 "同仁" 一直致力于构建一个强大而活跃的开源调度系统社区,为用 ...
- SparkStreaming本地化策略性能调优与使用场景分析
1.背景介绍:平台使用的华为FI C203的版本,通过SparkStreaming消费kafka数据后,进行算法处理入库.其中在算法部分耗时为4秒,每个批的数据量在30MB左右.执行算法部分的算子分区 ...
- C# Winform 使用 BarTender打印条码
目录 - 1. 使用软件BarTender 设计打印模板 - 2. Winfrom集成打印 - 3.最终效果 - 1. 使用软件BarTender 设计打印模板 贴一个入门级使用教程:https:// ...
- 构建 OpenWrt
OpenWrt 是一款路由器操作系统.如果你想要给自己的路由器安装 OpenWrt 的话,一般来说使用别人已经构建好的 OpenWrt 固件就够用了.当然如果你闲得没事干,那么也可以自己构建固件. P ...