数据传输方法以及使用该方法的通用串行总线主机控制器 【技术领域】
本发明涉及一种数据传输方法以及使用该方法的通用串行总线(USB)主机控制器。具体而言,本发明涉及一种在USB设备和主机之间执行数据传输的方法和执行该方法的USB主机控制器。
背景技术
在现有的USB3.0的技术规范中,主机通过主机控制器与USB设备进行交互。为了支持USB 3.0的双总线构架,主机控制器必须包括超速(SuperSpeed)和USB2.0元件,这能够同时在每个总线上管理主机与USB设备之间的控制、状态以及信息交换。该主机控制器包括SuperSpeed和USB2.0的多个下游端口,通过这些下游端口,主机能够检测USB设备的连接和移除,管理主机和USB设备之间的控制流动,管理主机和USB设备之间的数据流动,收集状态和活动统计,以及向所连接的USB设备提供电力。基于超速元件,USB 3.0可提供十倍于USB 2.0的传输速度和更高的节能效率,因而广泛用于计算机外围设备和消费电子产品。
为支持USB 3.0协议,Intel其后推出了扩展主控制器界面(ExtensibleHost Controller Interface,简称xHCI)协议,xHCI协议主要描述了系统软件与硬件之间接口所用的寄存器和数据结构,为USB 3.0主控制器与USB 3.0外设驱动程序之间提供标准通信方式。根据xHCI协议和USB3.0协议,USB主机控制器可以启动或停止数据传输,例如USB主机控制器在其用完(runout of)用于该数据传输的缓冲器空间的情况下会停止该数据传输,而当USB主机控制器通知该USB设备这种状态时,该USB设备会切换到另一个数据传输或者等待并在该USB主机控制器分配出缓冲器空间时继续同一数据传输。
在上行周期(Upstream Cycle)/输入事务的处理中,现有的USB主机控制器需要在其缓冲器内接收到来自USB设备的足够多的输入数据(IN data)之后,才能利用所有这些输入数据来计算CRC(循环冗余码)结果,并且将计算出的CRC结果与所有参与计算CRC结果的输入数据组合成一个完整的数据分组(Data Packet)。之后,判断该数据分组是否存在错误(包括检查CRC结果是否有错误以及数据分组是否完整等),如果存在错误,USB主机控制器将不向主机发送此数据分组,并丢弃该数据分组;如果没有错误,则将该数据分组发送给主机的系统存储器。
上述数据传输过程请参考附图1所示的流程图。在步骤ST1中,USB主机控制器接收输入数据,并在步骤ST2中确定本次所接收的输入数据是否为该数据分组的最后一个数据。需要说明的是,一个数据分组包含的数据量是可预设的,例如,可预设每个数据分组包含10字节(Byte)或10双字节(DW)的数据,而输入数据的接收和发送可以以字节或双字(DW)为单位,因此USB主机控制在步骤ST1中接受到输入数据和步骤ST2中判断是否为数据分组的最后一个数据,均可以字节或双字为单位。若在步骤ST2判断得出该输入数据不是数据分组的最后一个数据,则进程返回到步骤ST1继续接收输入数据。如果在步骤ST2判断所接收的输入数据是该数据分组的最后一个数据,则在步骤ST3中计算该数据分组的CRC结果,并将所接收的输入数据组合成数据分组。
由上述可知,现有的USB主机控制器需要在其缓冲器内接收到足够多的来自USB设备的输入数据之后(例如一个数据分组所包含的数据量),才能利用所有这些输入数据来计算CRC结果,因此,在缓冲器接收来自USB设备的输入数据的过程中,USB主机控制器用于传输数据到主机的总线将处于空闲状态,因此造成总线的利用率较低,传输数据的整体速率也明显降低。并且,存放在缓冲器内的数据,由于未能及时传输至主机的系统存储器,一旦当上行周期(Upstream Cycle)/输入事务出现故障或中断,若USB设备继续向USB主机控制器内的缓冲器发送输入数据,则极易导致USB主机控制器内的缓冲器溢出(overrun)。
【发明内容】
本发明的目的在于提供一种途径以便解决上述现有技术中出现的问题。
根据本发明的一个方面,提供了一种用于USB主机控制器的数据传输方法,该方法包括如下步骤:接收一输入数据;计算该输入数据的CRC结果,同时将该输入数据发送至主机地系统存储器;判断该输入数据是否为一数据分组的最后一个输入数据;以及当确定该输入数据为该数据分组的最后一个输入数据时,将计算得出的CRC结果附至该输入数据之后发送。
根据本发明的一个方面,提供了一种USB主机控制器,该USB主机控制器包括:协议转换模块,用于接收一输入数据,并计算CRC结果;传输模块,用于接收来自该协议转换模块的该输入数据,并产生一输入缓冲器请求;缓冲器管理器,用于根据该输入缓冲器请求分配一缓冲器,以暂存该输入数据;以及DMA控制器,用于将缓冲器内的该输入数据发送至主机的系统存储器,其中,该协议转换模块于计算CRC结果的同时,将该输入数据发送至传输模块,并且判断该输入数据是否为一数据分组的最后一个输入数据,以及当确定该输入数据为该数据分组的最后一个输入数据时,将计算得出的CRC结果附至该输入数据之后发送。
【附图说明】
为了对本发明实施例的特征和优点进行详细说明,将参照以下附图。如果可能的话,在附图和描述中使用相同或者类似的参考标号以指代相同或者类似的部分。其中:
图1所示的是现有技术中的执行数据传输的流程图;
图2所示的是根据本发明实施例的模块化示意图;
图3所示的是根据本发明实施例的数据传输的流程图;
图4所示的是根据本发明实施例的数据传输过程中出现错误时的时序图;
图5A所示的是现有技术中的数据传输的时序图;
图5B所示的是根据本发明实施例的数据传输的时序图。
【具体实施方式】
现在将参考本发明的示例性实施例进行详细的描述,在附图中图解说明了所述实施例的示例,其中相同的参考数字始终指示相同的元件。应当理解,本发明并不限于所公开的示例实施例。还应当理解,并非所述方法和设备的每个特征对于实施任一权利要求所要求保护的本发明都是必要的。此外,在整个公开中,当显示或描述处理或方法时,方法的步骤可以以任何顺序或者同时执行,除非从上下文中能清楚一个步骤依赖于先执行的另一步骤。此外,步骤之间可以有显著的时间间隔。
图2所示的是根据本发明实施例的模块化示意图。如图2所示,USB主机控制器20包括协议转换模块21、传输模块22、缓冲器管理器23以及DMA(存储器直接存取)控制器24。协议转换模块21用于接收输入数据(INData),并对输入数据进行解析,同时由其内部的CRC计算模块211计算输入数据的CRC结果,并且将所接收的输入数据及时发送到传输模块22。传输模块22在收到来自协议转换模块21的输入数据后,向缓冲器管理器23发出输入缓冲器请求。缓冲器管理器23包括缓冲器控制器231以及由缓冲器232、233和234构成的缓冲器阵列。缓冲器232-234可以为一种SRAM(静态随机存取存储器)。缓冲器管理器23在收到传输模块22发送的输入缓冲器请求后,由缓冲器控制器231为将要输入的数据分配缓冲器空间,并向传输模块22发出已经分配好缓冲器阵列的输入缓冲器响应。
图3所示的是根据本发明实施例的数据传输的流程图。如图3所示,首先,主机设备在与USB设备(未示出)处于连接状态下,通过USB主机控制器20向USB设备发出输入数据请求(IN Request),USB设备相应于该请求向USB主机控制器20发送输入数据(IN Data),USB主机控制器20的协议转换模块21于步骤ST301接收该输入数据,并对该输入数据进行解析,以及于CRC计算模块211内计算该输入数据的CRC结果。随后数据传输进程进入步骤ST302,协议转换模块21确定所接收到的输入数据是否为一数据分组的最后一个数据。如果确定不是所述数据分组的最后一个输入数据,则返回到步骤ST301继续接收下一个输入数据。
如前所述,由于USB主机控制器在接收来自USB设备的输入数据时是以字节或双字为单位,而每个数据分组通常包括一定的输入数据量,也就是说,协议转换模块21在接收一个数据分组的时,步骤ST301和ST302将会循环多次,在此时间内,USB主机控制器会同时执行步骤ST305,即由协议转换模块21将收到的输入数据发送到传输模块22,由传输模块22向缓冲器管理器23发出输入缓冲器请求。缓冲器管理器23在缓冲器控制器231为将要输入的数据分配好缓冲器空间后,向传输模块22发出输入缓冲器响应。传输模块22基于该响应,将所接收到的输入数据发送到对应的缓冲器中。
另外,在本发明的实施例中,缓冲器控制器231会计算缓冲器阵列中所接收到的数据量,并在所接收到的数据量达到一预设的阈值时,将缓冲器阵列中的数据顺序发送到DMA控制器24。其中所述预设的阈值可以是1、2、3、4...n个数据分组,或者1k、2k、4k、8k比特的数据等。该输入数据通过DMA控制器被发送至系统存储器。
同时如果在步骤ST302确定所接收的输入数据是所述数据分组的最后一个数据,则进入步骤ST303,将所计算的该数据分组的CRC结果附在所述最后一个输入数据之后发送到传输模块22。之后,进入步骤ST304,缓冲器控制器231确定所接收的数据分组是否存在错误。这种错误包括所计算的CRC结果错误以及数据分组不完整的错误等。如果确定数据分组存在错误,则进入步骤ST306,通知缓冲器管理器23中止与该错误的数据分组相关的数据的发送,并在步骤ST307处通知主机之前所发送的数据分组中的错误状态。另外,如果确定数据分组不存在错误,则不做任何操作或者通知缓冲器管理器23继续发送数据,从而进入步骤ST305。
图4所示的是根据本发明实施例的数据传输过程中出现错误时的时序图。在该时序图中,CLK为时钟脉冲,BFIN REQ为传输模块22发出的输入缓冲器请求脉冲,BFIN_ACK是缓冲器管理器23在分配好缓冲器空间后发出的输入缓冲器响应脉冲,INBF_DATA_REQ表示向缓冲器输入数据的请求脉冲,DATA_RX是接收到的输入数据信号,RXCRC32ERR是缓冲器控制器231所发出的CRC结果存在错误的信号脉冲,以及INBF_DATA_ERRTERM表示数据分组不完整的信号脉冲。
图5A所示的是现有技术中的数据传输的时序图,而图5B所示的是根据本发明实施例的数据传输的时序图。其中,OUTBF_DATA_REQ表示请求发送缓冲器中的数据至DMA控制器的请求信号脉冲,其一定程度上代表了上行数据总线的使用时间。CRC_CHECK是检查和确定CRC结果是否正确的脉冲。通过比较两者OUTBF_DATA_REQ变成高电平的时刻,就可以明显了解,图5B所示的根据本发明实施例的数据传输中,从发送缓冲器中向DMA控制器发送数据的时间远早于现有技术的发送时刻,这也就是说,在数据传输过程中,本发明的上行数据总线在USB主机控制器刚开始接收输入数据不久就处于使用状态,而现有技术中的上行数据总线几乎在整个数据分组传输至USB主机控制器完成时才开始处于使用状态,因此本发明的总线利用率相对于现有技术得到了显著的提升。
而且,由于本发明的USB主机控制器在接收到输入数据不久就开始向系统存储器发送数据,也就是加快了对上行周期/输入事务处理的反应时间,因此,即使数据传输的上行周期暂时出现故障时,USB设备继续发送数据也不易导致缓冲器过载。
尽管参考本发明的优选实施例具体展示和描述了本发明,但是本领域一般技术人员应该明白,在不脱离所附权利要求限定的本发明的精神和范围的情况下,可以对其进行形式和细节上的各种修改。