1.2dma寄存器組描述
dma控制器共有8個(gè)32位寄存器,其中5個(gè)為當(dāng)前有效的寄存器,另外3個(gè)為以后擴(kuò)展所用。寄存器的映射表如表1所示。 表1dma控制器內(nèi)部寄存器映射表
偏移量寄存器名稱功能0狀態(tài)寄存器指示dma控制器內(nèi)部 的詳細(xì)情況1源地址寄存器讀取數(shù)據(jù)的起始地址2目的地址寄存器寫入數(shù)據(jù)的起始地址3數(shù)據(jù)長(zhǎng)度寄存器從讀端口傳輸?shù)?寫端口的字節(jié)數(shù)6控制寄存器設(shè)置dma的工作方式
狀態(tài)寄存器的每個(gè)狀態(tài)位指示dma控制器內(nèi)部的詳細(xì)情況。
位編號(hào)位名稱描述0donedma傳輸完成。當(dāng)檢測(cè)到數(shù)據(jù)包結(jié)束信號(hào)或指定長(zhǎng)度的數(shù)據(jù)傳輸完成時(shí),done位為1。寫0到狀態(tài)寄存器使done位為0。1busy當(dāng)dma傳輸正在進(jìn)行時(shí),busy位為12reop當(dāng)傳輸完成事件由讀數(shù)據(jù)包結(jié)束信號(hào)引起時(shí),reop位為13weop當(dāng)傳輸完成事件由寫數(shù)據(jù)包結(jié)束信號(hào)引起時(shí),weop位為14len當(dāng)長(zhǎng)度寄存器遞減為0時(shí),len位為1.
源地址寄存器指定dma傳輸?shù)臄?shù)據(jù)源的起始地址;目的地址寄存器指定了dma傳輸?shù)哪繕?biāo)數(shù)據(jù)區(qū)的起始地址;數(shù)據(jù)長(zhǎng)度寄存器指定從讀端口傳輸?shù)綄懚丝诘淖止?jié)數(shù)。如果是字傳輸,則數(shù)據(jù)長(zhǎng)度寄存器的值需乘以4;若為半字傳輸,則需乘以2。主控制器寫端口每寫一個(gè)字節(jié)數(shù)據(jù)時(shí),數(shù)據(jù)長(zhǎng)度寄存器減1。當(dāng)數(shù)據(jù)長(zhǎng)度寄存器為0時(shí),狀態(tài)寄存器的len位置位;控制寄存器每個(gè)位設(shè)定dma的工作方式??刂萍拇嫫髅總€(gè)位的意義如表3所示。dma傳輸?shù)臄?shù)據(jù)寬度用字節(jié)、半字、字、雙字和4字位指定。這些位只能有一位設(shè)置為1。數(shù)據(jù)傳輸?shù)膶挾扔?個(gè)讀/寫傳輸設(shè)備中傳輸寬度窄的一方?jīng)Q定。例如,將數(shù)據(jù)從16位的外部sdram存儲(chǔ)器中搬移到內(nèi)部32位的片內(nèi)存儲(chǔ)器時(shí),傳輸數(shù)據(jù)寬度應(yīng)該設(shè)置為半字。
表3控制寄存器位
位編號(hào)位名稱描述0byte設(shè)置為字節(jié)(8位)方式傳輸1hw設(shè)置為半字(16位)方式傳輸2word設(shè)置為字(32位)方式傳輸3go使能dma傳輸。當(dāng)設(shè)置為1且數(shù)據(jù)長(zhǎng)度寄存器不為0時(shí),開始dma傳輸4i_en使能中斷(irq)。當(dāng)i_en為1時(shí),若狀態(tài)寄存器的done位也為1,則dma控制器產(chǎn)生中斷請(qǐng)求。5reen終止讀數(shù)據(jù)傳輸。6ween終止寫數(shù)據(jù)傳輸。7leen數(shù)據(jù)長(zhǎng)度寄存器為0時(shí)傳輸結(jié)束。當(dāng)leen位為1時(shí),若數(shù)據(jù)長(zhǎng)度寄存器達(dá)到0時(shí),則結(jié)束dma傳輸。8rcon讀地址固定。當(dāng)rcon為0時(shí),讀地址在每次數(shù)據(jù)傳輸后增加;當(dāng)rcon為1時(shí),讀地址在每次數(shù)據(jù)傳輸后不增加。9wcon寫地址固定。當(dāng)wcon為0時(shí),寫地址在每次數(shù)據(jù)傳輸后增加;當(dāng)wcon為1時(shí),寫地址在每次數(shù)據(jù)傳輸后不增加。10doubleword設(shè)置為雙字(64位)方式傳輸。11quadword設(shè)置為4字(128位)方式傳輸。
1.3軟件編程
altera 提供了hal dma設(shè)備的驅(qū)動(dòng)程序[45],該驅(qū)動(dòng)程序把dma傳輸抽象成2種數(shù)據(jù)通道:發(fā)送數(shù)據(jù)通道和接收數(shù)據(jù)通道。當(dāng)存儲(chǔ)器從外設(shè)接收數(shù)據(jù)時(shí),使用數(shù)據(jù)接收通道;當(dāng)存儲(chǔ)器向外設(shè)發(fā)送數(shù)據(jù)時(shí),使用數(shù)據(jù)發(fā)送通道;當(dāng)存儲(chǔ)器間進(jìn)行數(shù)據(jù)傳輸時(shí),既要使用數(shù)據(jù)接收通道又要使用數(shù)據(jù)發(fā)送通道。與dma發(fā)送數(shù)據(jù)通道相關(guān)的函數(shù)有
alt_dma_txchan_open(),alt_dma_txchan_send(),
alt_dma_txchan_space(),alt_dma_txchan_ioctl(),
alt_dma_txchan_close();而與dma接收數(shù)據(jù)通道相關(guān)的函數(shù)
alt_dma_rxchan_open(),alt_dma_rxchan_prerare(),
alt_dma_rxchan_depth(),alt_dma_rxchan_ioctl()。
alt_dma_txchan_open()和alt_dma_rxchan_open()
函數(shù)分別打開dma控制器的發(fā)送數(shù)據(jù)通道和接收數(shù)據(jù)通道,獲得dma控制器的發(fā)送數(shù)據(jù)通道和接收數(shù)據(jù)通道的句柄,返回非0值表示成功。
調(diào)用alt_dma_txchan_send()函數(shù)產(chǎn)生一次dma發(fā)送數(shù)據(jù)請(qǐng)求。其函數(shù)原型為int alt_dma_txchan_send(alt_dma_txchan dma,const void* from ,alt_u32 length, alt_ txchan_done* done ,void* handle)。調(diào)用此函數(shù)時(shí),length字節(jié)長(zhǎng)度的數(shù)據(jù)將從地址from處被發(fā)送。當(dāng)發(fā)送結(jié)束時(shí),函數(shù)返回值為非負(fù)則表示dma傳輸成功,否則表示傳輸失敗。當(dāng)傳輸結(jié)束時(shí),回調(diào)函數(shù)done將被執(zhí)行,handle為函數(shù)done的參數(shù)。
dma接收函數(shù)的用法與dma發(fā)送函數(shù)的用法大致相同,其函數(shù)原型為 int alt_dma_rxchan_prepare(alt_dma_rxchan dma,const void* data ,alt_u32 length, alt_ txchan_done* done ,void* handle)。參數(shù)data表示dma接收數(shù)據(jù)存放的起始地址。length表示接收數(shù)據(jù)的長(zhǎng)度,單位為字節(jié)。函數(shù)返回值為非負(fù)表示接收成功。當(dāng)接收結(jié)束時(shí),回調(diào)函數(shù)done將被執(zhí)行,handle為函數(shù)done的參數(shù)。另外,與發(fā)送通道和接收通道相關(guān)的還各有2個(gè)函數(shù)。與發(fā)送通道相關(guān)的函數(shù)為alt_dma_txchan_space()和alt_dma_txchan_ioctl()。alt_dma_txchan_space()返回傳送到dma發(fā)送信道的發(fā)送請(qǐng)求數(shù)目。alt_dma_txchan_ioctl()則是執(zhí)行了與器件相關(guān)的控制操作。與接收通道相關(guān)的函數(shù)為:
alt_dma_rxchan_depth()和alt_dma_rxchan_ioctl()。alt_dma_rxchan_depth()函數(shù)返回dma接收通道的最大接收請(qǐng)求數(shù)。alt_dma_rxchan_ioctl()執(zhí)行了與器件相關(guān)的控制操作。
2、dma控制器應(yīng)用舉例
在軟硬件的調(diào)試過程中,有時(shí)需要將內(nèi)存中的一段數(shù)據(jù)通過串口打印出來,作為調(diào)試信息,這時(shí)就可利用dma技術(shù)進(jìn)行數(shù)據(jù)傳輸。圖2為在sopc builder中構(gòu)建的dma傳輸?shù)挠布B接圖,實(shí)現(xiàn)了sdram到串口的數(shù)據(jù)傳輸。
圖2硬件連接圖如下的程序?qū)崿F(xiàn)了將sdram中以chr為起始地址的20個(gè)字節(jié)的數(shù)據(jù)通過dma方式發(fā)送到串口。其實(shí)現(xiàn)的核心代碼如下:
3、結(jié)語
在某雷達(dá)信號(hào)網(wǎng)絡(luò)化數(shù)字傳輸系統(tǒng)的研制中,將雷達(dá)信號(hào)接口單元與網(wǎng)絡(luò)接口單元分別映射為nios ⅱ系統(tǒng)中的2個(gè)外設(shè),利用外設(shè)間的dma方式進(jìn)行數(shù)據(jù)傳輸。實(shí)踐證明,利用dma方式進(jìn)行數(shù)據(jù)傳輸,cpu可從繁重的數(shù)據(jù)傳輸工作中釋放出來,提高了cpu進(jìn)行數(shù)據(jù)處理的能力。
評(píng)論
查看更多