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

一, 包的组成

每个包都由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接口芯片中,通过一些标志,我们知道哪个端点接收或成功发送了数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32F4----ADC模拟量转换成数字量

STM32F4----ADC模拟量转换成数字量 基本原理 当需要测量和记录外部电压的变化&#xff0c;或者根据外部电压的变化量来决定是否触发某个动作时&#xff0c;我们可以使用ADC&#xff08;模拟—数字转换器&#xff09;功能。这个功能可以将模拟的电压信号转换为数字信号&#x…

大数据学习18之Spark-SQL

1.概述 1.1.简介 Spark SQL 是 Apache Spark 用于处理结构化数据的模块。 1.2.历史 1.2.1.Shark Hadoop诞生初期&#xff0c;Hive是唯一在Hadoop上运行的SQL-on-Hadoop工具&#xff0c;MR的中间计算过程产生了大量的磁盘落地操作&#xff0c;消耗了大量的I/O&#xff0c;降低…

医学AI公开课·第一期|Machine LearningTransformers in Med AI

小罗碎碎念 从这周开始&#xff0c;我计划每个周末录一个视频&#xff0c;分享一些医学人工智能领域的进展。 作为第一期视频&#xff0c;我打算介绍一下机器学习和Transformer在医学AI领域中的应用。 为了准备这期视频&#xff0c;总共做了24页PPT&#xff08;三部分内容&…

小白投资理财 - 解读威廉指标 WR

小白投资理财 - 解读威廉指标 WR WR 指标WR 指标特点WR 指标解读WR 与其他指标的结合实战案例&#xff1a;WR 计算WR 的优缺点WR 和 Williams Fractals 的主要区别总结 上篇《小白投资理财 - 解读威廉分形指标 Williams Fractals》&#xff0c;今天我们来了解另外一个威廉指标 …

前端速通(HTML)

1. HTML HTML基础&#xff1a; 什么是HTML&#xff1f; 超文本&#xff1a; "超文本"是指通过链接连接不同网页或资源的能力。HTML支持通过<a>标签创建超链接&#xff0c;方便用户从一个页面跳转到另一个页面。 标记语言&#xff1a; HTML使用一组预定义的标签…

电商一件发货软件闲管家使用教程

闲鱼闲管家是一款专为闲鱼卖家设计的电脑版工作台&#xff0c;旨在帮助卖家更高效地管理其在闲鱼平台上的业务。以下是关于闲鱼闲管家的一些主要特点和功能&#xff1a; 主要特点&#xff1a; 多账号管理&#xff1a;支持同时管理多达30个闲鱼账号&#xff0c;方便大型卖家或…

第一个autogen与docker项目

前提条件&#xff1a;在windows上安装docker 代码如下&#xff1a; import os import autogen from autogen import AssistantAgent, UserProxyAgentllm_config {"config_list": [{"model": "GLM-4-Plus","api_key": "your api…

JavaEE 【知识改变命运】02 多线程(1)

文章目录 线程是什么&#xff1f;1.1概念1.1.1 线程是什么&#xff1f;1.1.2 为什么要有线程1.1.3 进程和线程的区别1.1.4 思考&#xff1a;执行一个任务&#xff0c;是不是创建的线程或者越多是不是越好&#xff1f;&#xff08;比如吃包子比赛&#xff09;1.1.5 ) Java 的线程…

LeetCode 力扣 热题 100道(八)相交链表(C++)

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

全面解析 JMeter 后置处理器:概念、工作原理与应用场景

在性能测试中&#xff0c;Apache JMeter是一个非常流行的工具&#xff0c;它不仅能够模拟大量用户进行并发访问&#xff0c;还提供了丰富的扩展机制来满足各种复杂的测试需求。后置处理器&#xff08;Post-Processor&#xff09;是JMeter中非常重要的组件之一&#xff0c;用于在…

java八股-SpringCloud微服务-Eureka理论

