桥控制器、桥和操作该桥的方法转让专利

申请号 : CN200410057954.2

文献号 : CN1595381B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 布赖恩·T·邓丁辉·R·倪约瑟夫·M·艾利克森

申请人 : 得州仪器公司

摘要 :

一种桥控制器控制USB总线与诸如ATA硬盘驱动器或ATAPI CD或DVD驱动器之类的ATA/ATAPI驱动器之间的数据流。桥控制器具有状态机,该状态机在数据包正在传输到桥控制器的过程中在后台模式下实时地接收CBW。状态机使用CBW设置数据传输。桥控制器还具有可编程处理器,一旦在缓冲存储器中接收到CBW,该可编程处理器就连接到CBW。可编程处理器在必要时对接收设备的设置进行更改,并启动数据传输。

权利要求 :

1.一种用于在数据存储设备和数据利用设备之间传输数据的桥控制器,该桥控制器接收用于控制数据传输的命令信息数据包,包括:状态机,在向桥控制器传输命令信息数据包的过程中,该状态机在后台模式下实时地接收命令信息数据包,状态机利用命令信息数据包的信息来设置用于进行数据传输的接收设备;以及可编程处理器,在接收到命令信息数据包之后,该可编程处理器连接到命令信息数据包,可编程处理器在必要时对用于进行传输的接收设备的设置进行更改,然后启动数据传输。

2.根据权利要求1所述的桥控制器,其中,命令信息数据包是从数据利用设备串行地接收的。

3.根据权利要求1所述的桥控制器,其中,命令信息数据包存储在桥控制器中的缓冲存储器中。

4.根据权利要求3所述的桥控制器,其中,随着命令信息数据包被存储在缓冲存储器中,命令信息数据包的信息由状态机实时地进行处理。

5.根据权利要求4所述的桥控制器,其中,缓冲存储器是先进先出(FIFO)缓冲存储器。

6.根据权利要求4所述的桥控制器,其中,一旦缓冲存储器已满,处理器就中断。

7.根据权利要求1所述的桥控制器,其中,数据利 用设备是计算机,而数据存储设备是ATA或ATAPI设备。

8.根据权利要求7所述的桥控制器,其中,桥和计算机之间的链接是通用串行总线(USB)链接。

9.根据权利要求7所述的桥控制器,其中,数据存储设备是从包括ATA硬盘驱动器、ATAPI CD驱动器或ATAPI DVD驱动器、小型闪卡或MO驱动器的组中选择的设备。

10.根据权利要求1所述的桥控制器,其中,状态机是以ASIC 制成的。

11.一种USB到ATA或ATAPI桥,包括:

物理层,它从USB总线接收串行命令数据,并将串行命令数据转换为并行格式;

传输控制器,它接收并行数据,并将并行数据传输到缓冲存储器;

状态机,它在后台模式下实时地对流过传输控制器的并行数据进行操作,以对ATA或ATAPI设备进行设置,从而进行数据传输;以及可编程处理器,连接到缓冲存储器,并在所有命令信息都接收到之后被中断,以对所需要的ATA或ATAPI设备的任何设置数据分别进行更改,然后启动数据传输。

12.根据权利要求11所述的桥,其中,串行数据位于USB 2.0总线上。

13.根据权利要求12所述的桥,其中,串行数据来自于计算机中的USB主机。

14.根据权利要求11所述的桥,其中,命令数据是命令块包装(CBW)的形式。

15.根据权利要求11所述的桥,其中,ATA设备是ATA硬盘驱动器,ATAPI设备是ATAPI CD驱动器或ATAPI DVD驱动器。

16.根据权利要求11所述的桥,进一步包括接收命令数据的桥中的多个任务寄存器,所述寄存器包含ATA或ATAPI设备设置数据传输所需要的数据。

17.根据权利要求16所述的桥,其中,处理器将多个寄存器中的数据传输到ATA或ATAPI设备以准备进行数据传输。

18.根据权利要求11所述的桥,其中,状态机是以ASIC制成的。

19.一种操作USB到ATA或ATAPI桥的方法,包括:将命令数据从数据利用设备借助USB总线通过数据传输设备 传输到缓冲存储器;

使用流过数据传输设备的数据,在后台模式下实时地对状态机进行操作,以提取设置数据,并存储所述设置数据以设置数据传输;

利用缓冲存储器中存储的数据操作可编程处理器,分别改变所需要的ATA或ATAPI设备的与命令相关的数据;以及启动数据传输。

20.根据权利要求19所述的方法,其中,命令数据是针对USB2.0大容量存储类协议的命令块包装(CBW),在数据传输开始之前,设置数据被传输到桥中的多个寄存器,然后传输到ATA或ATAPI设备。 

说明书 :

技术领域

本申请涉及桥控制器,具体来说,涉及USB 2.0 ATA/ATAPI存储设备的桥控制器。 

背景技术

