赞
踩
usb 数据传输发生在主机软件和usb 设备上特定的端点(endpoint)之间。这种主机软件和usb设备端点之间的逻辑通路叫做pipe. pipe 的两端是主机usb device driver的一块buffer和usb device的一个endpoint。pipe之间是独立的,一个USB device工作的过程中可能会存在多个pipe.一个pipe在形成的时候就进行一种数据传输。软件一般通过传输类型+设备号+端点号+传输方向产生pipe的唯一标示号。
pipe 根据是否规定事务阶段(transaction)分为两种类型:
stream pipe
控制传输、块传输、中断传输建立起来的都是stream pipe。
message pipe
message pipe 只有控制传输。
几个名词
在setup阶段中由data阶段的数据方向和长度,因为0号端点支持双向,从setup当中获取到方向后准备相应的buffer。
有延迟要求的数据传输被称作中断数据。这类数据由usb device在不确定的时间产生,由usb在不低于指定的速率下传输。
最典型的中断数据是事件通知、字符、坐标这些若干字节的数据。典型的例子是鼠标点击是发送的坐标数据,这种数据需要usb限制响应时间(在指定时间内做出响应)。
占据一个预先协商好的usb带宽,也被称作实时流传输。同步数据是以稳定的速率传输的数据,比如音频和视频数据,usb分配专用的一部分带宽来传输同步数据以保证数据的稳定速率。
usb 系统数据流模型如上图,相关的部分有
USB全速和低速标准以1ms间隔划分时间为帧(frame), 高速标准以125us间隔划分时间为小帧(micro-frame).
ehci 硬件接口是usb2.0硬件接口标准。规定了echi主机基本寄存器和列表和工作方式。
主机控制器寄存器包括两部分
Queue Head Horizontal Link Pointer指向下一个QH.Current qTD Pointer 指向当前的QTD.
这里最重要的一部分是transfer overlay区域,这部分区域跟QTD完全一样,是当前处理QTD的一份cache.
Queue Head 与QTD一起完成传输数据的管理。一个Queue Head管理对应一个endpoint的数据流。Queue head中包含端点的属性和能力信息。一个QTD管理一个或多个总线事务(transaction), 表示一个传输(transfer).
QueueHead处理的步骤如下:
可以通过USBCMD中的相应位控制开启异步传输和周期传输控制。控制器开始工作,port register开始响应设备的插入。并且在使能的高速设备端口发出SOF帧起始信号。
host 集成根集线器(root hub), roothub是没有TT模块的。 usb 主机控制器由一个ehci 和多个xhci构成,如上图是一个echi和一个伴随的USB1.1 host control, 每一个物理端口对应一个Transceiver, echi 控制器中有对应与每一个port的状态和控制寄存器。伴随USB1.1 host controller中有它所选定的port的状态和控制寄存器。每一个transceiver 都可以由echi 或者1.1控制器所控制。
在复位时,port 默认由1.1控制器控制,如果系统没有ECHI,并且有1.1伴随控制器的情况下,端口会一直保持在全速/低速模式下。当echi 控制器拥有端口时,xhci 不会知道port transceiver的存在,同样xhci拥有端口时,ehci 也不会知道端口的存在。
端口路由的控制由功能寄存器中的configure flag 和portsc 中的port owner bit 控制,HCSPARAMS寄存器中的N_CC bit 说明硬件中是否有xhci。有configure flag 和 port owner 配合控制端口路由逻辑的状态转换图如下。
通过USBCMD run/stop bit 挂起EHCI, 通过PORTSC挂起相应的端口连接的设备。恢复时相反的过程。
设备的挂起和回复过程中,包括主机主动挂起和恢复port,以及主机检测到wake up event后回复。
主机挂起端口后,恢复指定port时,port必须处在挂起状态,否则设备的动作未定义。主机恢复设备的状态,端口的port change bit并不会改变。
主机检测到wake up事件时,端口的force port resume 置为1,USBSTS中的port change bit 置为1,如果此时USBINTR中的port change interrupt enable 为1的话,EHCI会上报中断。
usb2.0 最大传输速度480Mb/s, 分为125us长度的小帧,每个小帧能传60kb.
在每一小帧当中,ECHI首先根据PERIODICLISTBASE + FRINDEX选中一个周期table中的指针开始执行这个元素管理下的链表,知道遇到next link pointer当中的Tbit为1. 此时主机立即释放周期传输结构开始传输异步链表中的数据,知道这个小帧的结尾。
周期帧链表(periodic frame list)
周期帧链表是同步传输和中断传输的实现基础。
同步传输描述符ITD管理同步传输数据,queue head(QH)在同步链表、异步链表管理中断传输,块传输、控制传输数据。
异步链表(asynchronous list)
异步链表是用来支持块传输(bulk transfer)和控制传输(control transfer)的。
host controller 优先遍历周期帧链表,遇到周期帧链表中的结束标志时,才会处理异步链表。所以同步传输和中断传输这两种受时间限制的数据优先级是高的,块传输控制传输在异步链表中处理的传输优先级低。
小帧完整性
usb2.0 一小帧中能够传送的最大bit数为60kbit, 也就是7500byte. 这里存在的一个问题是如何确定在一个小帧中能够发送的事务的数量。小帧的结束点由于2.0的物理限制定义有EOF1和EOF2, 所以能够利用的有效带宽是SOF到EOF1, 在接近EOF1时的时间区间内,对于不同的包长,在保证事务完整的情况下的最晚发送时间点不同。最后截止时间点的计算非常重要,它影响到带宽的利用率。
上图所示的图中f(x)是一种近似逼近最后开始时间点曲线的方法。y轴是距离EOF的字节时间,x轴是发送事务的最大包长。对于最大包长1的包来说,小帧开头就是位于7500的点,80%带宽曲线是小帧中能发送事务数量的80%的时间点,最后开始时间位置是EOF1之前可以启动一个包长为1的事务的时间点。
这个近似曲线的算法通过一些经验值进行了近似。如下
Alorithm CheckTransactionWillFit (MaximumPacketSize, HC_BytesLeftInFrame)
Begin
Local Temp
= MaximumPacketSize + 192
Local rvalue = TRUE
If MaximumPacketSize >= 128 then
Temp += 128
End If
If Temp > HC_BytesLeftInFrame then
Rvalue = FALSE
End If
Return rvalue
End
这个算法有两个输入,当前最大的包长度和硬件的当前小帧还剩余可传输字节数的计数器。它无条件的加192,用来估计事务的overhead和bit stuffing. 在包长大于128时,加上一个128来估计大包长带来的附加bit stuffing. 用这种方法可以更好的逼近最后开始时间曲线。
设备状态
address state:
usb device收到set confiugration request
If the specified configuration value is zero, then the device remains in the Address state. If the specified configuration value matches the configuration value from a configuration descriptor, then that configuration is selected and the device enters the Configured state. Otherwise, the device responds with a Request Error.
configured state:
usb device收到set configuration request
If the specified configuration value is zero, then the device enters the Address state. If the specified configuration value matches the configuration value from a
configuration descriptor, then that configuration is selected and the device remains in the Configured state. Otherwise, the device responds with a Request Error.
当USB设备连接或者从USB总线上移除时,主机使用被称为总线枚举的过程来识别和管理USB设备的状态变化。当USB设备链接到USB供电端口时,将会进行下面的动作:
当USB 设备被移除时,hub向host发出通知。移除设备时会disable掉指定的port,主机获取通知后会更新它的本地拓扑信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。