首页 > 系统相关 >Linux-USB驱动笔记--设备控制器(UDC)驱动

Linux-USB驱动笔记--设备控制器(UDC)驱动

时间:2024-08-08 22:18:22浏览次数:10  
标签:struct -- gadget unsigned int usb 驱动 ep USB

1、前言

在Linux-USB驱动笔记(四)–USB整体框架中有説到设备侧的设备控制器(UDC),下面我们来具体看一下。

2、设备控制器(UDC)

USB设备控制器(UDC)驱动指的是作为其他USB主机控制器的USB硬件设备上的底层控制器驱动。该硬件和驱动负责将一个USB设备依附于一个USB主机控制器上。

UDC驱动位于/drivers/usb/gadget目录下。

2.1、usb_gadget – USB从机设备

image

struct usb_gadget {
  struct work_struct    work; 
  struct usb_udc      *udc; 
  /* readonly to gadget driver */
  const struct usb_gadget_ops  *ops; 
  struct usb_ep      *ep0; 
  struct list_head    ep_list;
  enum usb_device_speed    speed; 
  enum usb_device_speed    max_speed; 
  enum usb_device_state    state; 
  const char      *name;
  struct device      dev;
  unsigned      isoch_delay; 
  unsigned      out_epnum; 
  unsigned      in_epnum;
  unsigned      mA;  
  struct usb_otg_caps    *otg_caps; 
   //标志是否支持某些功能
  unsigned      sg_supported:1;
  unsigned      is_otg:1;
  unsigned      is_a_peripheral:1;
  unsigned      b_hnp_enable:1;
  unsigned      a_hnp_support:1;
  unsigned      a_alt_hnp_support:1;
  unsigned      hnp_polling_support:1;
  unsigned      host_request_flag:1;
  unsigned      quirk_ep_out_aligned_size:1;
  unsigned      quirk_altset_not_supp:1;
  unsigned      quirk_stall_not_supp:1;
  unsigned      quirk_zlp_not_supp:1;
  unsigned      quirk_avoids_skb_reserve:1;
  unsigned      is_selfpowered:1;
  unsigned      deactivated:1;
  unsigned      connected:1;
  unsigned      lpm_capable:1;
};
字段 含义
struct work_struct work; sysfs_notify()使用的工作队列
struct usb_udc *udc; usb设备控制器
const struct usb_gadget_ops *ops; UDC操作函数
struct usb_ep *ep0; 端点0,用于驱动设置请求应答
struct list_head ep_list; 其他端口列表
enum usb_device_speed speed; 当前连接的USB主机速率
enum usb_device_speed max_speed; UDC能处理的最大速率
enum usb_device_state state; UDC状态
const char *name; 名称
struct device dev; 设备
unsigned isoch_delay; 设置等待请求
unsigned out_epnum; 最近使用的输出端点号
unsigned in_epnum; 最近使用的输入端点号
unsigned mA; 最近设置的mA值
struct usb_otg_caps *otg_caps; OTG功能

2.2、usb_gadget_ops – UDC操作函数

struct usb_gadget_ops {
  int  (*get_frame)(struct usb_gadget *);
  int  (*wakeup)(struct usb_gadget *);
  int  (*set_selfpowered) (struct usb_gadget *, int is_selfpowered);
  int  (*vbus_session) (struct usb_gadget *, int is_active);
  int  (*vbus_draw) (struct usb_gadget *, unsigned mA);
  int  (*pullup) (struct usb_gadget *, int is_on);
  int  (*ioctl)(struct usb_gadget *,
        unsigned code, unsigned long param);
  void  (*get_config_params)(struct usb_dcd_config_params *);
  int  (*udc_start)(struct usb_gadget *,
      struct usb_gadget_driver *);
  int  (*udc_stop)(struct usb_gadget *);
  void  (*udc_set_speed)(struct usb_gadget *, enum usb_device_speed);
  struct usb_ep *(*match_ep)(struct usb_gadget *,
      struct usb_endpoint_descriptor *,
      struct usb_ss_ep_comp_descriptor *);
};

以面的操作函数不涉及端点操作。

2.3、usb_ep – 端点

struct usb_ep {
  void      *driver_data;

  const char    *name;
  const struct usb_ep_ops  *ops; 
  struct list_head  ep_list;
  struct usb_ep_caps  caps;
  bool      claimed;
  bool      enabled;
  unsigned    maxpacket:16;
  unsigned    maxpacket_limit:16;
  unsigned    max_streams:16;
  unsigned    mult:2;
  unsigned    maxburst:5;
  u8      address;
  const struct usb_endpoint_descriptor  *desc; 
  const struct usb_ss_ep_comp_descriptor  *comp_desc;
};

重要字段及其含义如下:

字段 含义
const struct usb_ep_ops *ops 端点操作函数集
const struct usb_endpoint_descriptor *desc 端点描述符

2.4、usb_ep_ops – 端点操作函数

struct usb_ep_ops {
  int (*enable) (struct usb_ep *ep,
    const struct usb_endpoint_descriptor *desc);
  int (*disable) (struct usb_ep *ep);
  void (*dispose) (struct usb_ep *ep);