通用串行总线(USB)2.0标准支持每秒1.5、12和480兆位的数据传输速率。数据可以通过最多5m长的电缆进行传输,最多可以支持127台设备。需要USB 2.0主机控制器来对总线和数据传输进行控制。图1显示了计算机系统中的USB大容量存储桥控制器的电路连接。计算机102在其内部具有USB主机控制器。主机控制器控制沿着USB总线104到USB大容量存储桥控制器106的传输。USB大容量存储桥控制器106通过ATA/ATAPI总线108连接到ATA/ATAPI大容量存储驱动器110。这可以是ATA硬盘驱动器或ATAPI CD或DVD驱动器。USB主机控制器沿着USB总线发送命令块包装(CBW)数据包,如方框112所示。此信号被USB大容量存储桥控制器106用来对驱动器110进行编程,以接收或发送数据。如方框112所示,然后,在计算机和大容量存储驱动器之间或在大容量存储驱动器和计算机之间进行数据传输。一旦数据传输完成,则将显示驱动器的状态和数据传输状态的命令状态包装(CSW)数据包发回计算机。USB 2.0对于比较大的数据块支持两种类型的传输:批量传输,用于移动不能忍受错误的数据,等时传输,用于移动不能忍受延迟的数据。在仅批量协议中使用的传输命令集基于SCSI透明命令集,该命令集用与仅批量协议相关的某些信息包装,以针对特定的传输形成命令块包装(CBW)。 
CBW包含31个字节的必须处理的数据。将对某些字节进行检 查,以核查真实性,而另外一些字节被用来对将与其进行数据传输的设备进行编程。表1显示了命令块包装(CBW)的布局。第一个字段包含对应于将数据包识别为CBW的dCBWSignature的4个字节的数据。下一字段是主机发送的命令块标记。当驱动器返回状态数据包(CSW)时,此字段的内容被反馈到主机。包含字节8-11的第三个字段是数据传输长度,并包含在命令执行过程中主机希望在批量进或批量出传输时传输的数据的字节数。如果此字段为零,则驱动器和主机不传输任何数据,设备将忽略方向位的值。下一字段包括字节12,该字节包含控制数据传输方向的CBW标志。下一字段包含单字节,该单字节中的头4位预留,后4位包含与其进行传输的设备的逻辑单元号。下一字段包含预留的3个位,和五个位,用于表示命令块长度。最后一个字段包含字节15-30,包含命令块,这是要由驱动器执行的命令。 
通常,CBW的处理是通过使用硬件状态机或通过使用软件控制的微控制器(MCU)来实现的。硬件状态机比软件控制的微控制器快得多,通常可以在几微秒内执行完此任务。基于硬件状态机的设备的缺点是,它不适合于可能没有正确地遵循标准的ATA/ATAPI设备。制造商可能在他们的设备中选择使用预留的寄存器来提供其他功能。这是比较常见的情况。这意味着,现有的基于硬件状态机的控制器无法与非标准的设备一起使用,因为它无法处理非标准的情况。一旦硬件控制器以硅制造,则不可能改变状态机的操作。然而,软件控制的微控制器却可以轻松地改变,因为软件程序通常存储在电可重编程非易失性存储器中,如快闪存储器或EEPROM,以提供所需要的灵活性,以处理以后生产的非标准设备。然而,软件解决方案比硬件解决方案慢得多,通常需要花500-700微秒才能执行完任务。 
表1-命令块包装 

USB 2.0总线是向计算机添加更多存储容量的一种方便的方式,特别是膝上型计算机,USB 2.0连接的硬盘驱动器随时都可用。利用标准的基准软件对这样的设备进行的测试表明,它们比内置的硬盘驱动器慢。基于软件的控制器进行数据传输所需要的500-700微秒的时间是相同的,不管所传输的文件的大小如何。如此,似乎,此时间对USB 2.0连接的硬盘驱动器的性能造成严重的影响。因此,需要一种具有硬件状态机的速度和软件控制的微控制器的灵活性,并可以以比当前可用的设备更高的速度执行操作的USB 2.0控制器。 

发明内容

