Linux内核USB2.0驱动框架分析--USB包

news2024/11/24 17:22:41

一, 包的组成

每个包都由SOP(包起始域)、SYNC(同步域)、Packet Content(包内容)、EOP(包结束域)四部分组成,其中SOP、SYNC、EOP为所有包共有的域,Packet Content最为核心,不同类型的包由不同的Packet Content组成。
在这里插入图片描述

包的组成结构,由SOP、SYNC、Packet Content、EOP四部分组成,其中Packet Content最为核心,Packet Content由PID、地址、帧号、数据、CRC组成。
在这里插入图片描述
1.1 包的内容:
包是USB总线上数据传输的最小单位,不能被打断或干扰,否则会引发错误。若干个数据包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成。一次传输由一次到多次事务传输构成,可以跨帧完成
在这里插入图片描述
1.1.1 SOP域(Start Of Packet)

通过将D +和D-线从空闲状态驱动到相反的逻辑电平(K状态),由始发端口发信号通知分组的开始(SOP)。 此开关级别表示SYNC字段的第一位。 当重新传输到小于±5 ns时,集线器必须限制SOP第一位宽度的变化。 通过将通过集线器的标称数据延迟与集线器的输出使能延迟相匹配,可以最小化失真。
  在这里插入图片描述

1.1.2 SYNC字段:
同步域,由8位组成,作为每个数据包的前导,用来产生同步作用,使USB设备与总线的包传输率同步,对于低速和全速设备,它的数值固定为00000001.该数据通过NRZI编码后,就是一串0101010的方波,而发送方波的频率,就是发送数据的波特率。对于高速设备,同步域使用的是31个0,后面跟随1个1.

1.1.3 PID字段:
用来表示数据封包的类型。包标识符的校验字段是通过对类型字段的每个位反码产生的,PID字符如下图所示:
在这里插入图片描述

这里只用(PID04),PID47是PID0~4的取反,用来校验PID

PID1~0:01 令牌包、11 数据包、10 握手包、00 特殊包 

在这里插入图片描述
其中PID传送的前两位(PID<0:1>指出了其属于哪个组),这说明了PID的编码分布。
在这里插入图片描述

1.1.4 数据字段:
用来携带主机和设备之间传递的信息,其内容和长度根据包标识符、传输类型的不同而各不同。在USB包中,数据字段可以包括设备地址、端点号、帧序列号以及数据等内容。在总线传输中总是先传输字节的最低位,最后传输字节的最高位。

设备地址(ADDR)数据域:ADDR数据域由7位组成,代表了设备在主机上的地址,地址000 0000被命名为零地址,是任何一个设备第一次连接到主机时,在被主机配置、枚举前的默认地址,可用来寻址多达127个外围设备。

端点(ENDP)数据域.:ENDP数据域由4位组成。通过4个位最多可寻址出16个端点。这个ENDP数据域仅用在IN、OUT与SETUP令牌信息包中。对于慢速设备可支持端点0以及端点1作为终端传输模式,而全速设备则可以拥有16个输入端点(IN)与16个输出端点(OUT)共32个端点。
在这里插入图片描述

帧序列号(FRAM)域:帧号字段用于指出当前帧的帧号,它仅在每帧/小帧开始的SOF令牌包中被发送,其数据位长度为11位,每传输一帧,主机就将其内容加1,最大数值为0X7FF,当帧序列号达到最大数时将自动从0开始循环。
在这里插入图片描述

数据域:长度为0到1023字节(实时传输),它仅存在于DATA信息包中,根据不同的传输类型,拥有不同的字节大小,但必须为整个字节的长度。
在这里插入图片描述

CRC字段:由不同数目的位组成。根据不同的信息包的类型,CRC数据域由不同数目的位所组成。其中重要的数据信息包采用CRC16的数据域(16个位),而其余的信息包类型采用CRC5的数据域(5个位)。其中的循环冗余码校验CRC,是一种错误检测技术。由于数据在传输时,有时候会发生错误,因此CRC可根据数据算出一个校验值,然后依此判断数据的正确性。CRC只校验PID之后的数据,不包括PID本身,因为PID本身通过四个取反位校验。
在这里插入图片描述

1.1.5 EOP段:
全速或低速设备的结束包:SE0状态用于发信号通知分组结束(EOP)。 通过将D +和D-驱动到SE0状态两位时间,然后将线路驱动到J状态一位时间来发信号通知EOP。 从SE0到J状态的转换定义了接收器处的分组的结束。 J状态被置位一个位时间,然后D +和D-输出驱动器都处于高阻态。 总线终端电阻将总线保持在空闲状态。

注:SE0的意思是D+和D-都表示为低电平。
在这里插入图片描述
二、包的分类

每种类型的包组成会有所不同,按照组成所有的包会被分成帧首包SOF(Start of Frame)、命令包(Token)、数据包(Data)、握手包(Handshake)四大类型。
在这里插入图片描述
①令牌包(Token Packet):

在USB系统中,只有主机才能发出令牌包。令牌包定义了数据传输的类型,它是事务处理的第一个阶段,用来启动一次USB传输。令牌包中较为重要的是SRTUP、IN和OUT这三个令牌包。他们用来在根集线器和设备端点之间建立数据传输。

输出(OUT)令牌包:用来通知设备将要输出一个数据包
输入(IN)令牌包:用来通知设备返回一个数据包
建立(SETUP)令牌包:只用在控制传输中,和输出令牌包作用一样,也是通知设备将要输出一个数据包,
两者区别在于:

SETUP令牌包后只使用DATA0数据包,且只能发送到设备的控制端点,并且设备必须要接收,
而OUT令牌包没有这些限制。 

其格式如下:
在这里插入图片描述
在这里插入图片描述
例子:
在这里插入图片描述
②SOF Packet

SOF包由Host发送给Device,在每帧(或微帧)开始时发送,以广播的形式发送,所有USB全速设备和高速设备都可以接收到SOF包。

1) 对于full-speed总线,每隔1.00 ms ±0.0005 ms发送一次;

2) 对于high-speed总线,每隔125 μs ±0.0625 μs发送一次; 

在这里插入图片描述

SOF包以相对于每帧的开始精确计算的时间间隔发送SOF记号和伴随的帧数,包括集线器的所有全速/高速设备都可以接收到SOF包。SOF包不会使得接收功能部件产生返回包,因此,不能保证向任何给定的设备发送SOF都能被接收到。当设备探测到SOF的PID时,会被告知发生了SOF。

例子:
在这里插入图片描述

0xA5:1010 0101:对应上面PID表可知是帧起始包

③Data Packet、

数据包含有4个域:SYNC、PID、DATA和CRC16。有四种类型的数据包:DATA0, DATA1, DATA2,and MDATA,且由PID来区分。DATA0和DATA1被定义为支持数据切换同步(data toggle synchronization)。在USB1.1协议中,只有两种数据包:DATA0和DATA1,USB2.0中增加了DATA2和MDATA,主要用于高速分裂事务和高速高带宽同步传输中。

DATA数据域的位值是根据USB设备的传输速度及传输类型而定的,且须以8字节为基本单位。也就是传输的数据不足8字节的。或是传输到最后所剩余的也不足8字节的,仍需传输8字节的数据域。格式如下:
在这里插入图片描述
在这里插入图片描述

主机和设备都会维护自己的一个数据包类型切换机制:当数据成功发送或者接收时,数据包类型会进行切换。当检测到对方所使用的数据包类型不对时(未切换),USB系统会认为这发生了一个错误,并试图从错误中恢复。数据包类型不匹配主要发生在握手包被损坏的情况,当一端已经正确接收到数据并返回确认信号时,确认信号却在传输过程中被损坏。此时另一端就无法知道刚刚发送的数据是否已经成功,由于未接到返回确认信号,则只好保持自己的数据包类型不变,这时就要通过对方下一次的数据包类型判断传输是否成功。如果对方下一次使用的数据包类型和自己的不一致,则可以确定自己刚刚已经成功发送(因为对方已经做了数据切换,只有正确接收才会如此);如果下一次对方发送的数据和自己一致。则说明刚刚发送的数据包没有成功。

例子:
在这里插入图片描述

④Handshake Packet

握手信息包是最简单的信息包类型。在这个握手信息包中仅包含一个PID数据域而已,其格式如下:
在这里插入图片描述
在这里插入图片描述

握手包主要用来报告数据事务的状态,还能表示数据成功接收、命令的接收或拒绝、流控制和停止条件,只有支持流控制的事务类型才能返回握手信号。

主机和设备都可以使用ACK来确认,而NAK、STALL、NYET只有设备可以返回,主机不能使用这些握手包。NYET只在USB2.0的高速设备的输出事务中使用,表示本次数据成功接收,但没有足够的空间接收下一次数据,主机在下一次输出数据时,将先使用PING令牌包试探设备是否有空间接收数据,避免不必要的带宽浪费。

