VxWorks培训-ATA设备驱动 技术研究院-匡尧文 2019/4/20 VxWorks培训-ATA设备驱动 技术研究院-匡尧文 2019/4/20
内容介绍 1、 ATA/ATAPI基础知识 2、 APAPI引脚定义 3、 ATAPI寄存器 4、 ATA命令 5、ATA寻址方式 2019/4/20
1、ATA/ATAPI基础知识 (1)ATA(ATA-1) ATA是最早的IDE标准的正式名称,IDE实际上是指连在硬盘接口的硬盘本身。ATA在主板上有一个插口,支持一个主设备和一个从设备,每个设备的最大容量为504MB,ATA最早支持的PIO-0模式(Programmed I/O-0)只有3.3MB/s,而ATA-1一共规定了3种PIO模式和4种DMA模式(没有得到实际应用),要升级为ATA-2,需要安装一个EIDE适配卡。 2019/4/20
(2)ATA-2 ATA-2(EIDE Enhanced IDE/Fast ATA):这是对ATA-1的扩展,它增加了2种PIO和2种DMA模式,把最高传输率提高到了16.7MB/s,同时引进了LBA地址转换方式,突破了老BIOS固有504MB的限制,支持最高可达8.1GB的硬盘。如你的电脑支持ATA-2,则可以在CMOS设置中找到(LBA,LogicalBlock Address)或(CHS,Cylinder,Head,Sector)的设置。其两个插口分别可以连接一个主设备和一个从设置,从而可以支持四个设备,两个插口也分为主插口和从插口。通常可将最快的硬盘和CD—ROM放置在主插口上,而将次要一些的设备放在从插口上,这种放置方式对于486及早期的Pentium电脑是必要的,这样可以使主插口连在快速的PCI总线上,而从插口连在较慢的ISA总线上。 2019/4/20
(3)ATAPI ATAPI是广为使用的IDE和EIDE设备的相关标准,是计算机内并行ATA接口的扩展。ATAPI标准就是为了解决在IDE/EIDE接口上连接多种设备而制定的。ATAPI是AT Attachment Packet Interface的缩写,意思是AT计算机上附加设备的包接口。支持ATAPI的IDE/EIDE接口可以像连接硬盘一样连接ATAPI设备。目前几乎所有的IDE/EIDE接口都支持ATAPI。 ATAPI是一个软件接口,它将SCSI/ASPI命令调整到ATA接口上,这使得光驱制造商能比较容易的将其高端的CD/DVD驱动器产品调整到ATA接口上。 2019/4/20 5
2、APA引脚定义 (1)DD(15:0)Device Data DD占用3-18引脚,是一个8位或16位的双向数据线,在用于读写CDROM的寄存器时只使用低8位,而在传送信息包或数据时使用全部16位。 (2)CS(1:0)Chip Select CS0,CS1是用于选择指令寄存器芯片的,为低电平有效,它和DA组合就可以选择所要操作的寄存器。 2019/4/20 6
(3) DA(2:0)Device Address DA为三位的地址线,和CS组合选取要操作的寄存器。 (4)DIOR(Device I/O read) DIOR为控制寄存器或数据口读的引脚,低电平有效。 2019/4/20 7
(5) DIOW(Device I/O write) DIOW为控制寄存器或数据口写的引脚,低电平有效。 (6) RESET 当此引脚为低电平时CDROM会被复位。 2019/4/20 8
(7) INTRQ (Device interrupt) INTRQ为中断请求,当CDROM在读写数据等状态下会在此引脚输出信号以使控制器中断程序得以执行。 (8) IORDY (I/O channel ready) 这个引脚可判断CDROM的数据口是否就绪,等待数据的输入或输出。同样实例中没有使用到些引脚。 2019/4/20 9
3、ATA寄存器 计算机主机对IDE接口硬盘的控制是通过硬盘控制器上的二组寄存器实现。一组为命令寄存器组(Task File Registers),I/O的端口地址为1F0H~1F7H,其作用是传送命令与命令参数,另一组为控制/诊断寄存器(Control/Diagnostic Registers),I/O的端口地址为3F6H~3F7H,其作用是控制硬盘驱动器。 2019/4/20 10
表1、命令寄存器组 2019/4/20 11
表2、控制/诊断寄存器组 2019/4/20 12
以上表格指明了各ATAPI常用寄存器的地址和功能,地址是用CS和DA组成,CS为寄存器区段的选择,再加上三位地址的DA就可以组合出多个地址编码选择不同的寄存器。 (1)数据寄存器 是主机和硬盘控制器的缓冲区之间进行8位或16位数据交换用的寄存器,使用该寄存器进行数据传输的方式称程序输入输出方式,即PIO方式,数据交换的另一种方式是通过DMA通道,这种方式不使用数据寄存器进行数据交换; 2019/4/20 13
该寄存器包含了上次命令执行后硬盘的诊断信息。每位意义见表3,在启动系统、硬盘复位或执行硬盘的诊断程序后,也在该寄存器中保存着一个诊断码。 (2)错误寄存器 该寄存器包含了上次命令执行后硬盘的诊断信息。每位意义见表3,在启动系统、硬盘复位或执行硬盘的诊断程序后,也在该寄存器中保存着一个诊断码。 2019/4/20 14
表3、错误寄存器 2019/4/20 15
扇区计数寄存器:指明所要读/写的扇区总数,其中0表示传输256个扇区,如果在数据读写过程发生错误,寄存器将保存尚未读写的扇区数目。 (3)介质地址寄存器 扇区数寄存器、磁道数寄存器、驱动器/磁头寄存器三者合称为介质地址寄存器,介质地址可以用CHS方式或LBA方式,在驱动器/磁头寄存器中指定用何种方式。 扇区计数寄存器:指明所要读/写的扇区总数,其中0表示传输256个扇区,如果在数据读写过程发生错误,寄存器将保存尚未读写的扇区数目。 磁道数寄存器:指明所要读/写的磁道数。 驱动器/磁头寄存器:指定硬盘驱动器号与磁头号和寻址方式,如表4所示。 2019/4/20 16
表4、IDE驱动器/磁头寄存器 2019/4/20 17
保存硬盘控制器命令执行后的状态和结果,如表5所示。 (4)状态寄存器 保存硬盘控制器命令执行后的状态和结果,如表5所示。 2019/4/20 18
表5、IDE状态寄存器 2019/4/20 19
(5) 命令(Command)寄存器 命令寄存器包含执行的命令代码。当向命令寄存器写命令时,相关该命令的参数必须先写入。在写命令时,状态寄存器的BSY位置1。如果命令是非法,则中止执行。 (6)设备控制寄存器 将该寄存器的SRST位设置为1,可以使硬盘驱动器处于复位状态。IEN表示是否允许中断,其中0为允许。由此可见,对该寄存器发送0X0CH命令即令硬盘复位,其格式如表6所示。 2019/4/20 20
表6、IDE设备控制寄存器 2019/4/20 21
4、ATA命令 在ATA标准中,IDE命令一共有30多个,其中有10个是通用型(也称强制型)命令。 20H 读扇区命令(带重试):从硬盘读取指定磁道、磁头上的1~256个扇区到主机。送到主机的数据可以添加4个字节的ECC校验码,读的起始扇区号和扇区个数在命令块指定。这条命令也隐藏着寻找指定的磁道号,所以不需要另外的寻道命令。 30H 写扇区命令(带重试):本命令是将主机内的数据写入硬盘,可以写指定磁道、磁头上的1~256个扇区,与读扇区命令相似,这条命令也隐藏着寻找指定的磁道号,写的起始扇区号和扇区个数由命令块指定。 90H 硬盘诊断命令:以判断硬盘是否已经连接到主机上,可以读取错误寄存器以检查需要的结果,如果是01H或81H表示设备是好的,否则表示设备没有连接或设备是坏的。 08H ATAPI设备软复位命令:当向命令寄存器写入08H时,驱动器会执行软件复位命令,执行效果和硬件复位差不多。 2019/4/20 22
5、ATA寻址方式 (1) 硬盘驱动器的介质是通过磁头、磁道(柱面)、扇区组织起来的。在ATA标准中,磁道数可以达到65 636,一个扇区在正常情况下有512字节,可以用两种方法来寻址,即物理寻址方式(CHS)和逻辑寻找方式(LBA)。 (2) IDE驱动器为逻辑寻址方式使用了线性映射的方式,即扇区从0柱面0头1扇区开始,在0磁头后是同柱面的1磁头,在整个柱面后是下一个柱面的0磁头,在ATA标准中,从物理结构CSH到逻辑块编号的影射如下: LBA=(柱面号*磁头数+磁头号)*扇区数+扇区编号-1 (3)在UNIX、WINDOWS NT等操作系统中,硬盘的寻址方式是在内存中建了一个介质地址包,地址包里保存的是64位LBA地址,如果硬盘支持LBA寻址,就把低28位直接传递给ATA界面,如果不支持,操作系统就先把LBA地址转换为CHS地址,再传递给ATA界面。 2019/4/20 23
6、ATA驱动器读写过程 用PIO方式使主机读写指定的起始磁道、头、扇区号,共读取N个扇区,其过程颇为复杂。过 程包括发送指令、判断盘的状态、处理错误信息等。硬盘有自己的缓冲区,所以每次可以读取1个 磁道上的所有扇区(1个磁道一般有63个扇区)保存在缓冲区,通过盘的数据寄存器(1F0H)与主机传输 数据。 2019/4/20 24
PIO方式读命令的执行过程如下: (1) 根据要读的扇区位置,向控制寄存器1F2H~1F6H发命令参数,等驱动器的状态寄存器1F7H的DRDY置位后进入下一步; (2) 主机向驱动器命令控制器1F7H发送读命令20H; (3) 驱动器设置状态寄存器1F7H中的BSY位,并把数据发送到硬盘缓冲区; (4) 驱动器读取一个扇区后,自动设置状态寄存器1F7H的DRQ数据请求位,并清除BSY位忙信号。DRQ位通知主机现在可以从缓冲区中读取512字节或更多(如果用READ LONG COMMAND命令)的数据,同时向主机发INTRQ中断请求信号; (5) 主机响应中断请求,开始读取状态寄存器1F7H,以判断读命令执行的情况,同时驱动器清除INTRQ中断请求信号; (6) 根据状态寄存器,如果读取的数据命令执行正常,进入7),如果有错误,进入错误处理,如果是ECC错误,再读取一次,否则退出程序运行; (7) 主机通过数据寄存器1F0H读取硬盘缓冲区中的数据到主机缓冲区中,当一个扇区数据被读完,扇区计数器-1,如果扇区计数器不为0,进入3),否则进入8); (8) 当所有的请求扇区的数据被读取后,命令执行结束。 2019/4/20 25
PIO方式写命令的执行过程如下: (1) 根据要写的扇区位置,向驱动器控制寄存器1F2H~1F6H发出命令参数,等驱动器DRDY置位后进入下一步; (2) 主机向驱动器命令控制器1F7H发送写命令30H; (3) 驱动器在状态寄存器1F7H中设置DRQ数据请求信号; (4) 主机通过数据寄存器1F0H把指定内存(BUF)中的数据传输到缓冲区; (5) 当缓冲区满,或主机送完512个字节的数据后,驱动器设置状态寄存器1F7H中的BSY位,并清除DRQ数据请求信号; (6) 缓冲区中的数据开始被写入驱动器的指定的扇区中,一旦处理完一个扇区,驱动器马上清除BSY信号,同时设置INTRQ; (7) 主机读取驱动器的状态1F7H和错误寄存器1F1H,以判断写命令执行的情况,如果有无法克服的错误(如坏盘),退出本程序,否则,进入下一步; (8) 如果还有扇区进行写操作,进入3)否则,进入下一步; (9) 当所有的请求扇区的数据被写后,命令执行结束。 2019/4/20 26