《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 业界动态 > 基于EHCI协议的USB2.0主机传输调度的设计与实现

基于EHCI协议的USB2.0主机传输调度的设计与实现

2008-07-16
作者:陈星宇,李广军

    摘 要: 为了和通用的嵌入式" title="的嵌入式">的嵌入式处理器协同工作,在 EHCI协议的基础上对传输描述符" title="描述符">描述符和调度策略进行优化会更加有利于实现没有总线控制权的嵌入式USB主机。在简单剖析了EHCI协议的调度思想后给出了软硬件划分结构和实现方法,软硬件协同仿真结果证实了设计的正确性。
    关键词: EHCI  传输描述符  HTD  调度

 

    USB主机控制器" title="主机控制器">主机控制器广泛应用于PC和便携式电子设备中。USB主机控制器是USB总线的核心部分,充当着USB总线管理和数据发动者的角色。为了统一高速数据传输的软\硬件接口,Intel公司制定了增强型主机控制器接口EHCI(Enhanced Host Controller Interface)协议,EHCI协议对USB2.0主机的数据传输调度进行了详细描述,使主机控制单元的开发更具规范性。
    主机控制器的数据传输调度部分与软硬件划分方式紧密相关,本文所述结构是位于所开发的一款与嵌入式MCU通用接口相连、没有总线控制权、面向大容量存储类设备的IP中。因而本文将重点讲述在EHCI协议基础上针对控制和批量传输调度的改进与实现。
1 EHCI协议的调度思想
    EHCI协议规定了3个接口空间:PCI配置空间、HC寄存器空间和调度接口空间。支持两种数据传输类型:异步传输和周期性传输。
    PCI配置空间描述了开发作为PCI设备的USB主机控制器时需要的寄存器。HC寄存器空间由性能寄存器和操作寄存器组成;性能寄存器用于记录主机控制器的性能参数值;操作寄存器包括命令、状态、中断和根集线器端口寄存器,是进行USB控制的最主要接口空间。调度接口空间包括四种传输描述符和对应调度策略。
    周期性数据传输主要包括中断和同步传输,对应描述符为siTD、iTD;异步数据传输包括批量和控制传输,对应描述符为QH、qTD。所有异步传输数据包通过队列头QH链接成一个环形链表" title="链表">链表,一个QH代表一个端点,利用操作寄存器Asynlistaddr进行初始访问,QH下链接多个传输描述符qTD,qTD作为一个传输单元对应一个或多个事务处理,可最大寻址20K数据量。创建的传输链表结构如图1所示。

 


    图1中三个QH分别代表三个不同类型的端点,而qTD编号则代表了传输描述符的调度顺序。整个环形链表在生存期内一直位于系统内存中。

    EHCI协议描述的调度思想为:客户软件用USB请求块(URB)的形式向管道请求数据传输,主机控制器驱动程序(EHCD)负责跟踪URB进程并根据数据量的大小生成一条qTD链,激活qTD并链接在对应端点的QH下,形成图1所示结构。随后,EHCD根据USB协议规定的“帧带宽对于端点均衡分配”原则,按照端点轮流读取的顺序将一个激活的qTD信息映射到QH的工作区中,随之启动硬件操作,EHC(高速主机控制器)读取QH工作区信息开始进行qTD的相关事务处理。处理完毕,回写状态信息到QH工作区,触发特定中断重新将控制权交还给EHCD,EHCD从QH工作区中读取状态信息回写到对应qTD中,结束一次qTD的传输,并激活下一个,以此循环操作。当URB所关联的qTDs全部处理完毕后,更新URB状态信息,通过回调函数带回给应用程序。这部分调度思想主要在驱动程序中实现。
2 传输调度的实现
2.1 调度思想改进

    由于所面向的IP连接在MCU通用IO上,不具有系统总线控制权,不能主动发起对系统内存的数据读写,所以,为了减少硬件对MCU的频繁访问以及软硬件同时访问memroy时的阻塞现象,在不改变QH、qTD结构的基础上增加了一种驱动程序中生成但只供硬件调度的传输描述符结构——HTD(Hardware Transfer Descriptor),如图2所示。HTD由qTD演变而来,两者之间一一对应,它用 5个双字描述了一次传输的所有信息。此外,IP内开辟一块独立的存储区,存储等待硬件处理的HTD链。硬件只需按顺序读取HTD并将状态回写即可。这块存储区可供软硬件直接访问,所以称为“共享内存”区。驱动程序从所有激活的qTD中选择1~32个生成HTD,并按处理顺序存入共享内存,如图1所示。

 