  struct usb_request *(*alloc_request) (struct usb_ep *ep,
    gfp_t gfp_flags);
  void (*free_request) (struct usb_ep *ep, struct usb_request *req);

  int (*queue) (struct usb_ep *ep, struct usb_request *req,
    gfp_t gfp_flags);
  int (*dequeue) (struct usb_ep *ep, struct usb_request *req);

  int (*set_halt) (struct usb_ep *ep, int value);
  int (*set_wedge) (struct usb_ep *ep);

  int (*fifo_status) (struct usb_ep *ep);
  void (*fifo_flush) (struct usb_ep *ep);
};

3、总结如下

  • 1、usb_gadget表示一个从机设备(UDC + 端点),它包含一些端点(包括端点0和其他端点)。所以它有一个端点列表成员ep_list, 初始化过程中会将所有需要的端点放到该链表中。
  • 2、 usb_gadget_ops主要用来操作UDC。
  • 3、 usb_ep表示一个端点,每个端点都有自己的操作函数usb_ep_ops。
  • 4、 usb_ep_ops主要用来操作端点。

标签:struct,--,gadget,unsigned,int,usb,驱动,ep,USB
From: https://www.cnblogs.com/linhaostudy/p/18349848

相关文章

  • 机器学习是怎么回事?
    什么是机器学习最近在入门人工智能,发现了一大堆的名词,和大家分享一下我是怎么理解机器学习的。机器学习的概念在百度上有定义,这里我说一下我自己的定义哈。机器学习就是让机器可以猜到你心里想的那个数字。我们想一下,什么是学习?不就是从一开始的瞎猜到合理的推测吗?我们玩一......
  • MD5手机号在线解密 MD5解密
    分享个好用的在线破解md5手机号的网站-日常使用完全足够链接:http://www.tandaima.com在线解密就任意的md5手机号都可以解密出来,并且还附带手机号归属地 API解密地址:http://www.tandaima.com/api.html 还支持Api形式MD5手机号解密,但是每次解密需要token的这个可以酌情考虑,......
  • SVG之Path路径详解(二),全面解析贝塞尔曲线
    前言如果没看过上一篇文章,可以点击链接前往观看,循序渐进,体验更佳在进入正题前,先温习一下svg的坐标系,x轴为水平向右,y轴为垂直向下在前一篇文章中,我们已经了解了d属性的M、L、H、V、A命令,接下来,将继续了解剩下命令d属性详解主要定义了路径的路径数据,由描述路径的一系列命令数......
  • 百度基木鱼产品中心批量复制上传
    importpandasaspdimportrequestsdeffetch_page_data(page_num):cookies="替换浏览器cookie"headers={"Accept":"application/json,text/plain,*/*","Accept-Language":"zh-CN,zh;q=0.......
  • 新手的第一个c语言小程序
    作为一个C语言的新手,我深知要想精通这门语言,就必须通过不断的练习来积累经验。因此,我决定从解决高中数学问题入手,编写我的第一个C语言小程序。显然,高中的许多数学问题复杂难解,对于我这个初学者来说,理解答案本身就已经是一项挑战,更不用说用程序来求解了。所以,我选择了数列求和这一......
  • c# svg转Bitmap Bitmap转ImageSource
    需要安装nuget包【svg】publicclassSVGHelper{publicstaticImageSourceConvertSvgToDrawingImage(stringpath){varsvgContent=File.ReadAllText(path);//使用SvgDocument解析SVG内容SvgDocumentsvgDoc......
  • 浏览器小说爬虫
    在外网偷偷爬点小说资源importpuppeteerfrom'puppeteer-core'importfsfrom'fs'(async()=>{constuserAgent="Mozilla/5.0(iPhone;CPUiPhoneOS16_6likeMacOSX)AppleWebKit/605.1.15(KHTML,likeGecko)Version/16.6Mobile/15......
  • 内部类
    内部类一、定义:将一个类A定义在一个类B中,这个类A称之为内部类二、分类:成员内部类:将类定义在一个类中的成员位置上,相当于外部类的一个成员局部内部类:将类定义在一个方法中三、访问特点:内部类可以直接访问外部类的成员,包括私有和静态。classOuter1{inta1=10;p......
  • ftrace的trace_options
    ftrace中的trace_options选项用于控制追踪数据的收集和显示方式。你可以通过/sys/kernel/debug/tracing/trace_options文件来设置这些选项。每个选项代表了不同的追踪行为或输出格式。以下是一些常见的trace_options选项及其含义:overwrite:含义:当启用此选项时,如果缓冲......
  • mysql系列之事务(三)
    1.为什么需要事务首先我们要知道什么是事务:事务(Transaction)是‌数据库系统中执行的一个工作单位,它是由用户定义的一组操作序列。一个事务可以是一组‌SQL语句、一条SQL语句或整个程序,一个应用程序可以包括多个事务。通俗易懂来说就是,我们在执行一个操作时,要保证要么都成......