注意,当USB主机或设备检测到数据传输错误时(如CRC校验错、PID校验错、位填充错误时),将什么都不返回,这是等待接收握手信号包的一方将不会收到握手包而等待超时。

例子:
在这里插入图片描述

三,总结
数据包处理的很多过程在USB接口芯片中都已经处理好,故我们不必关心这些细节。一般的USB接口芯片会完成如CRC校验、位填充、数据切换、握手等协议的处理。

当USB接口芯片正确接收到数据时,如有空间保存,则将数据保存并返回ACK,同时设置一个标志表示已经正确接收到数据;如果没有空间保存,则自动返回一个NAK。

收到输入请求时,如有数据需要发送,则发送数据,并等待接收ACK。只有当数据成功发送出去(即接收到应答信号ACK)之后,它才设置标志,表示数据已经成功发送;如果无数据需要发送,则地洞返回NAK。

通常只需要根据芯片提供的一些标志,准备要发送的数据到端点,或从端点读取接收到的数据即可。所要发送的数据是指数据包中的数据,至于同步域、包标识、地址、端点、CRC等是看不到的,在**BUS Hound(USB抓包工具)**中抓到的数据也是如此,仅是数据包。在USB接口芯片中,通过一些标志,我们知道哪个端点接收或成功发送了数据。

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

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

相关文章

云轴科技ZStack亮相2024 IDC中国生态峰会,共塑AI时代IT生态新格局

11月21日&#xff0c;2024 IDC中国生态峰会在北京举办&#xff0c;吸引了超过300位生态伙伴齐聚一堂&#xff0c;聚焦行业内最前沿的热点话题。本届峰会以“创见先机&#xff0c;智领风云”为主题&#xff0c;深入探讨宏观经济趋势、技术革新以及如何融合AI与数据技术&#xff…

C0029.在Clion中解决Debug时,提示Process finished with exit code -1的错误

1.错误提示 Process finished with exit code -12.解决办法 如上在使用Debug进行代码调试时&#xff0c;直接出现如上报错&#xff0c;解决办法就是直接点击运行程序&#xff0c;即可查出报错编号&#xff0c;然后根据报错编号来查找问题&#xff1b; 然后在网上就可以根据该…

07-Making a Bar Chart with D3.js and SVG

课程链接 Curran的课程&#xff0c;通过 D3.js 的 scaleLinear, max, scaleBand, axisLeft, axisBottom&#xff0c;根据 .csv 文件生成一个横向柱状图。 【注】如果想造csv数据&#xff0c;可以使用通义千问&#xff0c;关于LinearScale与BandScale不懂的地方也可以在通义千…

读取各种来源格式单细胞数据集构建seurat分析对象,代做生信分析

参考资料和分析注意事项 全流程的分析指导视频 演示数据集网盘文件 分析参数文件路径格式的特别提示 大家给要分析用到的文件路径或目录路径的时候&#xff0c;以D:/omics_tools/demo_data/scrnaseq/GSE189125/GSE189125_5prime_scRNAseq_seqbatchA_counts.txt.gz 这个文件为…

SQL-多表操作

前文所介绍的sql操作都是基于单表进行的&#xff0c;接下来我们来学习多表操作。 多表设计 在实际的项目开发中&#xff0c;会根据业务需求和业务模块之间的关系进行数据库表结构设计&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xf…

c++ STL线程安全使用

c STL不是线程安全的&#xff0c;因此在多线程中使用的时候&#xff0c;操作同一个容器&#xff0c;会崩溃&#xff0c;因此需要解决线程安全的问题&#xff1a; 使用实例类似于以下&#xff1a; #include <thread> #include <vector> #include "thread_safe…

Swift 实现判断链表是否存在环:快慢指针法

文章目录 前言摘要描述题解答案题解代码题解代码分析示例测试及结果时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗留问题&#xff0c;最近有时间将以往遗留问题一一完善。 LeetCode - #141 环形链表 不积跬步&#xff0c;无以至千里&#xff1b;不积小流…

SpringCloud实用-OpenFeign 调用三方接口

文章目录 前言正文一、项目环境二、项目结构2.1 包的含义2.2 代理的场景 三、完整代码示例3.1 定义FeignClient3.2 定义拦截器3.3 配置类3.4 okhttp配置3.5 响应体3.5.1 天行基础响应3.5.2 热点新闻响应 3.6 代理类3.6.1 代理工厂3.6.2 代理客户端3.6.3 FeignClient的建造器 四…

