上海交通大学网站建设,摄影网站建设任务书,如何自己创建购物网站,网站开发所需要的技术USB协议 1. 硬件拓扑结构2. 协议层2.1 字节/位传输顺序2.2 SYNC域2.3 包格式2.3.1 PID域2.3.2 令牌包(Token)2.3.3 数据包2.3.4 握手包 2.4 传输细节2.4.1 传输(Transfer)和事务(Transaction)2.4.2 过程(stage)和阶段(phase)2.4.3 批量传输2.4.4 中断传输2.4.5 实时传输2.4.6 控… USB协议 1. 硬件拓扑结构2. 协议层2.1 字节/位传输顺序2.2 SYNC域2.3 包格式2.3.1 PID域2.3.2 令牌包(Token)2.3.3 数据包2.3.4 握手包 2.4 传输细节2.4.1 传输(Transfer)和事务(Transaction)2.4.2 过程(stage)和阶段(phase)2.4.3 批量传输2.4.4 中断传输2.4.5 实时传输2.4.6 控制传输 参考资料韦东山usb驱动 usb手册 1. 硬件拓扑结构 compound device 多个设备组合起来通过HUB跟Host相连composite device 一个物理设备有多个逻辑设备(multiple interfaces)
在软件开发过程中我们可以忽略Hub的存在硬件拓扑图简化如下
一个物理设备里面可能有多个逻辑设备Hos可以外接多个逻辑设备硬件拓扑图如下
2. 协议层
要理解协议层、理解数据如何传输带着这几个问题去看文档、看视频
如何寻址设备如何表示数据方向(读、还是写)如何确认结果
提前罗列出来
USB系统是一个Host对应多个设备要传输数据首先要通知设备 发出IN令牌包表示想读数据里面含有设备地址发出OUT令牌包表示想写数据里面含有设备地址 数据阶段 Host想读数据前面发出IN令牌包后现在读取数据包Host想发出数据前面发出OUT令牌包后现在发出数据包 结果如何有握手包 Host想读数据设备可能未就绪就会回应NAK包Host想写数据它发出数据后设备正确接收了就回复ACK包
2.1 字节/位传输顺序
先传输最低位(LSB)。
2.2 SYNC域
Host发出SOP信号后就会发出SYNC信号它是一系列的、最大传输频率的脉冲接收方使用它来同步数据。对于低速/全速设备SYNC信号是8位数据(从做到右是00000001)对于高速设备SYNC信号是32位数据(从左到右是00000000000000000000000000000001)。使用NRZI编码时前面每个0都对应一个跳变。
在很多文档里把SOP和SYNC统一称为SYNC它的意思是SYNC中含有SOP。
2.3 包格式 USB总线上传输的数据以包为单位。USB包里含有哪些内容(“域”)
SOP用来表示包的起始SYNC用来同步时钟PID表示包的类型地址在USB硬件体系中一个Host对应多个Logical Device那么Host发出的包如何确定发给谁 发给所有设备包里不含有设备地址发给某个设备包里含有设备地址、端点号 帧号、数据等跟PID相关的内容CRC校验码
发起一次完整的传输可能涉及多个包。那么第1个包里含有设备地址、端点号后续的包就没必要包含设备地址、端点号。
2.3.1 PID域
注意所有的USB文档提到的输入、“输出”都是基于Host的角度输出表示从Host输出到设备输入表示Host从设备得到数据。 有哪些USB包根据包数据里的PID的bit1, bit0可以分为4类
令牌包(Token)01B数据包(Data)11B握手包(Handshake)10B特殊包(Special)00B
PID有4位使用bit1,bit0确定分类使用bit3,bit2进一步细分。如下表(来自《圈圈教你玩USB》)所示 在USB包中PID域使用8位来表示格式如下 前4位表示PID后4位是对应位的取反。接收方发现后4位不是前4位的取反的话就认为发生了错误。
2.3.2 令牌包(Token)
令牌类的PID起通知作用通知谁SOF令牌包被用来通知所有设备OUT/IN/SETUP令牌包被用来通知某个设备。
对于OUT、IN、SETUP令牌包它们都是要通知到具体的设备格式如下 USB设备的地址有7位格式如下 USB设备的端点号有4位格式如下 对于SOF包英文名为Start-of-Frame marker and frame number。对于USB全速设备Host每1ms产生一个帧对于高速设备每125us产生一个微帧1帧里有8个微帧。Host会对当前帧号进行累加计数在每帧或每微帧开始时通过SOF令牌包发送帧号。对于高速设备每1毫秒里有8个微帧这8个微帧的帧号是一样的每125us发送一个SOF令牌包。
SOF令牌包格式如下
2.3.3 数据包
Host使用OUT、IN、SETUP来通知设备我要传输数据了。数据通过数据包进行传输。
数据包也有4种类型DATA0、DATA1、DATA2、MDATA。其中DATA2、MDATA在高速设备中使用。对软件开发人员来说我们暂时仅需了解DATA0、DATA1。
为什么要引入DATA0、DATA1这些不同类型的数据包为了纠错。
Host和设备都会维护自己的数据包切换机制当数据包成功发送或者接收时数据包类型切换。当检测到对方使用的数据包类型不对时USB系统认为发生了错误。
比如
Host发送DATA0给设备设备返回ACK表示成功接收设备期待下一个数据是DATA1但是Host没有接收到ACKHost认为数据没有发送成功Host继续使用DATA0发送上一次的数据设备再次接收到DATA0数据包它就知道哦这是重传的数据包
数据包格式如下 对于全速设备数据包中的数据做大是1023字节对于全速设备数据包中的数据做大是1024字节。
2.3.4 握手包
握手包有4类ACK、NAK、STALL、NYET
ACK数据接收方用来回复发送方表示正确接收到了数据并且有足够的空间保存数据。NAKHost发送数据给设备时设备可以回应NAK表示我还没准备好没办法接收数据Host想读取设备的数据时设备可以回复NAK表示我没有数据给你。STALL表示发生了错误比如设备无法执行这个请求(不支持该断点等待)、断点已经挂起。设备返回STALL后需要主机进行干预才能接触STALL状态。NYET仅适用于高速设备。Host可以发出PING包用来确认设备有数据设备可以回应NYET表示还没呢。Hub也可以回应NYET表示低速/全速传输还没完结。
2.4 传输细节
2.4.1 传输(Transfer)和事务(Transaction)
USB传输的基本单位是包(Packet)包的类型由PID表示。一个单纯的包是无法传输完整的数据。
为什么比如想输出数据可以发出OUT令牌包OUT令牌包可以指定目的地。但是数据如何传输呢还需要发出DATA0或DATA1数据包。设备收到数据后还要回复一个ACK握手包。
所以完整的数据传输需要涉及多个包令牌包、数据包、握手包。这个完整的数据传输过程被称为事务(Transaction)。
有些事务需要握手包有些事务不需要握手包有些事务可以传输很大的数据有些事务只能传输小量数据。
有四类事务
批量事务用来传输大量的数据数据的正确性有保证时效没有保证。中断事务用来传输周期性的、小量的数据数据的正确性和时效都有保证。实时事务用来传输实时数据数据的正确性没有保证时效有保证。建立事务跟批量事务类似只不过令牌包是SETUP令牌包。
有四类传输(Transfer)
批量传输就是使用批量事务实现数据传输比如U盘。中断传输就是使用中断事务实现数据传输比如鼠标。实时传输就是使用实时事务实现数据传输比如摄像头。控制传输由建立事务、批量事务组成所有的USB设备都必须支持控制传输用于识别/枚举
暂时记住这个关系
BIT组成域(Field)域组成包(Packet)包组成事务(Transaction)事务组成传输(Transfer)
2.4.2 过程(stage)和阶段(phase)
事务由多个包组成比如Host要发送数据给设备这就会涉及很多个包
Host发出OUT令牌包表示要发数据给哪个设备Host发出DATA0数据包设备收到数据后回应ACK包
这个完整的事务涉及3个包(Packet)分为3个阶段(Phase)
令牌阶段(Token phase)由令牌包实现数据阶段(Data phase)由数据包实现握手阶段(Handshake phase)由握手包实现
事务由包组成这些包分别处于3个阶段(phase)令牌阶段数据阶段握手阶段。
对于批量传输、中断传输、实时传输它们分别由一个事务组成不再细分为若干个过程。
但是控制传输由多个事务组成这些事务分别处于3个过程建立过程(stage)、数据过程(stage)、状态过程(stage)。
总结起来就是
控制传输由多个过程(stage)组成每个过程由一个事务来实现每个事务由多个阶段(phase)组成每个阶段有一个包来实现
2.4.3 批量传输
批量传输用批量事务来实现用于传输大量的数据数据的正确性有保证时效没有保证。
批量事务由3个阶段(phase)组成令牌阶段、数据阶段、握手阶段。每个阶段都是一个完整的包含有SOP、SYNC、PID、EOP。
下图中各个矩形框就对应一个完整的包。 《圈圈教你玩USB》中有详细的示例
2.4.4 中断传输
中断传输用中断事务来实现用于传输小量的、周期性的数据数据的正确性和时效都有保证。
中断事务由3个阶段(phase)组成令牌阶段、数据阶段、握手阶段。每个阶段都是一个完整的包含有SOP、SYNC、PID、EOP。
下图中各个矩形框就对应一个完整的包。 中断事务跟批量事务非常类似Host使用它来周期性地读数据、写数据。
以鼠标为例我们需要及时获得鼠标的数据不及时的话你会感觉鼠标很迟钝。但是USB协议中并没有中断功能它使用周期性的读、写来实现及时性。具体过程如下
Host每隔n毫秒发出一个IN令牌包鼠标有数据的话发出DATA0或DATA1数据包给Host鼠标没有数据的话发出NAK给Host。
中断事务的优先级比批量事务更高它要求实时性而批量事务不要求实时性。
2.4.5 实时传输
实时传输用实时事务来实现用于传输实时数据对数据的正确性没有要求。
实时事务由2个阶段(phase)组成令牌阶段、数据阶段。每个阶段都是一个完整的包含有SOP、SYNC、PID、EOP。
实时事务不需要握手阶段一个示例的场景是为了传输摄像头的实时数据偶尔的数据错误是可以忍受的大不了出现短暂的花屏。如果为了解决花屏而重传数据那就会导致后续画面被推迟实时性无法得到保证。
下图中各个矩形框就对应一个完整的包。 实时事务跟中断事务非常类似Host也会周期性的发起实时事务主要区别在于
实时事务不要求准确性没有握手阶段实时事务传输的数据量比较大中断事务传输的数据量比较小
2.4.6 控制传输
在使用批量传输时使用IN令牌包或OUT令牌包表示数据传输方向。
控制传输的令牌包永远是SETUP怎么分辨是读数据还是写数据发出SETUP令牌包后还要发出DATA0数据包根据数据的内容来确定后续是读数据还是写数据。这个过程称为建立事务(SETUP Transaction)
但是控制传输由多个事务组成这些事务分别处于3个过程建立过程(stage)、数据过程(stage)、状态过程(stage)。
建立过程(stage)使用SETUP事务Host发出SETUP令牌包、DATA0数据包、得到ACK握手包数据过程(stage)使用批量事务 对于输出Host发出OUT令牌包发出DATA0、DATA1数据包、得到ACK握手包对于输入Host发出IN令牌包读到DATA0、DATA1数据包、发出ACK握手包 状态过程(stage)使用批量事务 对于输出Host发出IN令牌包读到DATA1数据包发出ACK握手包对于输入Host发出OUT令牌包发出DATA1数据包等待ACK握手包 上图中的每一个方框都是一个完整的事务含有Token Packet、Data Packet、Handshake Packet。