有三个文档,一个是《Universal Serial Bus Specification》,一个是《Universal Host
Controller Interface Design Guide》,还有一个是《Enhanced Host Controlelr
Interface for Universal Serial Bus》。
花了三个星期的时间,前面两个星期的效率还可以,看起来比较认真,理解的也相对清楚些,到后来是在是有些看不下去了,以至于想吐的地步,但不管怎么样,总
算是基本看完了。现在做做总结:首先是《Universal Host Controller Interface Design
Guide》,也就是USB2.0的规范。这篇文献从USB2.0的背景开始,对USB2.0技术的各个方面进行详细的描述和定义。我主要阅读了第4章及
其以后的部分。真要总结起来,恐怕不是这一篇日志就能总结得了的,我也不准备那样,毕竟周立功已经把中文版的书都出版了,且不管翻译的怎么样。下面我就把
零碎记录的一些东西录下来吧,顺便想到什么也写下来,当然谈不上系统了。USB系统在物理连接上是分层的星型拓扑结构,而在逻辑上,所有的USB设备都直
接连接到HOST
Controller。不管中间接了几个HUB。USB最多支持7层,127个设备。也就是说在一个USB系统中,最多可以有5个HUB级联。在USB规
范中,对传输线和HUB的延迟都有比较严格的定义。USB总线上数据内容的含义是由USB体系解析的,USB的硬件不负责内容的解析。USB总线上共有两
种数据,一种是流数据(Stream),一种是信息数据(Message)USB体系可分为三层:
HOST端------------------------Device端客户软件(USB应用软件) 功能接口
(Interface) USB系统软件 端点(默认端点和其他端点集)
USB主机控制器
USB总线接口端点(Endpoint)是USB通讯模型的终端多个端点组成接口(interface)0端点是一个特别的端点,任何USB设备均有0端
点,也称为默认端点,主要用于USB设备的配置、命令等。USB应用软件通过接口访问USB设备,接口又由端点组成,USB通讯在USB主机控制器的控制
下按照USB规范定义的格式和方式进行。
USB总线上的数据逐帧传送,高速USB总线上的帧称为微帧(microFrame),周期为125uS,全速以
及低速USB总线上的帧周期为1mS。不论高速、全速还是低速总线,帧序号以1mS为单位递增,即连续8个微帧的帧号是一样的。每个帧(微帧)可以包含多
个数据传输,例如可以由若干和同步传输、若干个中断传输以及批量传输构成。
控制传输在端点0进行,主要完成设备的配置、命令发送等。控制传输由三个步骤组
成:令牌+数据+握手,也可能没有数据,而只包括令牌和握手两个阶段。不论有没有数据,最后均由一个方向和前一阶段相反的握手传输结束,如。token
out (set up) + Data0(out) + IN handshake;token in(set up) + IN
handshake;token in(set up) + Data1(in) + out handshake(data length =
0);
同步传输是一种实时性极强的传输,没有重传机制,所以是不可靠的。在每一(微)帧的传输任务排定时,同步传输具有最高的优先级。
中断传输是一种延迟
有限的传输,具备重传机制,是一种可靠的传输。传输任务排定时优先级低于同步传输,但高于其他两种传输。高速-高带宽端点可以在每个(微)帧中最多进行3
次中断传输。
批量传输是一种延迟不确定的传输,这种传输尽量利用带宽进行传输,可以实现较高的速率,比较适合传送大的数据。也是一种可靠的传输。
USB分
层结构中,客户软件通过设备驱动程序访问USB设备,设备驱动程序则通过HCD(主机控制器驱动)访问USB总线,完成数据的传输。USB总线上,数据的
传输按照little
endian进行,即一个字节中最低有效位在前,最高有效位在后。
Packet是USB总线上数据传输的最小单位。每个Packet均由sync同步域开
始。(KJKJKK for L/F speed (15个KJ)KJKJKJ...KJKK for
high-speed)Packet的格式由USB规范定义,格式如下:
USB
响应USB的响应共包括ACK、NAK、NYET、STALL几种。ACK表示肯定的应答,数据已经被接收,并准备好接收下一个数据包。NAK表示否定的
应答,当前数据包未被接收,希望重传。NYET表示当前的数据已经被接收,但尚未准备好接收下一个数据包,期待PING测试。STALL则表示错误或端点
被设置STALL。
USB带宽被分为每秒1000帧。USB
1.1中的同步传输限制在每个帧的每个设备端点传输一个数据包。最大的包大小为1023字节,每秒总数据传输率为1 Mbps。USB
2.0不仅将数据率提高到480 Mbps,还将每个帧分成8个微帧,以降低对设备缓存的需求。USB
2.0还将每个设备的每个微帧1024字节的包容量扩大到3个数据包的容量。这样USB 2.0中ISO数据率从1 Mbps提高到24 Mbps
(每秒1000帧 × 每帧8微帧 × 每微帧3个数据包 × 每数据包1024字节)。
搞了这么久USB了,还是不知道DATA0,DATA1的最大包长,以及端点描述符中的最大包长与68013的端点缓冲区有什么关系,经过二小时的奋斗得出如下结论:
1.DATA0或DATA1实际上就是一个端点描述符中的最大包长。换句话说,68013发一次数据包就是一个DATA0或 DATA1
2.微帧是用来作为传输时间基准的。在每个微帧之间可以传一到多次
DATA0/DATA1,但是根据DATA0/DATA1(也就是68013一次发送的数据的长度)的大小,每个微帧之间可以传送DATA数据包的个数也
不同,DATA0/DATA1越大,每个微帧之间能传输的DATA的数据包的个数越少。在此 这个是指端点的包长度 单位字节
3.在USB2.0之中限定了描述符中的最大包长,是因为在一个微帧内由于物理条件的限制(物理带宽、bit率的原因),只能传输那么多。
4.固件使用的USB协议其实就是用来与上位机驱动进行通信的一种语言。换句话说,里面的描述符中的内容都是给上位机驱动看的。其中端点中的最大包长也就
是指的是,硬件的端点缓冲区。如果端点缓冲区比描述符中的最大包长小(在USB2.0协议最大包长范围之内),那么USB硬件接收到的数据在一定情况下将
会被截断,如果端点缓冲区比描述符中的最大包长大(在USB2.0协议最大包长范围之内),端点缓冲将会被浪费。
阅读(907) | 评论(0) | 转发(0) |