C++设计模式行为模式———中介者模式

文章目录 一、引言二、中介者模式三、总结 一、引言 中介者模式是一种行为设计模式&#xff0c; 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。 中介者模式可以减少对象之间混乱无序的依赖关系&…

HarmonyOS:使用ArkWeb构建页面

一、简介 页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景&#xff0c;包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 页面加载过程中&#xff0c;若涉及网络资源获取&#xff0c;需要配置ohos.permission.INTERNET网络访问权限。 二、…

矩阵的拼接

矩阵的拼接分为横向拼接和纵向拼接 注意&#xff1a;横向拼接要求两矩阵行数相同&#xff0c;纵向拼接要求两矩阵列数相同 h o r z c a t horzcat horzcat和 v e r t c a t vertcat vertcat函数 h o r z c a t ( a , b ) horzcat(a,b) horzcat(a,b)将 a a a和 b b b横向拼接&a…

SpringCloud框架学习(第五部分:SpringCloud Alibaba入门和 nacos)

目录 十二、SpringCloud Alibaba入门简介 1. 基本介绍 2.作用 3.版本选型 十三、 SpringCloud Alibaba Nacos服务注册和配置中心 1.简介 2.各种注册中心比较 3.下载安装 4.Nacos Discovery服务注册中心 &#xff08;1&#xff09; 基于 Nacos 的服务提供者 &#xf…

Ollama vs VLLM:大模型推理性能全面测评!

最近在用本地大模型跑实验&#xff0c;一开始选择了ollama,分别部署了Qwen2.5-14B和Qwen2.5-32B&#xff0c;发现最后跑出来的实验效果很差&#xff0c;一开始一直以为prompt的问题&#xff0c;尝试了不同的prompt&#xff0c;最后效果还是一直不好。随后尝试了vllm部署Qwen2.5…

.NET9 - 新功能体验(一)

被微软形容为“迄今为止最高效、最现代、最安全、最智能、性能最高的.NET版本”——.NET 9已经发布有一周了&#xff0c;今天想和大家一起体验一下新功能。 此次.NET 9在性能、安全性和功能等方面进行了大量改进&#xff0c;包含了数千项的修改&#xff0c;今天主要和大家一起体…

LeetCode 144.二叉树的前序遍历

题目&#xff1a;给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 思路&#xff1a;根 左 右 代码&#xff1a; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNod…

【论文阅读】WGSR

0. 摘要 0.1. 问题提出 1.超分辨率(SR)是一个不适定逆问题&#xff0c;可行解众多。 2.超分辨率(SR)算法在可行解中寻找一个在保真度和感知质量之间取得平衡的“良好”解。 3.现有的方法重建高频细节时会产生伪影和幻觉&#xff0c;模型区分图像细节与伪影仍是难题。 0.2. …

游戏引擎学习第21天

虽然没有上一节的难但是内容也很多 关于实现和使用脚本语言 以下是详细复述&#xff1a; 许多人经常问一个问题&#xff0c;反复问过好几次&#xff0c;那就是&#xff1a;是否会在项目中实现脚本语言。这个问题的具体形式通常是&#xff1a;你们会使用脚本语言吗&#xff1…

NVR接入录像回放平台EasyCVR视频融合平台加油站监控应用场景与实际功能

在现代社会中&#xff0c;加油站作为重要的能源供应点&#xff0c;面临着安全监管与风险管理的双重挑战。为应对这些问题&#xff0c;安防监控平台EasyCVR推出了一套全面的加油站监控方案。该方案结合了智能分析网关V4的先进识别技术和EasyCVR视频监控平台的强大监控功能&#…

springboot vue工资管理系统源码和答辩PPT论文

人类现已迈入二十一世纪&#xff0c;科学技术日新月异&#xff0c;经济、资讯等各方面都有了非常大的进步&#xff0c;尤其是资讯与网络技术的飞速发展&#xff0c;对政治、经济、军事、文化等各方面都有了极大的影响。 利用电脑网络的这些便利&#xff0c;发展一套工资管理系统…

部署实战(二)--修改jar中的文件并重新打包成jar文件

一.jar文件 JAR 文件就是 Java Archive &#xff08; Java 档案文件&#xff09;&#xff0c;它是 Java 的一种文档格式JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中&#xff0c;多出了一个META-INF/MANIFEST.MF 文件META-INF/MANIFEST.MF 文件在生成 JAR 文件的时候…