当前位置: 首页 > news >正文

USB学习——12、usb初始化和插拔驱动软件流程大致框架描述

usb初始化和插拔驱动软件流程大致框架描述:
当设备启动时,usb的主机控制器设备驱动(HCD)和 usb的root hub会先初始化:
1、xhci-plat.c主机控制器驱动那里,__usb_creat_hcd创建usb主机数据结构,main_hcd(primary_hcd)和shared_hcd,前者usb2.0,后者usb3.0,然后通过usb_add_hcd添加一个新的主机设备
2、hcd.c那里会注册一个 root hub ,usb_add_hcd来使用它, register_root_hub,然后会添加一个新设备roothub, 通过usb_new_device和device_add
3、hub.c那里会初始化hub通用驱动(usb_hub_init),并注册usb hub驱动,通过 usb_register_driver 和 driver_register
4、之后hub_probe开始,hub_event 和 hub_configure ,hub的端口上有事件时去处理事件读取配置usb设备接口的描述符等配置,hub控制传输,hub状态变化,hub中断,hub port状态变化,
5、然后有事件产生的话,会产生xhci中断,usb_hcd_irq, xhci_handle_event, handle_port_status
6、判断port状态是否有变化,设置hub轮询标志,轮询hub的状态,usb_hcd_poll_rh_status,port有变化时回调到hub_irq
7、然后hub事件通过hub_event处理,遍历port,port上有设备时,使用hub_port_connect处理
8、port上有设备,就通过usb_new_device添加设备
9、然后读取设备描述符,枚举设备
10、device_add添加新设备,设置配置,遍历usb设备接口,使用对应接口的驱动,
11、然后起接口驱动的probe,之后跑udc驱动绑定设备和驱动,然后枚举具体的设备成功

主机控制器驱动那里创建注册主机设备roothub并添加到usb设备中——》hub驱动那里初始化并注册hub驱动——》读取hub事件和hub接口配置——》主机控制器那里在轮询hub的状态——》port状态有事件变化时,有主机中断产生——》hub驱动那里处理中断,并对port事件做处理,连接设备——》port上有设备时添加它到usb设备中——》读取设备描述符并枚举设备——》添加新设备,设置config,遍历此usb设备接口——》使用对应接口驱动——》UDC驱动那里绑定gadget设备和驱动——》设备枚举成功

传输类型:

  • 控制传输(Control Transaction)
    控制传输用于配置设备、获取设备信息、发送命令到设备、获取设备的状态。每个USB设备都有端点0的控制端点,当USB设备插入到USB主机拓扑网络中时,USB主机就通过端点0与USB设备通信,对USB设备进行配置,便于后续的数据传输。USB协议保证控制传输有足够的带宽。控制传输可靠,时间有保证,但传输的数据量不大。如USB设备的枚举过程就采用的是控制传输。
  • 中断传输(Interrupt Transaction)
    当USB主机请求USB设备传输数据时,中断传输以一个固定的速率传送少量的数据。中断端点的数据传输方式为中断传输,数据传输可靠,实时性高,这里的中断并不是USB设备产生中断,而是USB主机每隔一个固定的时间主动查询USB设备是否有数据要传输,以轮询的方式提高实时性。如USB鼠标采用的是中断传输。
  • 批量传输(Bulk Transaction)
    批量传输用于传输大量数据。USB协议不保证这些数据传输可以在特定的时间内完成,但保证数据的准确性。如果总线上的带宽不足以发送整个批量包,则将数据拆分为多个包传输。批量传输数据可靠,但实时性较低。如USB硬盘、打印机等设备就采用的是批量传输方式。
  • 等时传输(Isochronous Transaction)
    等时传输也可以传输大量数据,但数据的可靠性无法保证。采用等时传输的USB设备更加注重保持一个恒定的数据传输速度,对数据的可靠性要求不高。如USB摄像头就使用的是等时传输方式。

设备驱动大致框架:

dwc3设备节点具体属性信息可参考Documentation/devicetree/bindings/usb/dwc3.txt文档
1、drivers/usb/dwc3/:主要初始化和CPU紧密相关的内容,如时钟、复位、电源、extcon(用于USB模式切换)
2、drivers/usb/dwc3/core.c:这部分和USB3.0控制器密切相关,如USB3.0控制器内部寄存器地址、USB3.0的PHY、中断等
3、struct dwc3是USB3.0 OTG控制器的核心数据结构,所有工作都围绕此数据结构展开
4、USB控制器作为Host时,称为USB主机控制器,使用USB主机控制器驱动。USB控制器作为Device时,称为USB设备控制器,使用UDC(usb device controller)驱动,USB控制器作为Device时,驱动框架可分为5层:
《1》最上层的是Gadget Function驱动:drivers/usb/gadget/function/:代表了具体设备的驱动,如大容量存储设备驱动(U盘、移动硬盘等)、通讯类设备驱动(USB串口、USB虚拟网卡等)、UAC驱动(USB麦克风、USB声卡等USB音频类设备)
《2》接下来是Gadget Funcation API层:drivers/usb/gadget/function.c,该层是一个抽象层,向上和向下提供统一的API,屏蔽了差异,提高了驱动的兼容性
《3》Composite层是一个可选的中间层:drivers/usb/gadget/configfs.c,composite.c,可通过一种配置或多种配置高效的支持多种功能的设备,简化了USB复合设备驱动的开发。目前最流行的是使用基于Composite和configfs实现的USB gadget configfs,可在用户空间灵活的配置USB设备。
《4》UDC驱动:drivers/usb/gadget/udc/core.c,直接访问硬件,控制USB设备与USB主机之间的通信
《5》USB设备控制器:通过USB线缆连接USB主机控制器,负责USB数据的发送和接收

5、usb设备控制器(UDC)框架,三部分:
《1》第一部分是UDC驱动核心层,在drivers/usb/gadget/udc/core.c文件中实现,该层是一个兼容层,将USB Function驱动和具体的USB gadget驱动隔离开,抽象了统一的接口和数据结构,向USB Function驱动提供了统一且稳定的接口,同时完成USB Function驱动和USB gadget驱动的匹配。
《2》第二部分是gadget driver层,负责驱动硬件工作,和具体的USB设备控制器硬件相关,dwc3的gadget driver驱动在drivers/usb/dwc3/gadget.c文件中实现。
《3》第三部分是USB设备控制器硬件

相关文章:

  • HTML静态网页成品作业(HTML+CSS)——美食火锅介绍网页(1个页面)
  • Autodesk Revit产品痛点
  • 力扣1793.好子数组的最大分数
  • 德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第十周) - 自然语言处理应用
  • 基于Django的博客系统之增加手机验证码登录(九)
  • idea intellij 2023打开微服务项目部分module未在左侧项目目录展示(如何重新自动加载所有maven项目model)
  • 使用 Iceberg、Tabular 和 MinIO 构建现代数据架构
  • C++ | Leetcode C++题解之第149题直线上最多的点数
  • 《沃趣 分手后霸道少爷宠爆我》盛大开机典礼
  • 安装MySQL5.7版本步骤遇到问题
  • Web服务器
  • PHP中的while循环:用法、技巧与最佳实践
  • Studying-代码随想录训练营day16| 513找到左下角的值、112.路径总和、106从中序与后序遍历序列构造二叉树
  • 适合PbootCMS的阿里云短信发送类
  • 使用Lua脚本保证原子性的Redis分布式锁实现
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • download使用浅析
  • express.js的介绍及使用
  • Git同步原始仓库到Fork仓库中
  • go语言学习初探(一)
  • HTML中设置input等文本框为不可操作
  • Idea+maven+scala构建包并在spark on yarn 运行
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JS题目及答案整理
  • linux安装openssl、swoole等扩展的具体步骤
  • Python_网络编程
  • 树莓派 - 使用须知
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 阿里云重庆大学大数据训练营落地分享
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 如何用纯 CSS 创作一个货车 loader
  • ​Redis 实现计数器和限速器的
  • ​数据结构之初始二叉树(3)
  • #if等命令的学习
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (1)(1.13) SiK无线电高级配置(六)
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (30)数组元素和与数字和的绝对差
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .aanva
  • .naturalWidth 和naturalHeight属性,
  • .net 程序发生了一个不可捕获的异常
  • .net 托管代码与非托管代码
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET分布式缓存Memcached从入门到实战
  • .net实现客户区延伸至至非客户区
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /3GB和/USERVA开关
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例