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设备控制器硬件

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

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

相关文章

【C++】数据类型、函数、头文件、断点调试、输入输出、条件与分支、VS项目设置

四、基本概念 这部分和C语言重复的部分就简写速过,因为我之前写过一个C语言的系列,非常详细。C和C这些都是一样的,所以这里不再一遍遍重复码字了。感兴趣的同学可以翻看我之前的C语言系列文章。 1、数据类型 编程的本质就是操作数据。 操…

从零入手人工智能(4)—— 逻辑回归

1.小故事 一家金融科技公司,公司的首席执行官找到团队提出了一个紧迫的问题:“我们如何提前知道哪些客户可能会违约贷款?” 这让团队陷入了沉思,经过激烈讨论团队中的数据分析师提议:“我们可以尝试使用逻辑回归来预测…

基于51单片机的函数信号发生器

基于51单片机函数信号发生器 (仿真+程序+原理图+设计报告) 功能介绍 具体功能: 1.LCD1602液晶显示波形种类和频率值(10-100HZ); 2.按键设置波形种类和设定频率步进值…

UE5近战对抗系统Tutorial

文章目录 BP_Character 组合攻击Notify State 检测攻击BP_Character 攻击反馈BP_Character 生命系统BP_Character 死亡效果BP_Character 武器系统BP_Enemy 初始化和行为树 BP_Character 组合攻击 首先我们获取攻击动画,在这里使用的是 Easy Combo Buffering 的攻击…

嵌入式系统软件架构设计方法

1.嵌入式系统软件架构设计的目的 嵌入式系统软件架构是开发大型嵌入式系统密集型软件贯穿始终的关键桥梁,同时软件架构也是软件开发的基础。架构设计的目的是: 保证应用的代码逻辑清晰,避免重复的设计;实现软件的可移植性&#…

聊聊JSON

引言 JSON的概念 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,但独立于语言,这意味着它可以被许多编程语言轻松解析。JSON的简洁性和易读性使其成为Web开发中数据交换的…

jnp.linalg.norm

jnp.linalg.norm 是 JAX 中用于计算向量或矩阵的范数的函数。JAX 是一个用于高性能机器学习研究的 Python 库,它提供了与 NumPy 类似的 API,但支持自动微分和加速计算。jnp 是 JAX 的 NumPy 接口。 jnp.linalg.norm 的基本语法 jnp.linalg.norm(x, ord…

办公软件都需要学习哪些?沈阳计算机办公软件培训

学习办公软件可以提高你的工作效率和专业技能。以下是一些常见的办公软件及其需要学习的关键内容: 1. Microsoft Word 或 Google Docs(文字处理软件) 基本操作:创建、保存、打开和打印文档。文本格式化:字体、段落、…

掌握 NumPy:高效数组处理综合指南(第 2/2 部分)

照片由 兹比内克布里瓦尔 on Unsplash 一、介绍 欢迎来到我关于 NumPy 的教程的第二部分!之前,我们已经介绍了以下列表中的前 7 章。现在在这篇文章中,我们将从第 8 章一直到第 14 章。 Numpy 安装数组初始化Numpy 数组限制计算速度和内存使用…

量子计算:1 从薛定谔的猫开始

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技(Mamba,xLSTM,KAN)则…

序列1bp插入有什么影响

1bp插入突变(1个碱基插入)在基因序列中通常会引起以下几种影响: 移码突变(Frameshift Mutation): 插入的一个碱基会改变插入点之后所有的密码子,导致读取框的移动。这种变化通常会引起整个蛋白质…

PCL 点云RANSAC+SVD提取平面

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里的思路很简单,RANSAC算法具有很不错的抗噪性,但是得到的平面仍然是基于原始数据中的点,这会导致提取出的平面不够精确;因此我们可以基于RANSAC算法提取出的点云,使用最小二乘法拟合出更为精确的平面参数。…

基于PHP的民宿管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的民宿管理系统 一 介绍 此民宿管理系统基于原生PHP开发,数据库mysql,前端jquery.js和echarts.js。系统角色分为用户和管理员。用户可以在线浏览和预订民宿,管理员登录后台进行相关管理等。(在系统…

【python】OpenCV——Color Correction

文章目录 cv2.aruco 介绍imutils.perspective.four_point_transform 介绍skimage.exposure.match_histograms 介绍牛刀小试遇到的问题 参考学习来自 OpenCV基础(18)使用 OpenCV 和 Python 进行自动色彩校正 cv2.aruco 介绍 一、cv2.aruco模块概述 cv2.…

如何清理docker build的缓存

在使用 Docker 构建镜像时,Docker 会利用构建缓存来加速后续的构建过程。如果某一层及其所有上层未发生变化,Docker 就会重用这一层的缓存。虽然这可以显著提升构建速度,但有时你可能希望强制 Docker 忽略缓存,以确保从头开始重新…

JAVA小知识28:FIle类文件对象

Java 中的 File 类是 java.io 包中的一个类,用于表示文件和目录路径名的抽象表示。它提供了一些方法来操作文件和目录 一、File的创建 1.1、绝对路径 绝对路径是指从文件系统的根目录开始定位文件或目录的完整路径。它通常以根目录符号开始,在 Window…

【Mac】DMG Canvas for mac(DMG镜像制作工具)软件介绍

软件介绍 DMG Canvas 是一款专门用于创建 macOS 磁盘映像文件(DMG)的软件。它的主要功能是让用户可以轻松地设计、定制和生成 macOS 上的安装器和磁盘映像文件,以下是它的一些主要特点和功能。 主要特点和功能 1. 用户界面设计 DMG Canva…

Rocky Linux 更换CN镜像地址

官方镜像列表&#xff0c;下拉查找 官方镜像列表&#xff1a;https://mirrors.rockylinux.org/mirrormanager/mirrorsCN 开头的站点。 一键更改镜像地址脚本 以下是更改从默认更改到阿里云地址 cat <<EOF>>/RackyLinux_Update_repo.sh #!/bin/bash # -*- codin…

自研地面站!自主开源无人飞行系统 Prometheus V2 版重大升级详解

自主开源无人飞行系统 Prometheus V2 相对于 Prometheus V1 在多方面做了重大的升级&#xff0c;今天我们将聊聊 Prometheus V2 的地面站升级。 地面站的重大提升 熟悉 Prometheus 的小伙伴们可能知道&#xff0c;V1 版本是没有专门的地面站的。而在 Prometheus V2 中&#x…

java开发技巧01

1.参数传递不要太深&#xff0c;影响阅读&#xff0c;可以抽取单独的方法。 void method001(String param){ for(){ ...... } if(){ ...... } for(){ ...... } if(){ ...... } //在此处才用到 param ......; if(param){ param ...... } } 2.不要在循环里面频繁请求数据库&…