文章目录 SpringCloud架构Eureka流程Nacos和Eureka的区别是&#xff1f;CAP定理Ribbon负载均衡策略自定义负载均衡策略如何实现&#xff1f;本章小结 SpringCloud架构 Eureka流程 服务提供者向Eureka注册服务信息服务消费者向注册中心拉取服务信息服务消费者使用负载均衡算法挑…

每天五分钟机器学习:支持向量机数学基础之超平面分离定理

本文重点 超平面分离定理(Separating Hyperplane Theorem)是数学和机器学习领域中的一个重要概念,特别是在凸集理论和最优化理论中有着广泛的应用。该定理表明,在特定的条件下,两个不相交的凸集总可以用一个超平面进行分离。 定义与表述 超平面分离定理(Separating Hy…

day05(单片机高级)PCB基础

目录 PCB基础 什么是PCB&#xff1f;PCB的作用&#xff1f; PCB的制作过程 PCB板的层数 PCB设计软件 安装立创EDA PCB基础 什么是PCB&#xff1f;PCB的作用&#xff1f; PCB&#xff08;Printed Circuit Board&#xff09;&#xff0c;中文名称为印制电路板&#xff0c;又称印刷…

电脑自动关机时间如何定?Wise Auto Shutdown 设置关机教程

在日常使用电脑的过程中&#xff0c;有时我们需要让电脑在特定的时间自动关机&#xff0c;比如在下载大文件完成后、执行长时间的任务结束时&#xff0c;或者只是单纯想在某个预定时间让电脑自动关闭以节省能源。这时候&#xff0c;Wise Auto Shutdown 这款软件就能派上大用场了…

Lucene(2):Springboot整合全文检索引擎TermInSetQuery应用实例附源码

前言 本章代码已分享至Gitee: https://gitee.com/lengcz/springbootlucene01 接上文。Lucene(1):Springboot整合全文检索引擎Lucene常规入门附源码 如何在指定范围内查询。从lucene 7 开始&#xff0c;filter 被弃用&#xff0c;导致无法进行调节过滤。 TermInSetQuery 指定…

使用Kubernetes部署第一个应用

目录 前提条件 启动集群 部署 nginx 应用 创建 YAML 文件 应用 YAML 文件 查看部署结果 理解Pods 相关命令 公布应用程序 问题背景 Kubernetes Service&#xff08;服务&#xff09;概述 服务和标签 为Deployment 创建一个 Service 伸缩应用程序 Scaling&#x…

使用 Maven 创建 jar / war 项目

使用 Maven 创建 jar 项目 maven-archetype-quickstart 这个Archetype&#xff0c;基本内容包括&#xff1a; 一个包含junit依赖声明的 pom.xml 、src/main/java主代码目录及一个名为App的类 、src/test/java测试代码目录及一个名为 AppTest的测试用例maven-archetype-webapp 一…

HDR视频技术之四:HDR 主要标准

HDR 是 UHD 技术中最重要维度之一&#xff0c;带来新的视觉呈现体验。 HDR 技术涉及到采集、加工、传输、呈现等视频流程上的多个环节&#xff0c;需要定义出互联互通的产业标准&#xff0c;以支持规模化应用和部署。本文整理当前 HDR 应用中的一些代表性的国际标准。 1 HDR 发…

Ubuntu中使用多版本的GCC

我的系统中已经安装了GCC11.4&#xff0c;在安装cuda时出现以下错误提示&#xff1a; 意思是当前的GCC版本过高&#xff0c;要在保留GCC11.4的同时安装GCC9并可以切换&#xff0c;可以通过以下步骤实现&#xff1a; 步骤 1: 安装 GCC 9 sudo apt-get update sudo apt-get ins…

dubbo-go框架介绍

框架介绍 什么是 dubbo-go Dubbo-go 是 Apache Dubbo 的 go 语言实现&#xff0c;它完全遵循 Apache Dubbo 设计原则与目标&#xff0c;是 go 语言领域的一款优秀微服务开发框架。dubbo-go 提供&#xff1a; API 与 RPC 协议&#xff1a;帮助解决组件之间的 RPC 通信问题&am…