基于FPGA的IDE硬盤接口卡的實(shí)現(xiàn)
本文采用FPGA實(shí)現(xiàn)了IDE硬盤接口協(xié)議。系統(tǒng)提供兩套符合ATA-6規(guī)范的IDE接口,一個(gè)與普通IDE硬盤連接,另一個(gè)與計(jì)算機(jī)主板上的IDE接口相連。系統(tǒng)采用FPGA實(shí)現(xiàn)接口協(xié)議,完成接口數(shù)據(jù)的截獲、處理(在本文中主要是數(shù)據(jù)加密)和轉(zhuǎn)發(fā),支持PIO和Ultra DMA兩種數(shù)據(jù)傳輸模式。下面重點(diǎn)介紹用FPGA實(shí)現(xiàn)接口協(xié)議的方法。
1 IDE接口協(xié)議簡(jiǎn)介
1.1 IDE接口引腳定義
IDE(Integrated Drive Electronics)即“電子集成驅(qū)動(dòng)器”,又稱為ATA接口。表1列出了ATA標(biāo)準(zhǔn)中IDE接口上的信號(hào)。其中,帶“-”的信號(hào)(如RESET-)表示低電平有效?!胺较颉笔窍鄬?duì)于硬盤而言,I表示進(jìn)入硬盤,O表示從硬盤出來(lái),I/O表示雙向。
表1:IDE接口引腳定義
1.2 IDE控制器的寄存器組
主機(jī)對(duì)IDE硬盤的控制是通過(guò)硬盤控制器上的兩組寄存器來(lái)實(shí)現(xiàn)的。一組為命令寄存器組;另一組為控制/診斷寄存器,如表2所示。
表2:寄存器組
特征寄存器中的內(nèi)容作為命令的一個(gè)參數(shù),其作用隨命令而變。扇區(qū)數(shù)寄存器指示 該次命令所需傳輸數(shù)據(jù)的扇區(qū)數(shù)。扇區(qū)號(hào)寄存器、柱面數(shù)寄存器(低、高)、驅(qū)動(dòng)器/磁頭寄存器三者合稱為介質(zhì)地址寄存器,指示該次命令所需傳輸數(shù)據(jù)首扇區(qū)的地址,尋址方式可以用“柱面/磁頭/扇區(qū)(CHS)”或“邏輯塊地址(LBA)”方式,在驅(qū)動(dòng)器/磁頭寄存器中指定。
命令寄存器存儲(chǔ)執(zhí)行的命令代碼。當(dāng)向命令寄存器寫入命令時(shí),相關(guān)的參數(shù)必須先寫入。命令寫入后,硬盤立即開(kāi)始命令的執(zhí)行。狀態(tài)寄存器保存硬盤執(zhí)行命令后的結(jié)果,供主機(jī)讀取。其主要位有:BSY-驅(qū)動(dòng)器忙,DRDY-驅(qū)動(dòng)器準(zhǔn)備好,DF-驅(qū)動(dòng)器故障,DRQ-數(shù)據(jù)請(qǐng)求,ERR-命令執(zhí)行出錯(cuò)。輔助狀態(tài)寄存器與狀態(tài)寄存器的內(nèi)容完全相同,但讀該寄存器時(shí)不清除中斷請(qǐng)求。錯(cuò)誤寄存器包含了命令執(zhí)行出錯(cuò)時(shí)硬盤的診斷信息。
數(shù)據(jù)寄存器為PIO傳輸模式下,主機(jī)和硬盤控制器的緩沖區(qū)之間進(jìn)行數(shù)據(jù)交換的寄存器。數(shù)據(jù)端口為DMA傳輸模式下專用的數(shù)據(jù)傳輸通道。
1.3 IDE數(shù)據(jù)傳輸方式
IDE接口的數(shù)據(jù)傳輸包括PIO和DMA兩種方式。PIO模式是硬盤數(shù)據(jù)傳輸?shù)幕痉绞?。在PIO方式下,數(shù)據(jù)的傳輸以數(shù)據(jù)塊(1個(gè)或者多個(gè)扇區(qū))為單位,每傳輸完一個(gè)數(shù)據(jù)塊后,硬盤都會(huì)產(chǎn)生一個(gè)中斷請(qǐng)求,并向主機(jī)報(bào)告命令執(zhí)行結(jié)果。
在DMA方式下,主機(jī)和硬盤之間需要通過(guò)一系列握手信號(hào)建立一個(gè)DMA通道,數(shù)據(jù)以數(shù)據(jù)流的形式傳輸。當(dāng)傳輸完一個(gè)命令的所有數(shù)據(jù)時(shí),硬盤產(chǎn)生一個(gè)中斷請(qǐng)求,并向主機(jī)報(bào)告命令執(zhí)行結(jié)果。DMA方式又分為Ultra DMA和Multiword DMA兩種。Ultra DMA方式在選通信號(hào)的上升沿和下降沿均鎖定數(shù)據(jù),提高了數(shù)據(jù)的傳輸速率,并且在數(shù)據(jù)傳輸結(jié)束時(shí)還要進(jìn)行CRC校驗(yàn)。
2 FPGA內(nèi)部框圖
本設(shè)計(jì)采用Actel公司的ProASIC PLUS系列FPGA芯片,其內(nèi)部框圖如圖1所示。
寄存器組一保存從主機(jī)寫入的命令及命令參數(shù),在控制模塊的作用下轉(zhuǎn)發(fā)給硬盤。寄存器組二保存從硬盤讀出的命令執(zhí)行結(jié)果,供主機(jī)讀取??刂颇K負(fù)責(zé)產(chǎn)生對(duì)主機(jī)及對(duì)硬盤的各種IDE協(xié)議控制信號(hào),并協(xié)調(diào)各模塊之間的工作??刂颇K采用狀態(tài)機(jī)的設(shè)計(jì)方法,其軟件設(shè)計(jì)流程將在下一節(jié)中詳細(xì)介紹。數(shù)據(jù)處理單元對(duì)數(shù)據(jù)進(jìn)行加/解密運(yùn)算。緩沖區(qū)一、二則作為數(shù)據(jù)處理單元的輸入/輸出緩存。在PIO方式下,數(shù)據(jù)的處理以數(shù)據(jù)塊為單位,緩沖區(qū)充當(dāng)RAM的作用;在Ultra DMA方式下,數(shù)據(jù)以數(shù)據(jù)流的形式處理,緩沖區(qū)充當(dāng)FIFO的作用。
3系統(tǒng)軟件流程
開(kāi)機(jī)時(shí),F(xiàn)PGA檢測(cè)到復(fù)位信號(hào),初始化內(nèi)部寄存器組,并對(duì)硬盤進(jìn)行復(fù)位操作,硬盤復(fù)位完畢后FPGA進(jìn)入空閑狀態(tài)。FPGA在空閑狀態(tài)時(shí)會(huì)檢測(cè)主機(jī)是否有寫命令操作(通常一個(gè)命令的寫入,要先寫特征寄存器、扇區(qū)數(shù)寄存器、扇區(qū)號(hào)寄存器、柱面數(shù)低位寄存器、柱面數(shù)高位寄存器、驅(qū)動(dòng)器/磁頭寄存器6個(gè)命令參數(shù)寄存器,最后將命令寫入命令寄存器)。當(dāng)主機(jī)依次將寄存器組一寫完后,F(xiàn)PGA對(duì)主機(jī)置BSY位,并將命令轉(zhuǎn)發(fā)給硬盤,同時(shí)判斷命令類型,根據(jù)不同的命令,進(jìn)入相應(yīng)的命令處理流程。
如果是無(wú)數(shù)據(jù)命令,F(xiàn)PGA等待硬盤命令的執(zhí)行,命令執(zhí)行完畢后,硬盤產(chǎn)生一個(gè)中斷請(qǐng)求,此時(shí)FPGA將執(zhí)行結(jié)果讀入寄存器組二中,并向主機(jī)產(chǎn)生中斷請(qǐng)求。如果是有數(shù)據(jù)命令,則根據(jù)數(shù)據(jù)傳輸?shù)哪J?,分別進(jìn)入到下述的PIO命令處理流程及Ultra DMA命令處理流程。
3.1 PIO命令處理流程
以PIO模式傳輸數(shù)據(jù)的命令有Write Sectors、Write Multiple、Read Sectors和Read Multiple。當(dāng)FPGA判斷出是PIO模式的數(shù)據(jù)傳輸命令時(shí),轉(zhuǎn)向PIO命令處理流程。下面我們以PIO寫操作為例介紹。
FPGA首先查詢硬盤的BSY位。若BSY為0則將硬盤的狀態(tài)寄存器讀入寄存器組二,并查詢DRQ位。若DRQ為1則表明硬盤已準(zhǔn)備好接收數(shù)據(jù)。此時(shí)主機(jī)可以向緩沖區(qū)一寫入數(shù)據(jù)塊(本設(shè)計(jì)中,我們?cè)O(shè)定數(shù)據(jù)塊的大小為1個(gè)扇區(qū)共512字節(jié))。主機(jī)寫完一個(gè)數(shù)據(jù)塊后FPGA對(duì)主機(jī)置BSY位,數(shù)據(jù)處理單元開(kāi)始進(jìn)行加密運(yùn)算,并將加密后的數(shù)據(jù)寫入緩沖區(qū)二。加密運(yùn)算完成后,F(xiàn)PGA將緩沖區(qū)二中的數(shù)據(jù)寫入硬盤數(shù)據(jù)緩存區(qū),并進(jìn)入等待狀態(tài)。硬盤將數(shù)據(jù)寫入物理介質(zhì)(磁碟)后會(huì)產(chǎn)生一個(gè)中斷請(qǐng)求,報(bào)告已完成該數(shù)據(jù)塊的寫操作。FPGA將執(zhí)行結(jié)果讀入寄存器組二中,向主機(jī)產(chǎn)生中斷請(qǐng)求,并再次查詢DRQ位,若DRQ為1則進(jìn)入下一個(gè)PIO數(shù)據(jù)塊的傳輸過(guò)程,若DRQ為0則表示該命令所有數(shù)據(jù)全部傳完,F(xiàn)PGA進(jìn)入空閑狀態(tài)。
此外,Identify Device命令是主機(jī)以PIO方式從硬盤讀出512字節(jié)的屬性信息(包括硬盤的型號(hào)、容量等)。此時(shí),數(shù)據(jù)處理單元不應(yīng)對(duì)該命令的數(shù)據(jù)進(jìn)行加/解密運(yùn)算。
3.2 Ultra DMA命令處理流程
以Ultra DMA模式傳輸數(shù)據(jù)的命令有Write DMA和Read DMA。下面我們以Ultra DMA寫操作為例介紹Ultra DMA命令處理流程。
DMA傳輸通道的建立都是由硬盤通過(guò)DMARQ來(lái)請(qǐng)求的。FPGA接收到硬盤的DMA請(qǐng)求后首先初始化主機(jī)至FPGA的DMA通道,緊接著初始化FPGA至硬盤的DMA通道。此時(shí)主機(jī)經(jīng)FPGA到硬盤的DMA通道即已建立,主機(jī)向緩沖區(qū)一寫入數(shù)據(jù),同時(shí)數(shù)據(jù)處理單元對(duì)數(shù)據(jù)進(jìn)行加密運(yùn)算,并將加密后的數(shù)據(jù)寫入緩沖區(qū)二,F(xiàn)PGA則將緩沖區(qū)二中的數(shù)據(jù)寫入硬盤。在傳輸過(guò)程中,若硬盤要求暫?;蛘呔彌_區(qū)二空,則FPGA暫停向硬盤發(fā)送數(shù)據(jù);若緩沖區(qū)一滿,則FPGA要求主機(jī)暫停發(fā)送數(shù)據(jù)。
圖3 PIO命令處理流程
主機(jī)和硬盤都可以隨時(shí)停止當(dāng)前的DMA傳輸,未傳完的數(shù)據(jù)將等待硬盤下一次的DMA請(qǐng)求時(shí)再進(jìn)行傳輸。如果硬盤提出中止傳輸,F(xiàn)PGA將撤除FPGA至硬盤的DMA通道,同時(shí)向主機(jī)提出中止傳輸,撤除主機(jī)至FPGA的DMA通道,并計(jì)算該次所傳數(shù)據(jù)的CRC校驗(yàn)。然后FPGA進(jìn)入等待狀態(tài),等待硬盤下一次的DMA請(qǐng)求。
如果主機(jī)提出中止傳輸,F(xiàn)PGA將撤除主機(jī)至FPGA的DMA通道,同時(shí)繼續(xù)向硬盤發(fā)送數(shù)據(jù),直到將接收到主機(jī)的數(shù)據(jù)發(fā)送完畢,即緩沖區(qū)二空后,向硬盤提出中止傳輸,撤除FPGA至硬盤的DMA通道,并計(jì)算CRC校驗(yàn)。然后FPGA進(jìn)入等待狀態(tài),等待硬盤下一次的DMA請(qǐng)求。
在等待狀態(tài)下,若FPGA接收到硬盤的中斷請(qǐng)求,則說(shuō)明該次命令的所有數(shù)據(jù)已經(jīng)傳完,命令結(jié)束。FPGA將命令執(zhí)行結(jié)果讀入寄存器組二,向主機(jī)產(chǎn)生中斷請(qǐng)求,進(jìn)入空閑狀態(tài)。若接收到硬盤的DMA請(qǐng)求,則說(shuō)明硬盤還未接收到該次命令的所有數(shù)據(jù),此時(shí)需要判斷主機(jī)是否已將所有數(shù)據(jù)發(fā)送完。如果主機(jī)并沒(méi)有將所有數(shù)據(jù)發(fā)送完,則再次建立FPGA兩側(cè)的DMA通道,開(kāi)始新一輪的DMA傳輸;如果主機(jī)已將所有數(shù)據(jù)發(fā)送完,則重新建立FPGA至硬盤的DMA通道,直到將緩沖區(qū)二中的數(shù)據(jù)發(fā)送完,并計(jì)算CRC校驗(yàn)。
4 結(jié)束語(yǔ)
本文采用FPGA實(shí)現(xiàn)了兩套符合ATA-6規(guī)范的IDE接口,完成主機(jī)與硬盤之間數(shù)據(jù)的截獲、處理和轉(zhuǎn)發(fā)。經(jīng)測(cè)試,系統(tǒng)在DOS、Windows 98、Windows 2000、Windows XP及 Red Hat Linux 9.0操作系統(tǒng)環(huán)境下,使用希捷、邁拓、三星、西數(shù)等公司的多種型號(hào)硬盤均工作正常,支持PIO和Ultra DMA兩種數(shù)據(jù)傳輸模式。由于通過(guò)FPGA實(shí)現(xiàn)一個(gè)完整的IDE接口,若對(duì)系統(tǒng)稍加改動(dòng),如在數(shù)據(jù)處理單元中加入相應(yīng)的文件系統(tǒng),即可實(shí)現(xiàn)脫機(jī)讀寫IDE硬盤,用于數(shù)據(jù)采集的海量存儲(chǔ)等多種場(chǎng)合,使系統(tǒng)具有較好的通用性。
本文作者創(chuàng)新點(diǎn):作者針對(duì)硬盤數(shù)據(jù)易泄密及高速大容量數(shù)據(jù)采集困難等問(wèn)題,提出在主機(jī)和硬盤之間使用FPGA芯片構(gòu)建一個(gè)雙向IDE硬盤通道,實(shí)現(xiàn)兩套符合ATA-6規(guī)范的IDE接口,F(xiàn)PGA對(duì)主機(jī)與硬盤間的數(shù)據(jù)流進(jìn)行處理及轉(zhuǎn)發(fā),以實(shí)現(xiàn)硬盤數(shù)據(jù)加密、數(shù)據(jù)高速采集存儲(chǔ)及脫機(jī)控制硬盤等操作。系統(tǒng)支持PIO和Ultra DMA兩種數(shù)據(jù)傳輸模式,對(duì)操作系統(tǒng)透明,較常見(jiàn)的單向IDE通道,該系統(tǒng)通用性強(qiáng),有較好的推廣價(jià)值。本文側(cè)重于用FPGA實(shí)現(xiàn)IDE接口協(xié)議,對(duì)實(shí)現(xiàn)過(guò)程及方法做了詳細(xì)描述,對(duì)讀者有較高的參考實(shí)用價(jià)值。
評(píng)論