Linux-USB驱动笔记-Gadget Function驱动
1、前言
在Linux-USB驱动笔记(四)–USB整体框架中有説到Gadget Function驱动,下面我们来具体看一下。
Gadget Function就是指设备的功能,比如作为U盘,需要文件存储的功能,则需要File Storage驱动,这个驱动也称为Function驱动。
2、Gadget Function 驱动
Function驱动只是利用通用的API,并通过usb_request与底层UDC驱动交互。
Gadget Function 驱动相关的代码位于 /drivers/usb/gadget/function 目录下。
2.1、usb_function – 配置的一个功能
struct usb_function {
const char *name;
struct usb_gadget_strings **strings;
struct usb_descriptor_header **fs_descriptors; //全速和低速描述符表
struct usb_descriptor_header **hs_descriptors; //高速描述符表
struct usb_descriptor_header **ss_descriptors; //超高速描述符表
struct usb_descriptor_header **ssp_descriptors;//超高速加描述符表
struct usb_configuration *config; //usb配置
struct usb_os_desc_table *os_desc_table;
unsigned os_desc_n;
/* 配置管理: bind/unbind */
// gadget注册前绑定资源(接口标识,类描述符,端点,IO缓存)
int (*bind)(struct usb_configuration *,
struct usb_function *);
void (*unbind)(struct usb_configuration *,
struct usb_function *);
void (*free_func)(struct usb_function *f);
struct module *mod;
/* 运行状态管理 */
int (*set_alt)(struct usb_function *,
unsigned interface, unsigned alt);
int (*get_alt)(struct usb_function *,
unsigned interface);
void (*disable)(struct usb_function *);
int (*setup)(struct usb_function *,
const struct usb_ctrlrequest *);
bool (*req_match)(struct usb_function *,
const struct usb_ctrlrequest *,
bool config0);
void (*suspend)(struct usb_function *);
void (*resume)(struct usb_function *);
/* USB 3.0 附加 */
int (*get_status)(struct usb_function *);
int (*func_suspend)(struct usb_function *,
u8 suspend_opt);
/* private: */
/* internals */
struct list_head list;
DECLARE_BITMAP(endpoints, 32);
const struct usb_function_instance *fi;
unsigned int bind_deactivated:1;
};
重要字段及其含义如下:
| 字段 | 含义 |
|---|---|
| struct usb_descriptor_header **fs_descriptors; | 全速和低速描述符表 |
| struct usb_descriptor_header **hs_descriptors; | 高速描述符表 |
| struct usb_descriptor_header **ss_descriptors; | 超高速描述符表 |
| struct usb_descriptor_header **ssp_descriptors; | 超高速加描述符表 |
| struct usb_configuration *config; | usb配置 |
2.2、usb_request – I/O请求
struct usb_request {
void *buf;
unsigned length;
dma_addr_t dma;
struct scatterlist *sg;
unsigned num_sgs;
unsigned num_mapped_sgs;
unsigned stream_id:16;
unsigned no_interrupt:1;
unsigned zero:1;
unsigned short_not_ok:1;
unsigned dma_mapped:1;
void (*complete)(struct usb_ep *ep,
struct usb_request *req);
void *context;
struct list_head list;
int status;
unsigned actual;
};
在Gadget驱动中,用usb_request结构体来描述一次传输请求。这个和主机侧的URB类似,只是它更轻量,可以有更多的预分配。
2.3、usb_function_driver
struct usb_function_driver {
const char *name;
struct module *mod;
struct list_head list;
struct usb_function_instance *(*alloc_inst)(void);
struct usb_function *(*alloc_func)(struct usb_function_instance *inst);
};
在Gadget驱动中,用usb_request结构体来描述一次传输请求。这个和主机侧的URB类似,只是它更轻量,可以有更多的预分配。
和platform_driver类似,用来注册usb_function驱动。
3、API函数
| API | 作用 |
|---|---|
| int usb_function_register(struct usb_function_driver *newf) | 注册usb_function_driver(只是把usb_function_driver加入func_list链表) |
| void usb_function_unregister(struct usb_function_driver *fd) | 注销usb_function_driver |
| int usb_add_function(struct usb_configuration *, struct usb_function *); | 添加一个功能到配置 |
| void usb_remove_function(struct usb_configuration *c, struct usb_function *f) | 从配置中移除功能 |
| int usb_ep_enable(struct usb_ep *ep); | 使能端点 |
| int usb_ep_disable(struct usb_ep *ep); | 禁用端点 |
| struct usb_request *usb_ep_alloc_request(struct usb_ep *ep, gfp_t gfp_flags); | 分配usb_request |
| void usb_ep_free_request(struct usb_ep *ep, struct usb_request *req); | 释放usb_request |
| struct usb_request *alloc_ep_req(struct usb_ep *ep, size_t len); | 分配usb_request |
| int usb_ep_queue(struct usb_ep *ep,struct usb_request *req, gfp_t gfp_flags); | 提交usb_request |
| int usb_ep_dequeue(struct usb_ep *ep, struct usb_request *req); | 取消usb_request |
| int usb_ep_fifo_status(struct usb_ep *ep) | 返回端点FIFO字节数 |
| void usb_ep_fifo_flush(struct usb_ep *ep) | 刷新FIFO数据 |
| struct usb_ep *usb_ep_autoconfig(struct usb_gadget *,struct usb_endpoint_descriptor *); | 端点自动配置 |
| 函数 | 实现 |
|---|---|
| usb_ep_enable | 最终调用 ep->ops->enable(ep, desc); |
| usb_ep_disable | 最终调用 ep->ops->disable(ep, desc); |
| usb_ep_alloc_request | 最终调用 ep->ops->alloc_request(ep, gfp_flags); |
| usb_ep_free_request | 最终调用 ep->ops->free_request(ep, req); |
| usb_ep_queue 最终调用 | ep->ops->queue(ep, req, gfp_flags); |
| usb_ep_dequeue | 最终调用 ep->ops->dequeue(ep, req); |
上面这些通用的API都是调用到UDC驱动中的函数,然后进行硬件操作。
USB驱动框架到此就结束了。
Linux-USB驱动笔记-Gadget Function驱动的更多相关文章
- Linux usb 6. HC/UDC 测试
目录 1. 背景介绍 2. Device (gadget zero) 2.1 gadget zero 创建 2.2 SourceSink Function 2.3 Loopback Function ...
- Linux USB ECM Gadget 驱动介绍
1 USB ECM介绍 USB ECM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Ethernet Networking Control Mo ...
- 学习Linux下s3c2440的USB鼠标驱动笔记
1.ARM-Linux下USB驱动程序开发1.1.1.linux下USB配置:*********(MassStorage:存储设备)********************************** ...
- Linux usb子系统(二):USB设备驱动usb-skeleton.c
usb驱动分为通过usbfs操作设备的用户空间驱动,内核空间的内核驱动.两者不能同时进行,否则容易引发对共享资源访问的问题,死锁!使用了内核驱动,就不能在usbfs里驱动该设备. 下面转载的一篇分析u ...
- Linux USB驱动框架分析 【转】
转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...
- Linux USB驱动框架分析【转】
转自:http://blog.csdn.net/jeffade/article/details/7701431 Linux USB驱动框架分析(一) 初次接触和OS相关的设备驱动编写,感觉还挺有意思的 ...
- 【随笔记】linux usb gadget ncm wrong ndp sign 问题修复
一.模拟网卡简介 在 Linux 通过 usb 模拟网卡时,有四种方式: 1. 使用 usb gadget rndis 2. 使用 usb gadget ecm 3. 使用 usb gadget nc ...
- Linux USB驱动
linux usb 驱动详解 一 http://blog.163.com/cl2006ky@126/blog/static/87195173201131245557340/ USB设备驱动开发-USB ...
- s3c6410 linux gadget hid驱动
s3c6410 linux gadget hid驱动调了我一个多星期了今天终于搞定了,来跟大家分享下. 上一个星期纠结了一个星期的寄存器,试了N次,不管把3.1和3.7的hid驱动移植过来也是一样的情 ...
- Linux usb子系统(一) _写一个usb鼠标驱动
USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...
随机推荐
- Vite本地构建:手写核心原理
前言 接上篇文章,我们了解到vite的本地构建原理主要是:启动一个 connect 服务器拦截由浏览器请求 ESM的请求.通过请求的路径找到目录下对应的文件做一下编译最终以 ESM的格式返回给浏览器. ...
- python tesseract-ocr 图文识别 (windows基础环境搭建)
python tesseract-ocr 图文识别 一,先进行Tesserocr安装下载 1,先点击进入下面的百度网盘链接: https://pan.baidu.com/s/1G5vZO2B4Mxx5 ...
- nacos配置&gateway配置服务发现一直报500
项目场景: 这两天不是一直在搞简化配置.使用公共配置.我的服务可以通过网关访问这几个任务嘛,也是不断地踩坑补知识才总算把这几个任务都搞好了,下面就是记录过程中遇到的问题. 使用公共配置 因为发现项目使 ...
- 【Java】Input,Output,Stream I/O流 05 RandomAccessFile 随机访问文件类
RandomAccessFile 随机访问文件类 直接继承java.lang.Object 实现DataInput & DataOutput 接口 即是输入流,也是输出流 public cla ...
- HPA* (Near Optimal hierarchical Path-finding) —— 外网的讲解blog
原地址: https://alexene.dev/2019/06/02/Hierarchical-pathfinding.html 讲解视频: https://www.youtube.com/watc ...
- Google的TPU的向量化内存的读取规格——单次读取/写入的数据量
异构加速设备: GPU.TPU.NPU 这几种设备,除了GPU公开了部分硬件设计原理和软件编程范式以外,所有的TPU和NPU的资料都是不公开的,都是被其所属公司保留的,然后这些公司会自己在这些硬件之上 ...
- jQuery Eazyui的学习和使用(一)
工作需要,需要学习使用据说非常简单好用的前端框架-----Eazyui 先看看简介吧:"jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用户界面插件.jQuery E ...
- Python 提取出SQL语句中Where的值的方法
1.方法一:使用sqlparse库的方法 为了提取SQL语句中WHERE子句的值,我们可以利用Python的sqlparse库,这是一个专门用于解析SQL语句的库.以下是一个示例代码,演示如何使用sq ...
- 【CDQ分治】三元环
三元环 HDU - 7439 思路 考虑 \(3\) 个点的有向图,要么成环,要么有一个点入度为 \(2\) ,假设第 个点的入度为 \(d_i\),答案为 \(C_n^3-\sum\limits_{ ...
- Linux库概念,动态库和静态库的制作,如何移植第三方库
一.什么是库? 在windows平台和linux平台下都大量存在着库.一般是软件作者为了发布方便.替换方便或二次开发目的,而发布的一组可以单独与应用程序进行compile time或runtime链接 ...