本发明的一般目的是提供高速度、高灵活性的桥控制器。 
根据本发明的一个方面,用于在数据存储设备和数据利用设备之 间传输数据的桥控制器提供了本发明的此目的和其他目的和特征,该桥控制器接收用于控制数据传输的命令信息数据包。在向桥控制器传输数据包的过程中,状态机在后台模式下实时地接收命令信息,状态机利用命令信息来设置用于进行数据传输的接收设备。在接收到命令信息数据包之后,可编程处理器连接到命令信息数据包,处理器在必要时对用于进行传输的接收设备的设置进行更改,然后启动数据传输。 
优选地,命令信息数据包是从数据利用设备串行地接收的。 
优选地,命令信息数据包存储在桥控制器中的缓冲存储器中。 
优选地,随着命令信息数据包被存储在缓冲存储器中,命令信息数据包的信息由状态机实时地进行处理。 
优选地,缓冲存储器是先进先出(FIFO)缓冲存储器。 
优选地,一旦缓冲存储器已满,处理器就中断。 
优选地,数据使用设备是计算机,而数据存储设备是ATA或ATAPI设备。 
优选地,桥和计算机之间的链接是通用串行总线(USB)链接。 
优选地,数据存储设备是从包括ATA硬盘驱动器、ATAPI CD驱动器或ATAPI DVD驱动器、小型闪卡或MO驱动器的组中选择的设备。 
优选地,状态机是以ASIC制成的。 
本发明的另一个方面包括USB到ATA/ATAPI桥。物理层从USB总线接收串行命令数据,并将数据转换为并行格式。传输控制器接收并行数据,并将数据传输到缓冲存储器。对流过传输控制器的并行数据在后台模式下进行操作的状态机实时对ATA或ATAPI设备进行设置,以便进行数据传输。可编程处理器连接到缓冲存储器,并在所有命令信息都接收到之后中断,以对所需要的ATA或ATAPI设备的任何设置数据分别进行更改,然后启动数据传输。 
优选地,串行数据位于USB 2.0总线上。 
优选地,串行数据来自于计算机中的USB主机。 
优选地,命令数据是命令块包装(CBW)的形式。 
优选地,ATA设备是ATA硬盘驱动器,而ATAPI设备是ATAPI CD驱动器或ATAPI DVD驱动器。 
优选地,所述的桥进一步包括接收命令数据的桥中的多个任务寄存器,所述寄存器包含ATA或ATAPI设备设置数据传输所需要的数据。 
优选地,处理器将多个寄存器中的数据传输到ATA或ATAPI设备以准备进行数据传输。 
优选地,状态机是以ASIC制成的。 
本发明的第三个方面包括操作USB到ATA或ATAPI桥的方法。命令数据从数据利用设备通过USB总线传输到数据传输设备,再传输到缓冲存储器。使用流过数据传输设备的数据,在后台模式下对状态机实时地进行操作,以提取设置数据,并将数据存储所需的与命令相关的寄存器中,以设置数据传输。可编程处理器利用缓冲存储器中存储的数据,分别改变所需要的ATA或ATAPI设备的与命令相关的数据。然后,启动数据传输。 
优选地,命令数据是针对USB 2.0大容量存储类协议的命令块包装(CBW),在数据传输开始之前,设置数据被传输到桥中的多个寄存器,然后传输到ATA或ATAPI设备。 

附图说明

图1是显示了USB总线上的数据流的USB连接的大容量存储驱动器的方框图; 
图2是根据本发明的USB大容量存储桥控制器的方框图; 
图3A和图3B是用于检测命令块包装(CBW)的状态机的状态图; 
图4是图3的状态机的参数选择逻辑电路的一部分的电路图; 
图5A和图5B是图3A和3B所表示的状态机的参数选择逻辑电路的其余部分的电路图;以及 
图6和7是软件控制的微控制器的计算机程序的状态机图表。 

具体实施方式

图2是显示USB 2.0中的数据流的方框图。ATA/ATAPI桥一般被显示为200。图1的USB总线104被显示为204,ATA/ATAPI总线108被显示为208。USB总线204上的串行数据进入USB 2.0 UTM 214。UTM是符合UTMI的PHY,它从外部上游USB主机控制器(如主计算机102中的控制器)以高速度或全速模式接收串行数据。方框214中的PHY对串行数据流进行处理,并基于USB 2.0规范和UTMI规范中的协议将其转换为8位宽的并行数据总线信号。8位宽的数据通过总线216被传递到USB事务处理器218,该USB事务处理器利用USB数据包协议对数据进行处理,并通过总线220将数据传递到USB缓冲区管理器222。对于CBW数据包,USB缓冲区管理器执行地址解码,并将数据包传递到CBW FIFO 232中的编址的缓冲区位置。USB缓冲区管理器还生成适当的中断以将新数据包到达的信息通知给微控制器。CBW FIFO232通过总线234连接到USB缓冲区管理器222,并通过总线238连接到ATA/ATAPI数据缓冲器控制器230。总线234和238是32位宽,并传输所谓的“quadlet”。 
ATA/ATAPI数据缓冲区控制器230具有硬件状态机和微控制器以提供在控制时缓冲区控制器所需要的速度和灵活性。下面结合图3-7详细描述方框230。数据缓冲区控制器230通过16位宽的总线208将数据传输到目标ATA/ATAPI驱动器,其中,利用数据来设置设备210中的寄存器,以便对将发生的数据传输进行编程。一旦进行了数据传输,目标设备210就将通知桥控制器,而该桥控制器又将CSW状态发回到主计算机102。 
图3是状态机的状态图,该状态机用于检测命令块包装(CBW)数据包信息并提取ATA/ATAPI控制器所需要的参数,或向ATA/ATAPI设备发出请求的命令。当CBW FIFO 232正在被用数 据填充时,即,当数据正在向缓冲区传输时,状态机接收数据。这就大大地提高了对命令数据进行处理的速度。在随后的图形中,对数据的这种“运行时”处理被称为“嗅探”命令。在图形中,状态机的状态用判断方框左边的文字作标记,而判断方框本身带有编号。某些状态包含一个以上的判断方框。 
状态机中的第一个状态是标记为“CBW_IDLE”的空闲状态。此状态是等待发往此节点的输出数据数据包的空闲状态,当数据传输到桥控制器时,将实时获取数据。如果此数据获取模式被方框301中的标记为“嗅探”CBW启用的信号启用,则状态机接收第一个数据包,并在方框302中检查第一个数据quadlet,以查看它是否匹配dCBWSignature。在此示例中,签名将是“0x43425355”,这是ASCII代码“CBSU”,表示USB大容量存储类命令。如果此第一个数据quadlet匹配签名,则机器进入状态“WAIT_TAG”。如果数据不匹配签名,则状态机将忽略此位数据包,并进入状态“WAIT_EOT”,以在方框354中等待事务的结束。 
如果第一个quadlet匹配签名,则机器传递到状态304,等待CBW的第二个数据quadlet。第二个数据quadlet包含dCSWTag,这是命令块标记。这是目标驱动器将在关联的CSW的dCSWTag字段中反馈到主机的代码。状态机忽略此标记,这不与ATA/ATAPI命令参数相关,控制进入方框306。控制器存储目标驱动器的所有USB数据,以便它可以被用来在状态过程中向主机发送dCBWTag。 
方框306是机器的WAIT_XFER_CNT状态。在此状态下,机器等待接收到第三个数据quadlet,该数据quadlet包含dCBWDataTransferLength,这是传输字节统计。当接收到此信号时,信号“snoop_xfer_byte_cnt_en”被设置为“1”,以便ATA/ATAPI控制器可以将数据总线usb_rcv_data(31:0)上存在的第三quadlet数据加载到snoop_xfer_byte_cnt(31:0),(参见图4),这将被用作ATA/ATAPI传输字节统计。这将加载CBW的字节8-11,参见表1。在接收到到第三个数据quadlet之后,机器进入方框310上的 WAIT_FLAG状态。 
WAIT_FLAG状态310等待接收第四个quadlet。当接收到第四个quadlet时,控制进入方框312,检查设备是否为ATAPI设备,如果是,将控制传递到方框314。判断目标设备是ATA还是ATAPI设备的操作是在系统初始化时由固件设置的。在方框314中,snoop_cbw_flag_en被设置为等于1,snoop_task_file0_en被设置为等于1。触发器444在其数据输入端接收信号usb_rcv_data(7:0),参见下面描述的图4,在低态有效启用输入端ENZ施加信号snoop_cbw_flag_en。这将导致信号snoop_cbw_flag(7:0)在触发器的Q输出端输出。位7包含CBW的bmCBW标志的方向,用于设置ATA/ATAPI数据传输方向。第四个quadlet上的usb_rcv_data(31:24)包含CBWCB字节0,该CBWCB字节0将加载到task_file0,参见图5,task_file0将写入到发送到ATAPI设备的命令数据包中的第一个字节。然后,控制进入方框318,这是状态ATAPI_Q5。 
如果在判断方框312中的WAIT_FLAG状态,判断设备不是ATAPI设备而是ATA设备,那么,控制进入方框316中,在该方框中,snoop_cbw_flag_en被设置为等于1,snoop_taskfile7_en被设置为等于1。第四个数据quadlet的usb_rcv_data(7)中包含的信息包含CBW的bmCBW标志的方向,用于设置ATA/ATAPI数据传输方向。第四个quadlet的usb_rcv_data(31:24)中存储的数据包含CBW的操作码。ATA设备的操作码需要转换为这样的设备能够理解的命令。这仅适用于ATA设备。操作码等于28h的命令Read(10)和操作码等于2Ah的Write(10)对于28位LBA地址,分别被转换为具有操作码C8h的ATA Read DMA,和具有命令CAh的Write DMA,或者,对于48位LBA地址,被转换为等于25h的ATA Read DMA Ext,和等于35h的Write DMA Ext。编码的和转换的操作码被加载到task_file_7,task_file_7将此数据(信息)写入到ATA设备命令寄存器。在收到第四个数据quadlet之后,机器进入 状态CHK_OP_CODE。 
ATAPI_Q5状态在方框318处检查是否接收到第五个quadlet。一旦接收到quadlet,控制就进入到方框320,在该方框中,信号snoop_task_file1_en、snoop_task_file2_en、snoop_task_file3_en和snoop_task_file4_en都被设置为等于1。下面将结合图5说明这些信号的使用。第五个quadlet的usb_rcv_data(31:24)中包含的数据将加载到task_file4,第五个quadlet的usb_rcv_data(23:16)中包含的数据将加载到task_file3,第五个quadlet的usb_rcv_data(15:8)中的数据将加载到task_file2,第五个quadlet的usb_rcv_data(7:0)中的数据将加载到task_file1。在收到第五个数据quadlet之后,控制进入ATAPI_Q6状态。 
状态ATAPI_Q6在方框322等候接收第六个数据quadlet。一旦接收到quadlet,控制就进入到方框324,在该方框中,信号snoop_task_file5_en、snoop_taskfile6_en、snoop_task_file7_en_en和snoop_task_file8_en都被设置为等于1。第六个quadlet的usb_rcv_data(31:24)中的数据将加载到task_file8,第六个quadlet的usb_rcv_data(23:16)将加载到task_file7,第六个quadlet的usb_rcv_data(15:8)中的数据将加载到task_file6,第六个quadlet的usb_rcv_dat(7:0)中的数据将加载到task_file5。在接收到第六个数据quadlet之后,机器进入ATAPI_Q7状态。 
在ATAPI_Q7状态,方框326等待接收第七个数据quadlet。当接收到第七个数据quadlet时,控制就进入方框328,在该方框中,信号snoop_task_file9_en、snoop_task_file10_en、snoop_task_file11_en,和snoop_task_file12_en都被设置为等于1。第七个quadlet的usb_rcv_data(31:24)中的数据将加载到task_file12,第七个quadlet的usb_rcv_data(23:16)中的数据将加载到task_file11。第七个quadlet的usb_rcv_data(15:8)中的数据将加载到task_file10和第七个quadlet的usb_rcv_data(7:0)中的数据将加载到task_file9。在接收到第七个quadlet之后,状态机进入 ATAPI_Q8状态。 
在ATAPI_Q8状态,方框330等待接收第八个数据quadlet。当接收到第八个数据quadlet时,控制进入方框332,在该方框中,信号snoop_task_file13_en、snoop_task_file14_en、snoop_task_file15_en被设置为等于1,信号cbw_valid被设置为等于1(如果CBW字节统计等于31)。这将允许第八个quadlet的usb_rcv_data(23:16)加载到task_file15,允许第八个quadlet的usb_rcv_data(15:8)中的数据加载到task_file14。还将允许第八个quadlet的usb_rcv_data(7:0)加载到task_file13。当cbw_valid被设置为1而数据包没有CRC错误,USB数据有效负载处理状态机将生成到微控制器的cbw_valid中断,以便微控制器将初始化ATAPI命令阶段。在接收到第八个数据quadlet之后,状态机进入状态WAIT_EOT。 
现在回到方框334中的CHK_OP_CODE状态,如果第四个quadlet的usb_rcv_data(31:24)中的CBW的操作码不匹配read(10)操作码28h,或write(10)操作码2Ah,则机器进入WAIT_EOT。如果匹配,则状态机进入状态ATA_Q5。 
在状态ATA_Q5,方框336等待接收第五个数据quadlet。如果实现了48位LBA(逻辑块地址),那么信号lba48_en将等于1,表明启用了此功能。在此情况下,信号snoop_task_file_11_en、snoop_task_file_10_en和snoop_task_file_9_en都被设置等于1,以表明启用了此功能。此外,信号snoop_task_file_6_en、snoop_task_file_5_en和snoop_task_file_4_en将都被设置为等于1。如果检测到LBA地址错误,状态机将进入状态WAIT_EOT,否则状态机将进入状态ATA_Q6。 
状态ATA_Q6在方框342等待接收第六个quadlet。一旦接收到此quadlet,控制就进入方框344。在方框344中,如果启用了48位寻址,则信号snoop_task_file_8_en将被设置为等于1,以表明启用了此功能。此外,信号snoop_task_file_3_en、snoop_task_file_2_en、snoop_task_file_1_en和snoop_task_file_0_en将都被设置为等于 1。如果发生扇区统计错误,则状态机将进入WAIT_EOT状态,否则,它将进入状态ATA_Q7。 
在继续处理状态机的操作之前,我们将讨论ATA硬盘驱动器的使用LBA 28位和48位寻址模式。28位寻址模式是对于较小的硬盘驱动器很有用的比较旧的寻址模式。然而,当今的较大的硬盘驱动器需要更多的地址位。这些较新的驱动器使用LBA 48位寻址模式。上文描述的寄存器是1字节宽的寄存器。对于48位LBA寻址,ATA接口利用2字节宽的寄存器。相应地,必须执行两次写入操作才能加载ATA接口的必需的寄存器。这在下面的表2中进行了描述: 
表2 
  ATA寄存器名称    第二次写入    第一次写入    Sector count    Sector count(7:0)      Sector count(15:8)      Sector Number    LBA(7:0)    LBA(31:24)    Cylinder Low    LBA(15:8)    LBA(39:32)=00h    Cylinder High    LBA(23:16)    LBA(47:40)=00h    Device/Head reg.      Snoop_ata_task_file6     