2.2 传输调度的硬件实现-HTD处理模块
    上述改进部分主要由IP中HTD处理模块" title="处理模块">处理模块(HPU加深区域)实现。图3为IP实现结构图,从中可见HPU主要与MCU接口单元(MCUI)、全局控制逻辑(GCU)、共享内存(MEM)、存储器控制单元(MC)以及串行接口引擎模块(SIE)交互。

 


    HPU与MCUI:MCUI传送软件对HTD控制寄存器的读写信息。
    HPU与GCU:全局控制逻辑发送事务处理使能信号,帧开始指示信号给HPU,HPU在完成一次事务处理后输出结束信号给GCU。
    HPU与MC、MEM:HPU发送读写HTD的使能及地址信息给MC,MC单元在确定没有访问冲突的情况下连接MEM和HPU,进行两者之间的HTD值传送。
    HPU与SIE:HPU输出一次事务处理的信息给SIE,SIE根据处理类型(OUT/IN/SETUP)的不同将事务处理分解成令牌包、数据包和握手包形式经根集线器传送出去,或是SIE接收到设备上传的数据进行错误检测后将结果告知HPU。
    HTD处理模块内部采用状态机机制实现,共5个主要状态,如图4所示。表1是HTD控制寄存器。

 

 


    (1)idle状态:系统复位和异步传输停止时的默认状态,不执行硬件操作。
    (2)取HTD:根据上一个HTD的nextHTDp场指示从MEM中取出对应的HTD,每个DW用一个32位内部寄存器表示。
    (3)有效性分析:包括4个方面的内容。
    ①检查HTD有效性(Active(A)=1Valid(V)=1);
    ②将HTD序号和htddonemap/htdskipmap寄存器比对,确保不进行重复处理;
    ③查看EPnum对应端点是否已经由以前的事务处理导致禁用;
    ④计算剩余帧时是否足够。
    上述检测均通过后,可以跳转到事务处理执行状态。如果无效,则根据无效的种类跳转到其他状态。
    (4)执行事务处理:将通过有效性检查的HTD信息传送给SIE进入包级传输。
    (5)回写HTD:分析SIE返回的处理信息。包括两种情况。
    ①如果设备返回ACK握手包或是正确数据,则表明事务处理正确完成,查看park模式计数器(EHCI协议规定:1帧中可以允许几次对同一端点的事务处理操作,park计数初始值体现在mult场中),如果为非0值,则更新nrBytestransferrd(已传输数据量)的值,进行当前HTD的下一个事务处理;如果为0,则回写读取下一个HTD。
    ②如果事务处理传输出错,则根据错误类型做相应处理:
    a.CRC错,超时,toggle错,PID损坏,utmi错:事务处理重传;
    b.stall握手,babble检测:禁用管道;
    c.nak握手:out事务处理转为ping事务处理,in事务处理直接重传。
    当一个HTD所关联的事务处理均被执行完毕后,置位htddonemap寄存器对应bit位,并查看irq_andmask和irq_ormask值判断是否触发中断。一旦中断产生,则当前HTD的传输调度过程就又进入了驱动程序处理中。
2.3 传输调度的驱动实现
   Linux操作系统将USB驱动程序分为客户端驱动、USB核心、EHCD、HAL(Hardware Access Layer)四个层次。其中QH-qTD-HTD链表形成的相关函数按执行顺序列出,如表2所示(高版本Linux内核中已集成EHCI驱动部分的实现代码,故不详述)。

 


3 仿真及综合结果
    本IP使用Verilog硬件描述语言,仿真环境为modelsim,综合环境为synopsys DC,在RTL描述后进行行为级功能仿真,随后综合出门级网表并进行门级后仿真。图5即是HTD处理模块的一次数据正确发送并回写的时序仿真波形。

 


参考文献
[1] Compaq,Intel,Microsoft,Philips.Universal Serial Bus Specification,Revison2.0.2000.
[2] Intel.Enhanced Host Controller Interface Specification for Universal Serial Bus,Version 1.0.2002.
[3] 周立功.USB2.0与OTG规范及开发指南.北京:北京航空航天大学出版社,2004.

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。