一.USB硬件拓扑结构
- compound device :多个设备组合起来,通过HUB跟Host相连
- composite device :一个物理设备有多个逻辑设备(multiple interfaces)
在软件开发过程中,我们可以忽略Hub的存在,硬件拓扑图简化如下:
一个物理设备里面可能有多个逻辑设备,Hos可以外接多个逻辑设备,硬件拓扑图如下:
二.USB协议层
问题提出:
->如何寻址设备?
->如何表示数据方向(读、还是写)
->如何确认结果?
提前罗列出来:
USB系统是一个Host对应多个设备,要传输数据首先要通知设备:
-> 发出IN令牌包:表示想读数据,里面含有设备地址
-> 发出OUT令牌包:表示想写数据,里面含有设备地址
数据阶段:
->Host想读数据:前面发出IN令牌包后,现在读取数据包
->Host想发出数据:前面发出OUT令牌包后,现在发出数据包
结果如何?有握手包:
->Host想读数据,设备可能未就绪,就会回应NAK包
->Host想写数据,它发出数据后,设备正确接收了,就回复ACK包
字节/位传输顺序:
先传输最低位(LSB),描述数据时按照传输顺序从左到右列出来。
SYNC域:
Host发出SOP信号后,就会发出SYNC信号:它是一系列的、最大传输频率的脉冲,接收方使用它来同步数据。对于低速/全速设备,SYNC信号是8位数据(从做到右是00000001);对于高速设备,SYNC信号是32位数据(从左到右是00000000000000000000000000000001)。使用NRZI编码时,前面每个"0"都对应一个跳变。
包格式:
SOP:用来表示包的起始
SYNC:用来同步时钟
PID:表示包的类型
地址:在USB硬件体系中,一个Host对应多个Logical Device,那么Host发出的包,如何确定发给谁?
CRC:校验码
PID域:
有哪些USB包?根据包数据里的PID的bit1, bit0可以分为4类:
- 令牌包(Token):01B
- 数据包(Data):11B
- 握手包(Handshake):10B
- 特殊包(Special):00B
传输和事务:
有四类事务:
批量事务:用来传输大量的数据,数据的正确性有保证,时效没有保证。
中断事务:用来传输周期性的、小量的数据,数据的正确性和时效都有保证。
实时事务:用来传输实时数据,数据的正确性没有保证,时效有保证。
建立事务:跟批量事务类似,只不过令牌包是SETUP令牌包。
有四类传输(Transfer):
批量传输:就是使用批量事务实现数据传输,比如U盘。
中断传输:就是使用中断事务实现数据传输,比如鼠标。
实时传输:就是使用实时事务实现数据传输,比如摄像头。
控制传输:由建立事务、批量事务组成,所有的USB设备都必须支持控制传输,用于"识别/枚举"