当利用LBA 28位寻址方案时,task_file2包含sector count(7:0),并带有来自第六个quadlet的usb_rcv_data(31:24)的数据。如果来自read(10)或write(10)命令的transfer_length(15:0)大于256或等于0,这就构成了扇区统计错误,状态机将忽略数据包。task_file3包含LBA(7:0),并带有来自第六个quadlet的usb_rcv_data(7:0)的数据。task_file4包含LBA(15:8),并带有来自第五个quadlet的usb_rcv_data(31:24)的数据。task_file5包含LBA(23:16),并带有来自第五个quadlet的usb_rcv_data(23:16)的数据。task_file6包含(″010″& dev_sel & LBA(27:24)),其中,“010”表示LBA地址模式,dev_sel=0选择设备0,而dev_sel=1选择 设备1。LBA(27:24)来自第五个quadlet的usb_rcv_data(11:8)。如果第五个quadlet的usb_rcv_data(15:12)不等于0,这就是LBA地址错误。Read(10)和write(10)将提供32位逻辑块地址,但是较高的4位地址应该是0,因为LBA 28位寻址方案仅使用32位LBA地址的较低的28位。如果较高的4位地址是非0,则这就是LBA地址错误。task_file7包含从read(10)转换的read DMA(C8h)或从write(10)转换的write DMA(CAh)。文件task_file2到task_file7值将被写入到ATA设备,以发送ATA命令。 
在LBA 48位寻址方案中,task_file2包含sector count(7:0),并带有来自第六个quadlet的usb_rcv_data(31:24)的数据。task_file8包含sector count(15:8),并带有来自第六个quadlet的usb_rcv_data(23:16)的数据。sector count(15:0)是要传输的总的扇区统计。ATA状态机将写入到ATA扇区统计寄存器,task_file8值提供sectorcount(15:8)。然后,如前所述,必须进行第二次写入,以提供2字节宽的接口。ATA状态机将再次写入到ATA扇区统计寄存器,task_file2值提供sector count(7:0)。如果来自read(10)或write(10)命令的transfer length(15:0)等于0,这表示sector count(15:0)等于0,这是扇区统计错误,状态机将忽略数据包。 
task_file3包含LBA(7:0),并带有来自第六个quadlet的usb_rcv_data(7:0)的数据。task_file9包含LBA(31:24),并带有来自第五个quadlet的usb_rcv_data(15:8)的数据。ATA状态机将写入到ATA扇区编号寄存器,task_file9值提供LBA(31:24),然后ATA状态机将再次写入到ATA扇区编号寄存器,task_file3值提供LBA(7:0)。task_file4包含LBA(15:8),并带有来自第五个quadlet的usb_rcv_data(31:24)的数据。task_file10包含LBA(39:32),但是来自read(10)和write(10)命令的逻辑块地址将只有32位地址。因此,task_file10具有值00h。ATA状态机将写入到ATAcylinder low寄存器,task_file10中的值提供LBA(39:32),然后ATA状态机将再次写入到ATA cylinder low寄存器,task_file4中 的值提供LBA(15:8)。 
task_file5包含LBA(23:16),并带有来自第五个quadlet的usb_rcv_data(23:16)的数据。task_file11包含LBA(47:32),但是来自read(10)和write(10)命令的逻辑块地址(LBA)只有32位地址,这样task_file11应该具有值00h。ATA状态机将写入到ATAcylinder high寄存器,值task_file11提供LBA(47:40),然后ATA状态机将再次写入到ATA cylinder high寄存器,值task_file5提供LBA(23:16)。task_file6包含(″010″& dev_sel & ″0000″),其中,“010”表示LBA地址模式,dev_sel为0表示选择设备0,而为1表示选择设备1。task_file7包含从read(10)转换的read DMAExt.(25h)或从write(10)转换的write DMA Ext.(35h)。task_file2到task_file7值将写入到ATA设备,以发送ATA命令。 
ATA_Q7状态在方框348中等待第七个quadlet。当接收到第七个quadlet时,状态机进入状态ATA_Q8。 
在状态ATA_Q8中,机器在350中等待接收第八个quadlet。当接收到第八个quadlet时,控制进入方框352。在方框352中,当接收到第八个quadlet时,进行检查,以查看数据包字节统计是否等于31。如果等于31,则cbw_valid信号被设置为等于1。当此信号被设置为等于1而数据包没有CRC错误时,USB数据有效负载处理状态机将生成到微控制器的cbw_valid中断,以便微控制器可以初始化ATA命令阶段。第七和第八个包含预留数据,它们被状态机忽略。在接收到第八个quadlet之后,状态机进入WAIT_EOT状态。WAIT_EOT状态在方框354等待事务结束,当事务结束时,它将状态机返回到CBW_IDLE状态,处理再次开始。 
现在请参看图4,参数选择逻辑一般被显示为400。多路复用器414接收信号″010″& dev_sel & ″0000″,该信号来自task_file6,如上文结合图3所描述的。线路404接收信号″010″& dev_sel &usb_rcv_data(11:8),该信号也来自task_file6,如上文结合图3所描述的。信号lba48_en是选择信号,用于操作多路复用器414,以 判断是选择402上的信号还是选择404上的信号。线路402上的信号用于48位寻址方案,行404上的信号用于28位寻址方案。线路416上的多路复用器的输出是snoop_ATA_task_file6,该信号发送到“设备头”寄存器。op_code translator 410从上文结合图3所描述的task_file7中接收usb_rcv_data(31:24),将该信号转换为线路412上的snoop_ATA_op_code,这是来自CBW的读取或写入代码。 
参数逻辑还包括三个数据触发器424、434和444,每一个触发器都将其时钟输入通过线路430连接到线路442上的时钟信号。触发器424在输入线路418上接收信号usb_rcv_data(31:0),这是要发送的数据的传输长度。在方框308中线路420上的信号snoop_xfer_byte_cnt_en被设置为等于1,以启用要使用的传输长度以生成线426路上的信号snoop_xfer_byte_cnt。触发器434接收信号432,这是usb_rcv_data(31:0)=0,告诉系统传输长度等于0,因此,这是非数据命令。这就为线路436上的信号snoop_non_data_command生成数字1。触发器444接收线路上的信号usb_rcv_data(7:0),并启用线路440上的snoop_cbw_flag_en信号。这允许位标志(第7位)被提取,而其他位是预留的,以在线路448上生成信号snoop_cbw_flag(7:0)。 
图5将多路复用电路一般显示为500,该电路被用来加载执行事务所需的十六个寄存器。多路复用器级a到p中的每一级都包括2位多路复用器502,该多路复用器具有连接到触发器506的D输入的输出。启用输入ENZ(它们是低态有效)中的每一个都通过反相器504馈送。“e”级没有多路复用器502,信号被直接馈送到触发器506e的D输入。所有多路复用器的选择信号连接在一起,并连接到信号atapi_dev,这是ATAPI选择信号,1表示ATAPI,而0表示ATA驱动器。所有触发器506的时钟输入都一起连接到系统时钟(clk)。许多多路复用器输入都彼此连接。a、i和m级的“1 ”输入和k、l、m、n、o和p级的“0”输入连接在一起;b、f和n级的“1” 输入和d级的“0”输入也连接在一起;到c、g、k和o的“1”输入和j级的“0”输入连接在一起;到d、h、l和p级的“1”输入和到f和i级的“0”输入连接在一起。到多路复用器502a的“0”输入连接到“00h”。到502b的“1”输入连接到usb_rcv_data(7:0)。到502c的“1”输入连接到usb_rcv_data(15:8)。到502d的“1”输入连接到usb_rcv_data(23:16)。e级具有直接连接到触发器506e的D输入的信号usb_rcv_data(31:24)。到502g的“0”输入连接到snoop_ata_task_file6。到502h的“0”输入连接到snoop_ata_task_file6。到502k的“0”输入连接到“00h”。所有其他输入都连接到已经描述的其中一个输入。启用输入被标记为″snoop_task_filex_en″,其中,x是0-15,以给16个寄存器task_files 0-15加载所需数据。上文结合图3描述了启用信号的生成和将被提取的数据。 
图6和7显示了用于向ATA或ATAPI设备发送ATA或ATAPI命令的ATA/ATAPI命令状态机。图6将状态机的第一部分一般显示为600,图7将状态机的第二部分一般显示为700。这些图通过连接点A和B彼此连接在一起。ATA/ATAPI命令状态机利用task_file0到task_file15中的信息作为命令参数。如果dev_sel等于0,命令将选择设备0,如果dev_sel等于1,命令将选择设备1。如果信号lba48_en等于1,则使用48位LBA地址来对ATA硬盘驱动器进行编址。然而,48位地址的十六位用0填充,因为CBW命令只包含32位地址。如果信号lba48_en等于0,则使用28位LBA地址来对ATA硬盘驱动器进行编址。如果dma_mode信号等于1,则使用DMA数据传输作为传输阶段。判断是使用Multiword DMA还是使用Ultra DMA是在设备配置过程中确定的。 
在图3所示的状态机检测到有效CBW数据包之后,它将生成信号cbw_valid以中断微控制器。在微控制器接收到cbw_valid中断之后,它将启动ATA/ATAPI命令状态机以向ATA或ATAPI 设备发送命令。如果状态机检测到无效CBW数据包,则不生成cbw_valid中断。在此情况下,当CBW数据包不由针对ATA设备的图3所示的状态机解码时,在启动ATA/ATAPI状态机之前,微控制器将修改task_file0到task_file15信息。 
在图6中一般显示为600的状态机在IDE_IDLE状态601启动,该状态是等待微处理器启动ATA/ATAPI状态机的空闲状态。然后,控制进入标记为WR_TASK_REG的方框602,判断设备是否为ATAPI设备。如果是,则控制进入点A,和图7,如下面所讨论的。如果是ATA设备,控制进入标记为WR_TASK_REG的方框604,在该方框中,task_file6值被写入到设备/头寄存器。如果信号lba48_en等于1,则task_file6信息包含(″010″& dev_sel &″0000″)。“010”中的“1”表示LBA地址模式。如果lba48_en等于0,则task_file6包含(″010″& dev_sel & LBA(27:24))。值LBA(27:24)存储在task_file6寄存器中,usb_rcv_data(11:8)的值来自CBW数据包的第五个quadlet。控制进入方框606,该方框读取状态寄存器,并将控制传递到方框608。方框608判断状态寄存器是否处于忙状态。如果处于忙状态,则控制回到方框606,直到状态寄存器不忙。一旦状态寄存器不忙,控制就进入方框610。在方框610中,task_file1值被写入到功能寄存器。功能寄存器是预留的,不用于ATA设备命令。然后控制进入方框612。在方框612中,检查lba48_en的值,以查看它是否等于1。如果等于1,则控制进入方框614,在该方框中,task_file8值被写入到扇区统计寄存器。task_file8包含48位LBA地址的sector count(15:8)。控制进入方框616。如果在方框612中对lba4_en的值是否等于1的测试失败,则控制直接进入方框616。在方框616中,task_file2中的值被写入到扇区统计寄存器。task_file2包含sector count(7:0)。48位LBA为扇区统计使用16位,28LBA寻址为扇区统计使用8位。 
然后控制进入方框618。在方框618中,对信号lba48_en再次进行测试,以查看它是否等于1。如果是,则控制进入方框620。 在方框620中,值task_file9被写入到扇区编号寄存器。task_file9包含LBA(31:24)。然后控制进入方框622。如果在方框618中测试失败,则控制直接进入方框622。在方框622中,task_file3的值被写入到扇区编号寄存器。task_file3包含LBA(7:0)。然后控制进入方框624。如果值lba48_en等于1,则控制进入方框626。在方框626中,值task_file10被写入到cylinder low寄存器。Task_file10包含LBA(39:32)。由于CBW数据包只提供32位LBA地址,因此,task_file10的值将为0。控制进入方框628。如果在方框624中测试失败,则控制直接进入方框628。在方框628中,task_file4的值被写入到cylinder low寄存器。task_file4包含LBA(15:8)。控制进入方框630。如果lba48_en等于1,则控制进入方框632。在方框632中,值task_file11被写入到cylinder high寄存器。Task_file11包含LBA(47:40)。由于CBW数据包只提供32位LBA地址,因此,task_file11的值将为0。控制进入方框634。如果方框630的测试失败,则控制直接进入方框634。 
在方框634中,task_file5的值被写入到cylinder high寄存器。task_file5包含LBA(23:16)。然后控制进入方框636。在方框636中,task_file7的值被写入到命令寄存器。Task_file7包含ATA设备的命令码。然后控制进入方框638。在方框638中,过程这样来完成:将ATA命令写入到ATA设备,然后返回到空闲状态,以等待下一个命令阶段。 
现在请看图7,命令状态机的第二部分一般显示为700。命令状态机从终端A开始,这是图6所示的状态机转移到判断设备是否为ATAPI设备。如果设备是ATAPI设备,则状态机跳转到状态机的图7显示的部分。控制进入方框701,在该方框中,(″010″& dev_sel&″0000″)被写入到设备/头寄存器以选择连接的ATAPI设备的设备0或设备1。控制进入方框702。在方框702中,读取状态寄存器。控制进入方框704,在该方框中,就状态寄存器是否处于忙状态进行判断。如果处于忙状态,则控制回到方框702,直到状态寄存器 不忙。一旦状态寄存器不忙,控制就进入方框706。在方框706中,值(″0000000″& dma_mode)被写入到功能寄存器。如果dma_mode是1,则数据传输通过Multiword DMA(直接存储器访问)或UltraDMA模式。如果dma_mode是0,则数据传输通过PIO(编程输入/输出)模式。控制进入方框708。在方框708中,00h被写入到扇区统计寄存器。控制进入方框710。在方框710中,00h被写入到扇区编号寄存器。控制进入方框712。在方框712中,FEh被写入到字节统计低(cylinder low)寄存器中。控制进入方框714。在方框714中,FFh被写入到字节统计高(cylinder high)寄存器中。字节统计限制的最大值为FFFEh。控制进入方框716。在方框716中,数据包命令码A0h被写入到命令寄存器中。控制进入方框718。在方框718中,读取另一个状态寄存器以确保在读取状态寄存器被读取之前设备不忙。控制进入方框720。在方框720中,如果另一个状态寄存器处于忙状态,控制返回到方框718,直到另一个状态寄存器不忙。一旦另一个状态不忙,控制就进入方框722。在方框722中,读取状态寄存器。控制进入方框724。在方框724中,如果错误位被设置为1,控制进入方框746,在该方框中,设置ATAPI序列错误中断,控制进入终端B,返回到图6,并将状态机返回到IDE_IDLE状态601。否则,控制进入方框726。在方框726中,读取中断原因(扇区统计)寄存器。如果中断原因寄存器值没有指出命令写入方向,则控制进入方框746,在该方框中,设置ATAPI序列错误,状态机返回到空闲状态。如果中断原因寄存器值指出命令写入方向,则控制进入方框730。在方框730中,包含task_file1的命令数据包,然后包含task_file0的命令数据包被写入到数据寄存器。然后控制进入方框732。 
在方框732中,task_file3和task_file2被写入到数据寄存器。控制进入方框734。在方框734中,task_file5和task_file4被写入到数据寄存器。控制进入方框736。在方框736中,task_file7和task_file6被写入到数据寄存器。控制进入方框738。在方框738中, task_file9和task_file8被写入到数据寄存器。控制进入方框740。在方框740中,task_file11和task_file10被写入到数据寄存器。控制进入方框742。在方框742中,task_file13和task_file12被写入到数据寄存器。控制进入方框744。在方框744中,task_file15和task_file14被写入到数据寄存器。在此完成之后,控制进入终端B,回到图6,回到空闲状态IDE_IDLE。 
在本发明中,如上所述,数据是在传输到输入缓冲区中由硬件状态机处理的,输入缓冲区允许设置数据传输,以在少于10微秒的时间内发生。在目标驱动器是非标准设备的情况下,微控制器可以对存储在驱动器寄存器中的值作出必需的更改,以允许数据传输即使在设备是非标准设备的情况下也可以进行。虽然这会花费更多的时间,但是,通常所需要的更改涉及一个或两个寄存器,以便由硬件状态机获得的大部分节省的时间可以保留。对单个寄存器进行更改所需的时间可能将处理时间延长到70-80微秒。虽然这比只由硬件状态机处理所获得的结果慢,但是任何一种解决方案都比现有技术的控制器的500-700微秒有巨大的改进。如此,本发明保留了硬件状态机的速度快的优点,同时也保留了软件状态机的处理优点,并且比迄今为止任何一种解决方案都快得多。 
尽管是参考优选实施例显示和描述本发明的,但是那些精通本技术的人员将理解,在不偏离如所附的权利要求所定义的本发明的精神和范围的情况下,可以进行各种修改。例如,虽然是针对USB总线说明本发明的,但是,它也可以和基于其他串行总线链接的系统(如IEEE 1394系统)一起使用。