利用WinDriver實(shí)現(xiàn)鏈?zhǔn)紻MA
按照上面的策略,一次DMA傳輸至少可以處理含有(2032-16)/16=126個(gè)描述符的描述符表,至少可以傳輸124*4 KB=496 KB大小的數(shù)據(jù)。如果DAM傳輸?shù)臄?shù)據(jù)很多時(shí),可以分成多次DMA傳輸,這樣仍可使每次DMA傳輸時(shí),描述表的數(shù)據(jù)占用一個(gè)物理頁。
上面的策略,也可應(yīng)用于DMA數(shù)據(jù)存儲(chǔ)區(qū)的設(shè)置。例如在我們進(jìn)行的加密卡設(shè)計(jì)中,使用DMA寫模塊完成加密結(jié)果的輸出。對于公鑰算法,其加密結(jié)果的長度往往是固定的,比如,對2 048位的RSA簽名運(yùn)算,其簽名結(jié)果長度為256字節(jié)。此時(shí)采用上面的策略,我們就可以通過一次DMA傳輸讀到簽名結(jié)果,這樣就簡化了底層設(shè)備對輸出接口的設(shè)計(jì)。
在設(shè)置完DMA控制寄存器后,設(shè)備開始進(jìn)行MDA描述符檢索,然后開始進(jìn)行數(shù)據(jù)傳輸,主機(jī)需要知道什么時(shí)候數(shù)據(jù)傳輸結(jié)束,以便進(jìn)行其他處理或讀取傳輸結(jié)果。有兩種處理方式:中斷方式和查詢方式。由于Windows XP操作系統(tǒng)不支持消息中斷請求(MSI),故采用查詢的方式處理。這就需要設(shè)置描述符的控制域和DMA控制寄存器的控制域部分,以使設(shè)備更新描述符表的EPLAST域。需要指出的是:在設(shè)備DMA處理模塊的實(shí)現(xiàn)中,描述表的描述符頭中,最后一個(gè)雙字的低16位是EPLAST域的實(shí)際值,即最后完成的描述符的索引號(hào),而高16位是其他的信息。因此可以用下面的DMAWaitForCompletion函數(shù)進(jìn)行查詢處理。
在上面的函數(shù)中hDev為設(shè)備句柄;DT_HEAD_EPLAST為描述表的描述符頭中,最后一個(gè)雙字的地址指針;eplast_num為DMA傳輸?shù)淖詈笠粋€(gè)描述符的索引號(hào),等于描述符表中描述符個(gè)數(shù)減1。函數(shù)的返回值為真,表示DMA傳輸正確完成。
為了使DMA緩沖區(qū)保持與CPU緩存、I/O緩存的同步,主機(jī)端應(yīng)在設(shè)置DMA控制寄存器之前,對DMA傳輸?shù)臄?shù)據(jù)存儲(chǔ)區(qū)和描述符表存儲(chǔ)區(qū)調(diào)用WDC_DMASyncCpu函數(shù),在完成DMA的傳輸查詢之后,調(diào)用WDC_DMASyncIo函數(shù)和WDC_DMABufUnlock函數(shù)。
4 結(jié)束語
對基于Altera公司PCI Express硬核的鏈?zhǔn)紻MA應(yīng)用,Altera公司雖然提供了上層Demo示例程序,但其只進(jìn)行了MDA傳輸?shù)男阅軠y試。文中給出了處理DMA數(shù)據(jù)傳輸時(shí),主機(jī)端需要面對和解決的幾個(gè)問題。通過這些處理方法和策略,保證了主機(jī)和設(shè)備之間DMA數(shù)據(jù)傳輸?shù)恼_性,簡化了底層FPGA應(yīng)用的設(shè)計(jì),為利用DMA模塊進(jìn)行用戶的應(yīng)用邏輯設(shè)計(jì)提供了基礎(chǔ)。本文引用地址:http://www.ex-cimer.com/article/148004.htm
存儲(chǔ)器相關(guān)文章:存儲(chǔ)器原理
評(píng)論