?? fast_dma.c
字號:
/**************************************************************
程序說明 :FAST DMA
類 型 :Nios II
作 者 :柳軍勝
公 司 :杭州自由電子科技
:http://www.freefpga.com
電 話 :0571-85084089
修 改 :
日期時間 :20060529
說 明 :
Nios II HAL中有一套DMA操作函數,使用中不直觀,針對DMA外設
寄存器映射,直接操作效率更高,控制更直觀,本模塊重新整理了早期的
SDK。同時也把使用HAL庫的整合函數放置在本模塊中。
**************************************************************/
#include <alt_types.h>
#include <sys/alt_irq.h>
#include <io.h>
#include <sys/alt_dma.h>
#include <system.h>
#include "fast_dma.h"
#include <altera_avalon_dma_regs.h>
/************************************
功 能:模塊本地數據區
說 明:
0、DMA設備地址
1、DMA通道句柄
2、DMA緩沖區
3、DMA傳輸完成標志
*************************************/
void *dma_base;
int gControl_bits=0;
int gDmaLen;
static unsigned int dma_buff[512];
static volatile int rx_done_flag=0,tx_done_flag=0;
static alt_dma_txchan txchan;
static alt_dma_rxchan rxchan;
/*********************************************
函數名:fast_dma_init
功 能:FAST DMA初始化函數
輸 入: dma base address
返 回: 0 success,-1 error
備 注:
FAST DMA 初始化:
1、保存DMA設備地址
2、清除DMA設備狀態
3、設置接收和發送地址
4、設置傳輸長度
4、設置傳輸BIT寬度
5、設置結束傳輸條件為傳輸長度控制
6、接收和發送地址增量控制由參數mode中設置
7、默認設置為非中斷方式,中斷方式需要在MODE參數中增加IEN位
不啟動GO
**********************************************/
int fast_dma_init(void *baseaddr,
int bytes_per_transfer,
void *source_address,
void *destination_address,
int transfer_count,
int mode)
{
int len;
dma_base=(np_dma *)baseaddr;
gControl_bits = 0;
// 清除所有控制位設置
IOWR_ALTERA_AVALON_DMA_CONTROL(dma_base,0);
// 清除狀態位
IOWR_ALTERA_AVALON_DMA_STATUS(dma_base, 0);
// 源地址
IOWR_ALTERA_AVALON_DMA_RADDRESS(dma_base, source_address);
// 目標地址
IOWR_ALTERA_AVALON_DMA_WADDRESS(dma_base, destination_address);
// 字節傳輸長度
gDmaLen=transfer_count * bytes_per_transfer;
IOWR_ALTERA_AVALON_DMA_LENGTH(dma_base,gDmaLen);
// 控制位設定
gControl_bits =
mode // wcon, rcon bits
| (bytes_per_transfer & 7) // low three bits of control reg
| ((bytes_per_transfer & 8) ? ALTERA_AVALON_DMA_CONTROL_DWORD_MSK : 0)
| ((bytes_per_transfer & 16) ? ALTERA_AVALON_DMA_CONTROL_QWORD_MSK : 0)
| ALTERA_AVALON_DMA_CONTROL_LEEN_MSK;
IOWR_ALTERA_AVALON_DMA_CONTROL(dma_base, gControl_bits);
return 0;
}
/*********************************************
函數名:fast_dma_irq
功 能:fast_dma中斷處理函數
輸 入:context:相關內容指針,中斷號
返 回:
備 注:
該函數目前只是重新啟動一次DMA傳輸
**********************************************/
void fast_dma_irq(void *context,alt_u32 interrupt)
{
int iRet;
IOWR_ALTERA_AVALON_DMA_LENGTH(dma_base,gDmaLen);
IOWR_ALTERA_AVALON_DMA_CONTROL(dma_base, gControl_bits|ALTERA_AVALON_DMA_CONTROL_GO_MSK);
}
/*********************************************
函數名:rx_done
功 能:DMA接收完成回調函數
輸 入:
返 回:
備 注:
**********************************************/
static void rx_done (void* handle, void* data)
{
rx_done_flag++;
}
/*********************************************
函數名:tx_done
功 能:DMA發送完成回調函數
輸 入:
返 回:
備 注:
**********************************************/
static void tx_done (void* handle, void* data)
{
tx_done_flag++;
}
/**************************************************
函數名:init_dma_channel
功 能:初始化DMA通道
輸 入: 0 成功, -1 打開發送通道錯誤,-2 打開接收通道錯誤
返 回:
備 注:使用HAL的擴展函數
**************************************************/
int init_dma_channel()
{
int iRet;
if ((txchan = alt_dma_txchan_open("/dev/dma_0")) == 0)
{
printf ("Failed to open transmit channel\n");
return -1;
}
alt_dma_txchan_ioctl(txchan,ALT_DMA_SET_MODE_32,0);
alt_dma_txchan_ioctl(txchan,
ALT_DMA_TX_ONLY_ON,
__IO_CALC_ADDRESS_NATIVE (FREEDEV_AIC23_0_BASE, 0x07));
if ((rxchan = alt_dma_rxchan_open("/dev/dma_0")) == 0)
{
printf ("Failed to open receive channel\n");
alt_dma_txchan_close(txchan);
return -2;;
}
alt_dma_rxchan_ioctl(rxchan,ALT_DMA_SET_MODE_32,0);
alt_dma_rxchan_ioctl(rxchan,
ALT_DMA_RX_ONLY_ON,
__IO_CALC_ADDRESS_NATIVE (FREEDEV_AIC23_0_BASE, 0x07));
return 0;
}
/**************************************************
函數名:close_dma_channel
功 能:初始化DMA通道
輸 入: 0 成功, -1 打開發送通道錯誤,-2 打開接收通道錯誤
返 回:
備 注:使用HAL的擴展函數
**************************************************/
int close_dma_channel()
{
alt_dma_txchan_close(txchan);
alt_dma_rxchan_close(rxchan);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -