USB主机
USB主机在USB系统中处于中心地位。并且,对USB及其连接的设备有着特殊的责任。主机控制着所有对USB的访问一个外设。只有主机允许才有权力访问总线。主机同时也监测着USB的结构。USB主机包括三层:设备驱动程序,USB系统软件,USB主控制器(主机的总线接口)。另外,还有两个软件接口:USB驱动USBD接口,主机控制驱动(HCD)接口。
USB数据流
从逻辑上讲,USB数据的传输是通过管道进行的。USB系统软件通过缺省管道(与端点0相对应)管理设备。设备驱动程序通过其它的管道来管理设备的。功能接口实际的数据传输过程是这样的:设备驱动程序通过对USBD接口(USB driver interface)的调用,发出输入输出请求(IRPI/O Request Packet)。USB驱动程序接到请求后调用HCD接口(host controller driver interface),将IRP转化为USB的传输(transfer),一个IRP可以包含一个或多个USB传输; 然后HCD将USB传输分解为总线操作(transaction),由主控制器以包(packet)的形式发出。需要注意的是,所有的数据传输都是由主机开始的,任何外设都无权开始一个传输。
IRP是由操作系统定义的,而USB传输与总线操作是USB规范定义的。为了进一步说明USB传输,我们引出帧frame的概念。 帧:USB总线将1ms定义为一帧,每帧以一个SOF包为起始,在这1ms里USB进行一系列的总线操作。引入帧的概念主要是为了支持与时间有关的总线操作。 为了满足不同外设和用户的要求,USB提供了四种传输方式:控制传输,同步传输,中断传输,批传输。它们在数据格式,传输方向,数据包容量限制,总线访问限制等方面有着各自不同的特征:
控制传输(Control Transfer)
1.通常用于配置/命令/状态等情形
2.其中的设置操作setup和状态操作status的数据包具有USB定义的结构。因此控制传输只能通过消息管道进行
3.支持双向传输
4.对于高速设备,允许数据包最大容量为81632或64字节。对于低速设备,只有8字节一种选择
5.端点不能指定总线访问的频率和占用总线的时间,USB系统软件会做出限制
6 具有数据传输,保证在必要时可以重试
同步传输(Isochronous Transfer)
1.是一种周期的连续的传输方式,通常用于与时间有密切关系的信息的传输
2.数据没有USB定义的结构数据流管道
3.单向传输。如果一个外设需要双向传输,则必须使用另一个端点
4.只能用于高速设备,数据包的最大容量可以从0到1023个字节
5.具有带宽保证,并且保持数据传输的速率恒定。每个同步管道每帧传输一个数据包
6.没有数据重发机制,要求具有一定的容错性
7.与中断方式一起占用总线的时间不得超过一帧的90%
中断传输(Interrupt Transfer)
1.用于非周期的自然发生的数据量很小的信息的传输,如键盘鼠标等
2.数据没有USB定义的结构数据流管道
3.只有输入这一种传输方式即外设到主机
4.对于高速设备允许数据包最大容量为小于或等于64字节,对于低速设备,只能小于或等于8字节
5.具有最大服务周期保证,即在规定时间内保证有一次数据传输
6.与同步方式一起占用总线的时间不得超过一帧的90%
7.具有数据传输保证在必要时可以重试
批传输(Bulk Transfer)
1.用于大量的对时间没有要求的数据传输
2.数据没有USB定义的结构数据流管道
3.单向传输,如果一个外设需要双向传输,则必须使用另一个端点
4.只能用于高速设备,允许数据包最大容量为81632或64字节
5.没有带宽的保证,只要有总线空闲就允许传输数据,优先级小于控制传输
6.具有数据传输,保证在必要时可以重试,以保证数据的准确性
|
|
|
USB总线协议
所有总线操作都可以归结为三种包的传输:任何操作都是从主机开始的,主机以预先排好的时序发出一个描述操作类型,方向外设地址,以及端点号(这将在以下部分给予解释)的包。我们称之为令牌包(Token Packet)。然后在令牌中指定的数据发送者发出一个数据包或者指出它没有数据可以传输。而数据的目的地一般要以一个确认包(Handshake Packet)作出响应,以表明传输是否成功。
域的类型
同步域(SYNC field)。所有的包都起始于SYNC域,它被用于本地时钟与输入信号的同步。并且在长度上定义为8位。SYNC的最后两位作为一个记号,表明PID域(标识域)的开始。在以后的叙述中SYNC域将被省去。
标识域(Packet Identifier Field)。对于每个包PID都是紧跟着SYNC的。PID指明了包的类型及其格式。主机和所有的外设都必须对接收到的PID域进行解码。如果出现错误或者解码为未定义的值,那么这个包就会被接收者忽略。如果外设接收到一个PID,它所指明的操作类型或者方向不被支持,外设将不作出响应。
地址域(Address Field)。外设端点都是由地址域指明的。它包括两个子域外设地址和外设端点。外设必须解读这两个域。其中有任何一个不匹配,这个令牌就会被忽略。
外设地址域(ADDR)。指定了外设,它根据PID所说明的令牌的类型,指明了外设是数据包的发送者或接收者。ADDR共6位,因此最多可以有127个地址。一旦外设被复位或上电,外设的地址被缺省为0,这时必须在主机枚举过程中被赋予一个独一的地址。而0地址只能用于缺省值而不能分配作一般的地址。
端点域(ENDP)。有4位,它使设备可以拥有几个子通道,所有的设备必须支持一个控制端点0(endpoint 0)。低速的设备最多支持2个端点0和一个附加端点。高速设备可以支持最多16个端点。
帧号域(Frame Number Field)。这是一个11位的域,指明了目前帧的排号。每过一帧(1ms),这个域的值加1,到达最大值XFF后,返回0。这个域只存在于每帧开始时的SOF令牌中,SOF令牌在下面将详细介绍。
数据域(Data Field)。范围是01023字节,而且必须是整数个字节。
CRC校验。包括令牌校验和数据校验。
包的类型
令牌包(Token Packed) 其中包括:IN(输入),OUT(输出),SETUP(设置)和SOF(Start of Frame帧起始)四种类型。
对于OUT和SETUP来说,ADDR和ENDP中所指明的端点将接收到主机发出的数据包,而对IN来说,所指定的端点将输出一个数据包。
Token和SOF在三个字节的时间内,以一个EOP(End of Packet)结束。如果一个包被解码为Token包,但是并没有在3个字节时间内以EOP结束,它就会被看作非法或被忽略。
数据包包括Data0和Data1两种类型。这两种包的定义是为了支持数据触发。同步数据包包含了PIDDATA和CRC三个域。
应答包(Handshake Packet)仅包含一个PID域。Handshake用来报告数据传输的状态,只有支持流控制的传输类型,控制中断和批传输才能返回Handshake。
|
|
|