OpenHCI通过两级仲裁在端点中选择哪一个服务。第一级是表级。每一个需要服务的端点类型在相应的类型表里。HC选择服务哪一个表。而在表内,端点都有差不多公平的机会被访问到。HCD通知设置HcPeriodicStart限制从帧开始到开始要服务周期表的时间。周期表服务时,当前帧下,中断表优先于同步表。当周期表服务完,控制和批量有可能会接着服务。
ED作为锚点,供一列TD依附在其上。当HC访问ED且找到一个有效的TD地址,HC完成与指定ED的单笔事务,TD表明了内存地址。
当一个TD所定义的所有数据都传输完,TD从他的ED上解下,且连到完成队列。
ED描述符
FA就是设备地址
EN就是端点地址
D为方向
S为速度
K为skip表明HC服务时,是否要跳过当前ED
F为格式(F=1为的话,使用的是ITD)
MPS最大包数据尺寸
H就是halted位,一般TD错误会设置该位
C就是toggleCarry位,一个TD退休,向该位写上一个数据的data toggle value
HeadP指向第一个要处理的TD
NextED若非0,表明表上下一个ED
HC处理一个ED,先检查skip和halted位决定ED的下一步任何操作是否允许。若任何一位设置,HC继续访问该表上下一个ED。如果任何一个都没设置,HC就会比较HeadP和TailP,若不等,那么由HeadP指向的TD定义了一个buffer,HC会与该buffer通信。
HCD把TD加到现有TD的尾部。当TD处理完成,HC从ED上解下TD且连在完成队列上。当TD从ED上断开,TD的NextTD拷贝到ED的HeadP上。
当HCD想HC跳过ED的处理,HCD可以设置skip和清除skip。当HCD必须修改HeadP的值,但是从表上移除ED的开销是不允许的,这个操作是必要的。
当HC处理TD时遇到了一个错误,HC设置halted位。当遇到错误的TD退休时,HC更新HeadP且设置了Halted位,导致HC跳过ED直到Halted位清除。当已经纠正一个错误且传输应该恢复时,HCD清除Halted位。HCD不应该写HeadP,toggleCarry,Halted位,除非Halted位已设置,skip位已设置,或ED已从该表移除。
若HCD需要修改一个TD队列而不是在队列里添加TD,它必须停止HC处理那个ED的TD队列,此时才可以改变。HCD停止TD处理的标准方法是从表上删除ED或者在ED上设置skip位。
TD有2种,通用的用于中断、控制、批量;同步的用于同步传输。
GTD描述符
R bufferrounding位,若为0,来自于ED的最后一个数据包必须准确的填满剩余的内存空间。若为1,最后一个数据可以比剩余的buffer小且不引起一个TD上的错误。
DP 若ED中的D域设置为00b或11b表明TD决定令牌的PID。00SETUP;01OUT;10IN。
DI 如果一个TD完成,HC可能要等待DI帧才产生中断。若为111b,该TD退休不产生中断。
T 数据域PID。每一次一个数据包成功传输,该域会改变。MSb=0,data toggle值从ED中的toggleCarry位获得。若MSb=1,data toggle值从该域的LSb获得。
EC 错误计数。每一次传输类型错误,该值增加。
CC 该域包含最后一次尝试的事务的状态。
CBP 与端点通信的数据的内存物理地址。0表明0长度数据包或所有传输完毕。
NextTD 下一个TD
BE 该TD所表明的buffer的最后一个字节的物理地址
CBF所指的buffer为0到8192字节长度,可以跨越2个物理页。若正常传输一个数据包,CBF会更新。若在传输期间,CBF跨越了4k页的边界,BufferEnd的高20位就会拷贝到CBF的高20位,会导致下一个buffer地址指向同一4k页的第0th字节(该4K页是包含最后一个数据的页)。
对于SETUP或者OUT,数据包大小为min(MPS,buffer中的剩余空间)。对于IN,数据包的大小由端点决定。
CC域在每一次事务传输后会更新,不论是否成功。若成功,CC为NOERROR,不然会为错误类型代码。
数据传输顺序。数据传输会交替传输DATA0,DATA1。顺序要求数据传输器继续发相同的数据包要以相同的数据PID,除非数据包成功被接到或者发送。成功是说,发送一个数据包后,发送器收到ACK握手包。第一个数据包以DATA0传输。每一次成功传输后,data toggle值会切换。
对于批量和中断端点,大多数的GTDs以dataToggle=00b加入队列。ED中包含每次传输中的第一个data toggle值。第一个数据包成功传输后,data toggle域的MSb设置表明,对于剩下的传输,data toggle的LSb表明下一个toggle value。当GTD退休,ED中的HeadP更新,ED中的toggleCarry位写入值用来指明该端点下一个数据包传输使用的data toggle。
对于控制传输,序列不依赖于上一个包的data toggle历史。SETUP DATA STATUS包的dataToggle域为10 11 11。
一个GTD的data toggle域在每一次成功的包事务后会更新。只要有ACK,必然会更新,即便其它的错误会遇到。
传输完成。当 传输完由BE指向的最后一字节后,表明成功。成功后,设置CBP=0,设置CC=NOEEROR,且退休。
传输也可以完成。当从一个端点上接受的最后一个数据包没填满buffer且小于MPS。在这种情况,CBP更新为写到内存的最后一个字节后的一个位置。若bufferrounding=1,该情况正常。若bufferrounding=0,该情况错误,HC设置CC=DATAUNDERRUN,设置Halted位,且TD也退休了。
传输错误。传输错误、序列错误、系统错误。
传输错误:CRC错误、BITSTUFFING错误、DEVICENOTRESPONDING错误。只要错了3次,就会退休了且ED会halted。IN数据的数据切换位不匹配也是该种错误。该错误是由于端点接受ACK失败,或设备坏了。该数据会丢弃。PID检查域错误也是该种。
序列错误:
Sequenceerror仅在读端点数据到HC时发生。Sequence错误直到数据接收且未发生transmission error才被检查。
两种该错误:数据overrun和数据underrun。
任何一种发生了,ConditionCode自动被设置,通用TD退休且端点halted。
一个data overrun错误当从一个ED接收到的数据大小超过了MPZ或者超过了TD buffer剩余空间大小会发生。假如发生overrun错误,HC将接收到的数据写到内存直到overrun产生为止。当TD退休,CurrentBufferPointer指向错误数据包的起始。然而,所有接收的数据是有效的且data toggle会更新。
第二种类型,data underrun,当从来自ED的接收数据少于规定的大小的时候会发生。虽然当从ED接收到的数据少于MPZ时候,通用TD退休,但是它不总是产生一个错误。如果接收到的数据填满了buffer,即一个数据包的最后一个字节写到了BufferEnd,不管数据包的大小是多少,它都被当做正常完成的情况。
如果该数据包没有填满buffer且小于MPZ,那么bufferRounding位决定通用TD以何种方式退休。如果bufferRounding= 0,那么underrun被当做一种错误发生了。ConditionCode被设为DATAUNDERRUN,TD退休,ED halted。如果bufferRounding = 1,那么TD正常退休,没错误产生。这里CurrentBufferPointer都指向实际写到内存的最后一个字节的后一个位置。
与该种情况的buffer-filled完成不一样,buffer-filled完成是完全正常的情况,CurrentBufferPointer=0。
系统错误:
对于通用TDs,系统错误是有限的。尤其是,一个ohci的HC对于通用TD来说,不可能发生它内部缓冲的overrun和underrun错误。一个OHCI的HC不允许发IN令牌给一个ED除非HC内部有足够的缓冲空间接收一个MPZ大小的数据而不需要访问系统内存。类似的,HC不允许发起OUT or SETUP令牌包,除非它已经在内部缓冲里预先取得所有发往ED的数据。
特殊处理
NAK当ED返回一个NAK握手,所有通用TD域在当前事务后保持不变。HC不做任何改变。
STALL如果ED返回STALL PID,HC退休TD,设置ConditonCode= STALL且haltsED。CurrentBufferPointer,ErrorCount, and dataToggle保持事务开始时的数值。
上一篇:基于OHCI协议的S3C2440 USB Host Driver之协议介绍(四)
下一篇:基于OHCI协议的S3C2440 USB Host Driver之协议介绍(二)
推荐阅读最新更新时间:2024-11-10 19:52
设计资源 培训 开发板 精华推荐
- 使用 ON Semiconductor 的 LV5609V 的参考设计
- SY88982L EV、SY88982L 评估板专为 SY88982L 激光驱动器的快速电气评估而设计
- 【训练营】【实战训练营】万能遥控器 699520A
- 喷墨打印机电平转换器
- OM13500A: PCA8537和PCF8537评估板
- 使用 Analog Devices 的 LTC2908CTS8-C1 的参考设计
- DRM161,具有用于 S12ZVH 系列设备的 LCD 接口的汽车 HVAC 控制系统
- 使用 Omron 的 S8VS-48024B 的参考设计
- LT1317CS8 PWM DC/DC 转换器的典型应用电路
- AM6TW-4818SH35Z 18V 6瓦双输出DC-DC转换器的典型应用