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驱动的更多相关文章

  1. Linux usb 6. HC/UDC 测试

    目录 1. 背景介绍 2. Device (gadget zero) 2.1 gadget zero 创建 2.2 SourceSink Function 2.3 Loopback Function ...

  2. Linux USB ECM Gadget 驱动介绍

    ​1 USB ECM介绍 USB ECM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Ethernet Networking Control Mo ...

  3. 学习Linux下s3c2440的USB鼠标驱动笔记

    1.ARM-Linux下USB驱动程序开发1.1.1.linux下USB配置:*********(MassStorage:存储设备)********************************** ...

  4. Linux usb子系统(二):USB设备驱动usb-skeleton.c

    usb驱动分为通过usbfs操作设备的用户空间驱动,内核空间的内核驱动.两者不能同时进行,否则容易引发对共享资源访问的问题,死锁!使用了内核驱动,就不能在usbfs里驱动该设备. 下面转载的一篇分析u ...

  5. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

  6. Linux USB驱动框架分析【转】

    转自:http://blog.csdn.net/jeffade/article/details/7701431 Linux USB驱动框架分析(一) 初次接触和OS相关的设备驱动编写,感觉还挺有意思的 ...

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

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

  8. Linux USB驱动

    linux usb 驱动详解 一 http://blog.163.com/cl2006ky@126/blog/static/87195173201131245557340/ USB设备驱动开发-USB ...

  9. s3c6410 linux gadget hid驱动

    s3c6410 linux gadget hid驱动调了我一个多星期了今天终于搞定了,来跟大家分享下. 上一个星期纠结了一个星期的寄存器,试了N次,不管把3.1和3.7的hid驱动移植过来也是一样的情 ...

  10. Linux usb子系统(一) _写一个usb鼠标驱动

    USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...

随机推荐

  1. 手把手教你本地运行Meta最新大模型:Llama3.1,可是它说自己是ChatGPT?

    就在昨晚,Meta发布了可以与OpenAI掰手腕的最新开源大模型:Llama 3.1. 该模型共有三个版本: 8B 70B 405B 对于这次发布,Meta已经在超过150个涵盖广泛语言范围的基准数据 ...

  2. 假期小结1学习安装VMware以及linux

    学习VMware是一项使我能够创建和管理虚拟机的技能.VMware 是一家知名的虚拟化解决方案供应商,它提供了一系列工具和软件,使我能够在一台物理计算机上创建多个独立的虚拟环境. 首先,我获取了VMw ...

  3. 植物大战僵尸杂交版v2.1整合包全解锁+高清工具

    植物大战僵尸杂交版v2.1整合包全解锁+高清工具   引言 <植物大战僵尸>作为一款经典的塔防游戏,自2009年发布以来,就以其独特的游戏机制和幽默的风格赢得了全球玩家的喜爱.随着游戏的不 ...

  4. 【转载】 介绍具有代表性的CPG控制机器人

    原文地址: https://www.cnblogs.com/zhaochenliang/p/10453255.html ---------------------------------------- ...

  5. Ubuntu18.04 server 双网卡,一个设置为静态IP, 一个设置为动态IP

    操作目的如题: 修改网络配置文件: sudo vim /etc/netplan/50-cloud-init.yaml 修改内容如下: # This file is generated from inf ...

  6. PHP 红包功能代码

    前段时间被问这个问题,最近有空就写写啦,还是挺有趣的 首先做下抢红包方法分类: 对于发红包的人来说,一共有大致3类(其他的我暂时没想到,有想到可以联系我呀~) 一.拼手气红包个数不定(完全看运气) 二 ...

  7. FIRD的防碰撞机制

    RFID多标签阅读时防碰撞技术 概念 RFID 读写器在正常情况下一个时间点只能对磁场中的一张RFID卡进行读或写操作,但是实际应用中经常有当多张卡片同时进入读写器的射频场,读写器怎么处理呢?读写器需 ...

  8. Go进程内存占用那些事(二)

    0x01 最简单的Go程序 package main import ( "fmt" "time" ) func main() { fmt.Println(&qu ...

  9. C#自定义结构体的(用SendMessage)传递

    要传递结构体 public struct STUDENT { public int id; //ID public string name; //姓名 } 要引用Win32api函数FindWindo ...

  10. C++技能树