对于一个完整的USB系统,其主要由主机和设备两部分构成。主机也可以说成是上位机,它要面向操作或者使用人员。而设备即我们平时接触到的带有USB接口的一些设备。
主机主要由 客户软件,USB系统软件,USB总线接口 组成。
| | |
设备主要由 功能单元,USB逻辑单元,USB总线接口 组成。
主机:
客户软件 负责和对应设备的功能单元进行逻辑通信。由提供操作控制的界面应用程序和对操作人员透明的设备驱动程序组成。设备驱动程序主要作用是按照操作人员的操控要求向下一级的USB总线驱动程序(USBD)发出IO请求包(IRP)以启动传输。
USB系统软件 负责管理客户软件启动的数据传输,并和对应设备逻辑单元进行逻辑配置通信。包括USB总线驱动程序(USBD),USB主控制器驱动程序(HCD)组成。USBD实现对USB设备初始化,为其分配所需的主机资源,设置其参数等,USBD收到IRP时,会把这些数据重组成特定的格式——事务处理。HCD的主要负责把USBD建立的事务处理安排成列表。
USB总线接口 负责完成主机和设备间的实际数据传输。由主控制器和根集线器组成。主控制器负责读取HCD建立的事物列表,并安排到USB总线上。根集线器主要是扩展USB的接口数目。
——————————————————————————————————————
USB设备的构架是 一个USB设备由一个或多个配置构成,每一个配置由多个接口构成,而每一个接口又含有多个端点,配置和接口是对USB设备功能的抽象,端点完成实际传输。USB设备的格配置和接口信息由接口芯片固件中的各种描述符说明。
端点:每一个端点都由唯一的端点号,并且传输方向确定(IN or OUT)
特殊:0号端点,有IN and OUT两个物理单元,只支持控制传输。其作为缺省控制管道,建立各种配置信息,每个USB设备必有。
——————————————————————————————————————
USB的传输类型有四种:
(1)块传输:适用于类似打印机、扫描仪等传输量大,但对传输时间和速率无要求的设备。
(2)控制传输:适用于小量的,对传输时间和速率没有要求的设备。如USB设备配置信息。
(3)中断传输:适用于非大量,但具有周期性的数据,比如USB键鼠。
(4)同步传输:适用于大量的,速率恒定,且具有周期性的数据,比如音视频。
——————————————————————————————————————
USB通信采取的是NRZI编码
NRZI编码是一种差分编码,当有电平跳变代表“0”,无电平变化代表“1”。
为防止在传输一长列“1”时发生同步信号丢失的现象,在USB传输时采取了位填充机制。
为填充机制就是在传输数据过程中,若有连续6个“1”发出时,发送方会在6个“1”后插入一个“0”,在接收端检测到这样的序列时,会忽略掉第七位的“0”,从而保证传输数据的准确,若在第七位本就是个“0”时,也照常填充。
——————————————————————————————————————
USB的事务处理是主机和USB设备间数据传输的基本单位。
一个事物处理可以分为三个阶段;令牌阶段,数据阶段,握手阶段
字段是USB总线上数据传输的最小单位,USB总线上的数据是先传Lsb,再传Msb。
同步字段(SYNC),为保证传输同步(主机和设备不共用时钟),数据传输以SYNC开始,紧随其后的是包标识字段(PID),其指明信息包类型,格式及差错机制。在设备配置过程中,主机会为其分配一个唯一的地址,即地址字段(ADDR),其地址0位设备缺省地址字段,在USB设备复位等过程中,用于和主机进行配置等。
令牌包定义了数据传输的类型 有如下几个:IN,OUT,SETUP,PRE,
SPLIT,PING。
其中: SPLIT令牌包用于在高速传输中开启一个低/全速的事务处理,
SSPLIT用于开始一个SPLIT传输,CSPLIT用于停止SPLIT传输。
SSPLIT的格式如下:
字段名----位数(字节)
SPLIT PID ---- 8
Hub Addr ---- 7
SC -----1
Port --- 7
S ---- 1
E ----- 1
ET ----- 2
CRC5 ---- 5
其中HubAddr指出进行低全速传输的高速设备地址;SC对于SSPLIT要置
“0”以开始SPLIT传输,置“1”表示结束SPLIT令牌包(CSPLIT);Port指出低
全速在高速HUB上的端口号;S在中断传输,控制传输中表示传输速率,与E组合
来标示高速数据在全速数据中所处的位置;ET指明低全速食物所对应的端点的类
型。
PING令牌包:其主要是为了减少资源的占用,类似于发送数据
前的问询。在低全速事务处理中,如果USB设备暂时不能接收数据,会返回NAK,
而主机会在一定时间后,再次重新发送数据,如果此时USB设备仍然没有准备好
,返回NAK,在这个过程中,如果传输的数据量较大时,会很占用带宽,为节省
资源,主机改为发送PING令牌包代替大量的数据包。
数据包中即为所要传输的数据。数据字段随着不同的传输方式会有不同
的最大传输字节数。
握手包 用于指示传输的结果。
有ACK,NAK,STALL,NYET,ERR几种。
ACK 表示数据包没有错误,正确接收。
NAK 在OUT时表示设备不能接收数据,在IN时表示设备没有要发送的数据。
STALL 表示USB设备没有能力发送或接收数据,或着USB设备不支持某个控制请求
。
NYET 仅适用于高速传输,在SPLIT中,当低全速事务不能正确结束或HUB不能处
理该SPLIT时,HUB返回SPLIT 。
ERR 仅适用于高速,表明传输发生error。
-----------------------------------------------------------------
总线列举过程:
1)USB设备连接到HUB端口后,HUB立即供电,建立时间T1。
2)HUB监视USB数据线上的电压变化,当检测到有效的V(ih)时,HUB主动认为
总线上连接了USB设备。这段时间需要超过100ms。
3)HUB使用中断IN管道向主机发送连接报告,主机接着返回获取设备信息的令牌
包。
4)主机等待HUB的回报,超时会挂起。
5)主机向HUB发送复位设备而的请求,在复位的时间中,HUB会确定USB设备的速
率并报告主机。
6)主机提供至少100ms的时间用于恢复,一旦恢复时间结束,USB设备即进入缺
省状态,这时可从总线上获得电流使0号管道的控制事务得到响应。
7)主机向USB设备发出GetDescriptor(Device)请求,以取得其缺省控制管道
所支持的最大数据长度。
8)主机向USB设备发出GetAddress为其分配一个唯一的设备地址,USB设备要在
50ms内作出响应,之后USB设备即拥有了一个唯一的设备地址与主机通信。
9)主机使用新的地址向USB设备发GetDescriptor请求,以读取全部的配置信息
。
10)主机跟踪USB设备的配置信息,为其设置驱动程序。
11)加载驱动之后,主机发送SetConfiguration,对其选择一个合适的配置,