1、前言

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

2、设备控制器(UDC)

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

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

2.1、usb_gadget – USB从机设备

  1. struct usb_gadget {
  2. struct work_struct work;
  3. struct usb_udc *udc;
  4. /* readonly to gadget driver */
  5. const struct usb_gadget_ops *ops;
  6. struct usb_ep *ep0;
  7. struct list_head ep_list;
  8. enum usb_device_speed speed;
  9. enum usb_device_speed max_speed;
  10. enum usb_device_state state;
  11. const char *name;
  12. struct device dev;
  13. unsigned isoch_delay;
  14. unsigned out_epnum;
  15. unsigned in_epnum;
  16. unsigned mA;
  17. struct usb_otg_caps *otg_caps;
  18. //标志是否支持某些功能
  19. unsigned sg_supported:1;
  20. unsigned is_otg:1;
  21. unsigned is_a_peripheral:1;
  22. unsigned b_hnp_enable:1;
  23. unsigned a_hnp_support:1;
  24. unsigned a_alt_hnp_support:1;
  25. unsigned hnp_polling_support:1;
  26. unsigned host_request_flag:1;
  27. unsigned quirk_ep_out_aligned_size:1;
  28. unsigned quirk_altset_not_supp:1;
  29. unsigned quirk_stall_not_supp:1;
  30. unsigned quirk_zlp_not_supp:1;
  31. unsigned quirk_avoids_skb_reserve:1;
  32. unsigned is_selfpowered:1;
  33. unsigned deactivated:1;
  34. unsigned connected:1;
  35. unsigned lpm_capable:1;
  36. };
字段 含义
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操作函数

  1. struct usb_gadget_ops {
  2. int (*get_frame)(struct usb_gadget *);
  3. int (*wakeup)(struct usb_gadget *);
  4. int (*set_selfpowered) (struct usb_gadget *, int is_selfpowered);
  5. int (*vbus_session) (struct usb_gadget *, int is_active);
  6. int (*vbus_draw) (struct usb_gadget *, unsigned mA);
  7. int (*pullup) (struct usb_gadget *, int is_on);
  8. int (*ioctl)(struct usb_gadget *,
  9. unsigned code, unsigned long param);
  10. void (*get_config_params)(struct usb_dcd_config_params *);
  11. int (*udc_start)(struct usb_gadget *,
  12. struct usb_gadget_driver *);
  13. int (*udc_stop)(struct usb_gadget *);
  14. void (*udc_set_speed)(struct usb_gadget *, enum usb_device_speed);
  15. struct usb_ep *(*match_ep)(struct usb_gadget *,
  16. struct usb_endpoint_descriptor *,
  17. struct usb_ss_ep_comp_descriptor *);
  18. };

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

2.3、usb_ep – 端点

  1. struct usb_ep {
  2. void *driver_data;
  3. const char *name;
  4. const struct usb_ep_ops *ops;
  5. struct list_head ep_list;
  6. struct usb_ep_caps caps;
  7. bool claimed;
  8. bool enabled;
  9. unsigned maxpacket:16;
  10. unsigned maxpacket_limit:16;
  11. unsigned max_streams:16;
  12. unsigned mult:2;
  13. unsigned maxburst:5;
  14. u8 address;
  15. const struct usb_endpoint_descriptor *desc;
  16. const struct usb_ss_ep_comp_descriptor *comp_desc;
  17. };

重要字段及其含义如下:

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

2.4、usb_ep_ops – 端点操作函数

  1. struct usb_ep_ops {
  2. int (*enable) (struct usb_ep *ep,
  3. const struct usb_endpoint_descriptor *desc);
  4. int (*disable) (struct usb_ep *ep);
  5. void (*dispose) (struct usb_ep *ep);
  6. struct usb_request *(*alloc_request) (struct usb_ep *ep,
  7. gfp_t gfp_flags);
  8. void (*free_request) (struct usb_ep *ep, struct usb_request *req);
  9. int (*queue) (struct usb_ep *ep, struct usb_request *req,
  10. gfp_t gfp_flags);
  11. int (*dequeue) (struct usb_ep *ep, struct usb_request *req);
  12. int (*set_halt) (struct usb_ep *ep, int value);
  13. int (*set_wedge) (struct usb_ep *ep);
  14. int (*fifo_status) (struct usb_ep *ep);
  15. void (*fifo_flush) (struct usb_ep *ep);
  16. };

3、总结如下

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

