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

news/2024/11/18 5:59:14/文章来源:https://www.cnblogs.com/linhaostudy/p/18349848

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主要用来操作端点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780002.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习是怎么回事?

什么是机器学习 最近在入门人工智能,发现了一大堆的名词,和大家分享一下我是怎么理解机器学习的。 机器学习的概念 在百度上有定义,这里我说一下我自己的定义哈。机器学习就是让机器可以猜到你心里想的那个数字。 我们想一下,什么是学习? 不就是从一开始的瞎猜到合理的推测…

MD5手机号在线解密 MD5解密

分享个好用的在线破解md5手机号的网站-日常使用完全足够 链接:http://www.tandaima.com 在线解密就任意的md5手机号都可以解密出来,并且还附带手机号归属地 API解密 地址:http://www.tandaima.com/api.html 还支持Api形式MD5手机号解密,但是每次解密需要token的这个可以酌…

java中——接口

接口的作用只能用来调用 如果十个人里有三个会游泳,就可以新建一个接口储存swim方法,三人可以通过继承关系调用 而抽象是在方法的基础上重写,体现出同一个方法的不同形态 如果十个人游泳,但是游泳的姿势不同,如狗刨。。。此时就可以通过抽象继承关系去重写子类的游泳姿势 …

SVG之path详解(一),全面解析椭圆弧命令A

简述 SVG 中的 <path> 元素用于创建路径,它是 SVG 中最强大和最灵活的基本形状之一 使用 <path> 元素可以绘制直线、曲线、弧线等各种复杂的图形,并且可以通过设置路径命令来控制路径的形状和样式在进入正题前,先温习一下svg的坐标系,x轴为水平向右,y轴为垂直…

AppleScript实现FaceTime数据检测,FaceTime蓝号检测,无痕检测是否开通FaceTime功能

FaceTime是苹果公司iOS和macOS(以前称Mac OS X或OS X)内置的一款视频通话软件,通过Wi-Fi或者蜂窝数据接入互联网,在两个装有FaceTime的设备之间实现视频通话。其要求通话双方均具有装有FaceTime的苹果设备,苹果ID以及可接入互联网的3G/4G/5G或者Wi-Fi网络。一、Windows电脑…

搭建时空基底,建设“数字之城”

在这个日新月异的时代,数字技术正以前所未有的速度重塑我们的世界。今天,让我们一同深入探讨如何通过搭建时空基底,为“数字之城”的建设奠定坚实基础。一、时空基底:数字之城的骨骼与脉络所谓“时空基底”,是指结合时间维度与空间维度的综合性信息框架,它是构建数字城市…

没闲着系列 22

最近下班后,时间还是比较宽松的,相对宽松。 今天更新一下TaskSaas近期有什么变动: 一个就是概览dashboard以及需求、问题的选择中,加入了ALL TODO DONE的分类,更便于查询全部、待做(新建、重新打开、进行中、待反馈)、已完成的分类。第二个是修复了工作台里的一系列bug。…

解决端口号占用问题:Spring Boot报错,Web server failed to start. Port 8080 was already in use.

报错信息:Web server failed to start. Port 8080 was already in use. 报错原因:端口被占用 解决方法: 解决方法一:修改端口 修改配置文件,加上参数:server.port=8014或者在application.yml文件中添加 server:port: 8014在访问时,替换对应的端口号即可 解决方法二:关闭…

Redis连接问题解决汇总

Redis连接失败常见解决方案 1. 检查Redis命令行是否可以正常连接 使用命令行客户端,输入: redis-cli -h 虚拟机ip地址 -p 6379 -a redis访问密码如若连接成功,输入ping,看控制台是否返回PONG此步骤若正常,则代表虚拟机可正常连接 2. Redis命令行无法正常连接 1)未打开Red…

解决Spring报错:Failed to read candidate component class: file [ ]; nested exception is org.

使用IDEA 建立一个很基础的Spring项目时,之前用xml方式,写bean标签一直正常使用,改用注解方式后发现报错,显示: Exception in thread "XXX" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file …

8.8前后端联调

MAC强制关闭进程 因为common和control是分开的 所以是control 如何找到你自己的admin 在历史里面找找 返回的信息码缺少了响应数据 严格控制请求头顺序,否则会错加字段 如果单个ads下只有一个Store的校验逻辑就必须重新考量,或者就必须强一致 如果没有设置怎么校验 如何在低…

字符串part01

今天学了字符产的第一部分:反转字符串,使用双指针。 反转字符串Ⅱ,需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。 数组填充问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。1. 反转字符串 题目:编写一个函数,…