首页 > 系统相关 >Linux-USB驱动笔记-Gadget Function驱动

Linux-USB驱动笔记-Gadget Function驱动

时间:2024-08-08 22:38:42浏览次数:8  
标签:Function function struct int request usb 驱动 ep USB

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驱动框架到此就结束了。

标签:Function,function,struct,int,request,usb,驱动,ep,USB
From: https://www.cnblogs.com/linhaostudy/p/18349886

相关文章

  • Linux-USB驱动笔记--设备控制器(UDC)驱动
    1、前言在Linux-USB驱动笔记(四)–USB整体框架中有説到设备侧的设备控制器(UDC),下面我们来具体看一下。2、设备控制器(UDC)USB设备控制器(UDC)驱动指的是作为其他USB主机控制器的USB硬件设备上的底层控制器驱动。该硬件和驱动负责将一个USB设备依附于一个USB主机控制器上。UDC驱......
  • Windows 7 X64系统安装无签名驱动后设备管理器显示黄色叹号的解决办法
    因项目需要在工控机上安装了串口转USB转换器的驱动程序安装时提示缺少数字签名点击“仍然安装”查看设备管理器发现该串口设备上显示黄色叹号根据网上说法 重启设备时长按F8在菜单中选择“禁用安装驱动时强制签名”进入系统后黄色叹号消失设备可以正常使用但该方法仅在......
  • 【YashanDB数据库】Ubuntu系统加载Yashan C驱动后无法使用PHP
    【问题分类】驱动使用【关键字】驱动使用、PHP、Ubuntu、C驱动【问题描述】客户将YashanDB的C驱动lib加载到环境变量LD_LIBRARY_PATH后,PHP报错:PHPFatalerror:UnabletostartpcremoduleinUnknownonline0【问题原因分析】经检查,我们的yashandb的C驱动库自带libpcre2-......
  • 什么是USB Server?工作原理是什么?
     USBServer:是一款usb设备虚拟化产品,远程连接调用USB设备的、软硬件结合的、集中化,集群化的安全管控产品。主要解决企业在虚拟化、超融合架构战略进程中USB设备无法正常调用工作,企业内Ukey数量多、无法集中管理的问题。通过把usb设备网络化,可以摆脱usb数据线的束缚。USBS......
  • 用Manim实现函数图像的的绘制【FunctionGraph】
    一,介绍在这个上下文中,函数是指变量之间的数学关系。当我们可视化这些函数时,我们使用对象来表示这些函数的图形。函数FunctionGraph(函数图)这个类表示一个由显式方程  定义的函数图。它是 ParametricFunction 的一种特殊类型,默认情况下会跨越整个场景的长度。这意味着......
  • 玩转usbserver(四)之nps服务端配置
    一款轻量级、功能强大的内网穿透代理服务器。支持tcp、udp流量转发,支持内网http代理、内网socks5代理,同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。支持web图形化管理,集成多用户模式服务端安装配置申请一个带有公网ip的服务器,例如阿里云的E......
  • 从人工巡检到智能监管:视频AI智能监管技术驱动风电场智慧化发展
    一、背景分析随着全球对可再生能源需求的持续增长,风电作为清洁、可再生的能源形式,其重要性日益凸显。然而,风电场通常分布在偏远地区,面积广阔,环境复杂多变,这给风电场的运维管理带来了巨大挑战。为了保障风电设备的安全运行,提高运维效率,智慧风电场视频监控解决方案应运而生,成为现代......
  • USB-DFP UFP DRP模式
    USBType-C接口支持三种模式:DFP(DownstreamFacingPort)、UFP(UpstreamFacingPort)和DRP(DualRolePort)。虽然这些术语主要与USBType-C相关,但它们的概念可以在不同类型的USB接口中找到。DFP(DownstreamFacingPort):指向下游供电和数据传输的端口。通常是主设备(如计算机、充......
  • Android Qcom USB Driver学习(一)
    该系列文章总目录链接与各部分简介:AndroidQcomUSBDriver学习(零)USB接口类型Android终端上常用的USB接口:TypeC(现在的主流),MicroB(以前的设备)一、TypeCHardwareInterfaceUSB-C引脚和功能指南一文读懂USBTypeC与USB-…TypeC引脚定义USB-C(USBType-C)规范的简单介绍......
  • USB Type-C Power Role
    USBPowerRole是指USB设备在供电方面所扮演的角色,主要分为供电方(Provider)和受电方(Consumer)。在USB供电协议中,电源角色的管理尤为重要,尤其是在USBPowerDelivery(USBPD)协议中。以下是一些关键的角色和相关术语:Provider(供电方):Source:提供电力的设备,例如USB充电器或笔记......