Linux-USB驱动笔记--设备控制器(UDC)驱动的更多相关文章

  1. 《网蜂A8实战演练》——8.Linux USB 主机控制器和设备驱动

    USB 的全称是 Universal Serial Bus,顾名思义:通用串行总线. 提到总线,联想一下,在你心目中总线总是用来干嘛的?还记得 I2C 总线? I2C 总线上挂有二条信号线,一条是 S ...

  2. linux c 编程 ------ 通过设备节点调用驱动

    驱动程序如下,加载驱动后,会在/dev文件夹下生成一个文件hello_device_node,是此驱动的设备节点 #include <linux/init.h> #include < ...

  3. 字符设备驱动笔记——中断方式按键驱动之linux中断处理结构(五)

    一.单片机下的中断处理 )分辨是哪一个中断 )调用处理函数 )清中断 二.linux下的中断处理 1)/arch/arm/kernel/irq.c asmlinkage void __exceptio ...

  4. 字符设备驱动笔记——中断方式按键驱动之linux异常处理结构(四)

    .中断方式获取按键值 单片机: )按键按下 )cup发生中断,跳转到异常向量入口执行 )b 函数 a.保存被中断的现场 b.执行中断处理函数 c.恢复 linux: )trap_init()函数构造异 ...

  5. Linux USB驱动学习总结(三)---- USB鼠标的加载、初始化和通信过程

    1.usbmouse的定义:usb鼠标既包含usb设备(usb_device)的属性也包含input输入设备(input_dev)的属性 struct usb_mouse { ];///USB鼠标设备 ...

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

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

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

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

  8. 乾坤合一~Linux设备驱动之USB主机和设备驱动

    如果不能陪你到最后 是否后悔当初我们牵手 如果当初没能遇见你 现在的我 在哪里逗留 所有的爱都是冒险 那就心甘情愿 等待我们一生中 所有悬念 我一往情深的恋人 她是我的爱人 她给我的爱就像是 带着露水 ...

  9. Linux SPI总线和设备驱动架构之三:SPI控制器驱动

    通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动.通用接口层和控制器驱动三大部分.其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能:1. ...

  10. [置顶] 自娱自乐7之Linux UDC驱动2(自编udc驱动,现完成枚举过程,从驱动代码分析枚举过程)

    花了半个月,才搞定驱动中的枚举部分,现在说linux的枚举,windows可能有差别. 代码我会贴在后面,现在只是实现枚举,你可能对代码不感兴趣,我就不分析代码了,你可以看看 在<自娱自乐1&g ...

随机推荐

  1. CentOS-7离线安装policycoreutils-python

    1.下载相关安装包 policycoreutils-2.5-34.el7.src.rpm 快速下载地址:https://vault.centos.org/7.9.2009/os/x86_64/Pack ...

  2. 【Vue2】Vue-Cli使用

    1.需要NodeJS环境支持,此处省略NodeJS安装 2.使用NPM命令安装CLI包 vue-cli是npm.上的一个全局包,使用npm install 命令,即可方便的把它安装到自己的电脑上: n ...

  3. 【Java】【常用类】Calendar 日历类

    Calendar 日历类,我居然念错发音,来,好好看下音标  ['kælɪndə]  卡琳达 public class DateTest { public static void main(Strin ...

  4. 【Uni-App】page.json 配置项一栏笔记

    官方文档 https://uniapp.dcloud.io/collocation/pages 一些配置项是全局的,也可以在页面对象中设置 { "pages": [ //pages ...

  5. 实现一个终端文本编辑器来学习golang语言

    欢迎!这个系列的博文会带你使用golang语言来编写一个你自己的文本编辑器. 首先想说说写这个系列文章的动机. 其实作为校招生加入某头部互联网大厂一转眼已经快4年了.可以说该大厂算是比较早的用gola ...

  6. 工业AI制造:铝合金冲压、压铸工艺流程 —— 模具参数调整,以满足所需的规格和质量要求

    压铸操作工艺流程作步骤: 模具安装 → 调试 →清理预热模具 → 喷刷涂料 → 合模 → 涂料准备 → 涂料配制 → 压铸 → 冷却与凝固 → 开模 → 顶出铸件 → 质量检验 → 成品 → 废品 → ...

  7. 三台服务器上离线安装redis哨兵集群,一主二从三哨兵

    三台服务器上离线安装redis哨兵集群,一主二从三哨兵 系统安装好gcc环境,(不然编译redis会报错).依旧不知道怎么离线安装gcc环境的可查看CentOS下离线安装gcc环境,图文详细 下载 点 ...

  8. net8实现MediatR小示例C#

    MediatR是.net下的一个实现消息传递的库,简洁高效,它采用中介者设计模式,通过进程内消息传递机制,进行请求/响应.命令.查询.通知和事件的消息传递,可通过泛型来支持消息的智能调度,用于领域事件 ...

  9. stm32中NVIC如何配置?

    1.NVIC优先级分组 2.初始化NVIC // NVIC优先级分组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // NVIC初始化 NVIC_I ...

  10. kubernetes中集成istio出现拉取配置中心数据失败导致服务启动失败 荐

    由于在k8s使用了grpc,所以这里我们集成istio来实现http2的自动发现以及负载均衡,但是随着节点增加,istio之前同步配置时间边长导致第一次启动时,服务启动拉取配置时istio却还没初始化 ...