?? qdmatest.c
字號:
#include <std.h>
#include <stdio.h>
#include <csl_edma.h>
#include <csl_irq.h>
#include "qdmatestcfg.h"
typedef Void (*EDMA_ISRHandler)(Uint32 tccNum);
Uint32 BuffA[256];
Uint32 BuffB[256];
EDMA_ISRHandler EDMA_ISRFunc[64];
Void EDMA_ISROpen(Void);
Void EDMA_ISRDefault(Uint32 tccNum);
Void EDMA_ISRChan0(Uint32 tccNum);
Void EDMA_ISRChan16(Uint32 tccNum);
Void EDMA_ISRChan22(Uint32 tccNum);
Void EDMA_ISRDispatcher(Void);
Bool DMATran_bufComp(Uint32 *s, Uint32 *d, Uint32 sw, Uint32 dw, Uint32 shidx, Uint32 swidx, Uint32 dhidx, Uint32 dwidx, Uint32 hcnt, Uint32 wcnt);
///////////////////////////////////////////////////////////////
Void EDMA_ISRDefault(Uint32 tccNum)
{
return;
}
///////////////////////////////////////////////////////////////
Void EDMA_ISRChan0(Uint32 tccNum)
{
//Do what you want to do!
return;
}
///////////////////////////////////////////////////////////////
Void EDMA_ISRChan16(Uint32 tccNum)
{
//Do what you want to do!
return;
}
///////////////////////////////////////////////////////////////
Void EDMA_ISRChan22(Uint32 tccNum)
{
//Do what you want to do!
return;
}
///////////////////////////////////////////////////////////////
Void main()
{
printf("This project is used to test EDMA/QDMA!\n");
EDMA_ISROpen();
}
///////////////////////////////////////////////////////////////
Bool DMATran_bufComp(Uint32 *s, //源緩沖區
Uint32 *d, //目的緩沖區
Uint32 sw, //源緩沖區的寬度
Uint32 dw, //目的緩沖區的寬度
Uint32 shidx, //源緩沖區行索引
Uint32 swidx, //源緩沖區列索引
Uint32 dhidx, //目的緩沖區行索引
Uint32 dwidx, //目的緩沖區列索引
Uint32 hcnt, //待比較數據的行數
Uint32 wcnt) //待比較數據的列數
{
Uint32 i, j;
for(i=0; i<hcnt; i++){
for(j=0; j<wcnt; j++){
if(*(s+i*shidx*sw+j*swidx) != *(d+i*dhidx*dw+j*dwidx)){
return(FALSE);
}
}
}
return(TRUE);
}
///////////////////////////////////////////////////////////////
Void EDMA_ISRDispatcher(Void)
{
Uint32 i,ciprh, ciprl;
ciprl = EDMA_RGET(CIPRL);
ciprh = EDMA_RGET(CIPRH);
do{
EDMA_RSET(CIPRL, 0xFFFFFFFF);
EDMA_RSET(CIPRH, 0xFFFFFFFF);
if(0 != ciprl){
for(i=0; i<32; i++){
if(ciprl & (1 << i)){
EDMA_ISRFunc[i](i);
}
}
}
if(0 != ciprh){
for(i=0; i<32; i++){
if(ciprh & (1 << i)){
EDMA_ISRFunc[i](i+32);
}
}
}
ciprl = EDMA_RGET(CIPRL);
ciprh = EDMA_RGET(CIPRH);
}while((0 != ciprl) || (0 != ciprh));
}
///////////////////////////////////////////////////////////////
Void EDMA_ISROpen(Void)
{
Uint32 i;
EDMA_resetAll();
for(i=0; i<64; i++){
EDMA_ISRFunc[i] = EDMA_ISRDefault;
}
IRQ_map(IRQ_EVT_EDMAINT, 8);
IRQ_configArgs(IRQ_EVT_EDMAINT, EDMA_ISRDispatcher, IRQ_IEMASK_DEFAULT, IRQ_CCMASK_DEFAULT, 0);
IRQ_enable(IRQ_EVT_EDMAINT);
}
///////////////////////////////////////////////////////////////
Void QDMA_work(Void)
{
Uint32 i, j;
Uint32 flg;
EDMA_Config config;
printf("Now Begin to Test QDMA!\n");
//初始化中斷;
EDMA_intEnable(0);
EDMA_ISRFunc[0] = EDMA_ISRChan0;
for(i=0;i<16;i++){
//初始化BuffA;
for(j=0; j<256; j++){
BuffA[j] = j+i;
BuffB[j] = 0;
}
//配置QDMA;
config.opt = EDMA_OPT_RMK(EDMA_OPT_PRI_HIGH,
EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_YES,
EDMA_OPT_SUM_INC,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(0),
EDMA_OPT_TCCM_OF(0),
EDMA_OPT_ATCINT_NO,
EDMA_OPT_ATCC_OF(0),
EDMA_OPT_PDTS_DISABLE,
EDMA_OPT_PDTD_DISABLE,
EDMA_OPT_LINK_NO,
EDMA_OPT_FS_YES);
config.src = (Uint32)BuffA;
config.cnt = (Uint32)0x00200006;
config.dst = (Uint32)BuffB;
config.idx = (Uint32)0x00080000;
EDMA_qdmaConfig(&config);
//等待QDMA結束;
printf("%d.QDMA transfering...",i);
do{
flg = EDMA_getPriQStatus();
flg = flg & (1 << EDMA_OPT_PRI_HIGH);
printf("...");
}while(!flg);
//QDMA傳輸結束并檢測結果;
if(DMATran_bufComp(BuffA, BuffB, 8, 6, 1, 1, 1, 1, 32, 6)){
printf("\n%d.QDMA transfer OK!\n",i);
}else{
printf("\n%d.QDMA transfer FAILED!\n",i);
}
}
}
Void EDMA_work(Void)
{
Uint32 i, j;
Uint32 flg;
EDMA_Handle hEDMA;
EDMA_Handle hEDMATbl;
EDMA_Handle hEDMAChain;
EDMA_Config config;
printf("Now Begin to Test EDMA Link!\n");
//Link功能測試;
//初始化EDMA通道;
hEDMA = EDMA_open(16, EDMA_OPEN_RESET);
EDMA_clearChannel(hEDMA);
EDMA_setEvtPolarity(hEDMA,EDMA_EVT_HIGHLOW);
EDMA_disableChannel(hEDMA);
EDMA_intEnable(1);
EDMA_ISRFunc[1] = EDMA_ISRChan16;
hEDMATbl = EDMA_allocTable(-1);
for(i=0;i<16;i++){
//初始化BuffA;
for(j=0; j<256; j++){
BuffA[j] = j+i;
BuffB[j] = 0;
}
//配置EDMA;
//參數表1.
config.opt = EDMA_OPT_RMK(EDMA_OPT_PRI_HIGH,
EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_IDX,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_IDX,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(1),
EDMA_OPT_TCCM_OF(0),
EDMA_OPT_ATCINT_NO,
EDMA_OPT_ATCC_OF(0),
EDMA_OPT_PDTS_DISABLE,
EDMA_OPT_PDTD_DISABLE,
EDMA_OPT_LINK_YES,
EDMA_OPT_FS_YES);
config.src = (Uint32)BuffA;
config.cnt = (Uint32)0x00000080;
config.dst = (Uint32)BuffB;
config.idx = (Uint32)0x00000008;
config.rld = (Uint32)0x00000000;
EDMA_config(hEDMA,&config);
//參數表2.
config.opt = EDMA_OPT_RMK(EDMA_OPT_PRI_HIGH,
EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_IDX,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_IDX,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(1),
EDMA_OPT_TCCM_OF(0),
EDMA_OPT_ATCINT_NO,
EDMA_OPT_ATCC_OF(0),
EDMA_OPT_PDTS_DISABLE,
EDMA_OPT_PDTD_DISABLE,
EDMA_OPT_LINK_YES,
EDMA_OPT_FS_YES);
config.src = (Uint32)(BuffA+1);
config.cnt = (Uint32)0x00000080;
config.dst = (Uint32)(BuffB+1);
config.idx = (Uint32)0x00000008;
config.rld = (Uint32)0x00000000;
EDMA_config(hEDMATbl,&config);
EDMA_link(hEDMA,hEDMATbl);
EDMA_link(hEDMATbl,EDMA_hNull);
EDMA_setChannel(hEDMA);
//等待EDMA結束;
printf("%d.EDMA transfering...",i);
do{
flg = EDMA_getPriQStatus();
flg = flg & (1 << EDMA_OPT_PRI_HIGH);
printf("...");
}while(!flg);
EDMA_setChannel(hEDMA);
do{
flg = EDMA_getPriQStatus();
flg = flg & (1 << EDMA_OPT_PRI_HIGH);
printf("...");
}while(!flg);
//EDMA傳輸結束并檢測結果;
if(DMATran_bufComp(BuffA, BuffB, 8, 8, 1, 1, 1, 1, 32, 8)){
printf("\n%d.EDMA transfer OK!\n",i);
}else{
printf("\n%d.EDMA transfer FAILED!\n",i);
}
}
EDMA_freeTable(hEDMATbl);
EDMA_close(hEDMA);
printf("Now Begin to Test EDMA Chain!\n");
//Chain功能測試;
//初始化EDMA通道;
hEDMA = EDMA_open(16, EDMA_OPEN_RESET);
EDMA_clearChannel(hEDMA);
EDMA_setEvtPolarity(hEDMA,EDMA_EVT_HIGHLOW);
EDMA_disableChannel(hEDMA);
EDMA_intEnable(22);
EDMA_ISRFunc[22] = EDMA_ISRChan16;
hEDMAChain = EDMA_open(22, EDMA_OPEN_RESET);
EDMA_clearChannel(hEDMAChain);
EDMA_setEvtPolarity(hEDMAChain,EDMA_EVT_HIGHLOW);
EDMA_enableChannel(hEDMAChain);
EDMA_intEnable(1);
EDMA_ISRFunc[1] = EDMA_ISRChan22;
for(i=0;i<16;i++){
//初始化BuffA;
for(j=0; j<256; j++){
BuffA[j] = j+i;
BuffB[j] = 0;
}
//配置EDMA;
//參數表1.
config.opt = EDMA_OPT_RMK(EDMA_OPT_PRI_HIGH,
EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_IDX,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_IDX,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(0),
EDMA_OPT_TCCM_OF(0),
EDMA_OPT_ATCINT_NO,
EDMA_OPT_ATCC_OF(0),
EDMA_OPT_PDTS_DISABLE,
EDMA_OPT_PDTD_DISABLE,
EDMA_OPT_LINK_NO,
EDMA_OPT_FS_YES);
config.src = (Uint32)BuffA;
config.cnt = (Uint32)0x00000080;
config.dst = (Uint32)BuffB;
config.idx = (Uint32)0x00000008;
config.rld = (Uint32)0x00000000;
EDMA_config(hEDMA,&config);
//參數表2.
config.opt = EDMA_OPT_RMK(EDMA_OPT_PRI_HIGH,
EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_IDX,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_IDX,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(1),
EDMA_OPT_TCCM_OF(0),
EDMA_OPT_ATCINT_NO,
EDMA_OPT_ATCC_OF(0),
EDMA_OPT_PDTS_DISABLE,
EDMA_OPT_PDTD_DISABLE,
EDMA_OPT_LINK_NO,
EDMA_OPT_FS_YES);
config.src = (Uint32)(BuffA+1);
config.cnt = (Uint32)0x00000080;
config.dst = (Uint32)(BuffB+1);
config.idx = (Uint32)0x00000008;
config.rld = (Uint32)0x00000000;
EDMA_config(hEDMAChain,&config);
EDMA_chain(hEDMA,hEDMAChain,EDMA_TCC_SET,0);
EDMA_enableChaining(hEDMAChain);
EDMA_setChannel(hEDMA);
//等待EDMA結束;
printf("%d.EDMA transfering...",i);
do{
flg = EDMA_getPriQStatus();
flg = flg & (1 << EDMA_OPT_PRI_HIGH);
printf("...");
}while(!flg);
//EDMA傳輸結束并檢測結果;
if(DMATran_bufComp(BuffA, BuffB, 8, 8, 1, 1, 1, 1, 32, 8)){
printf("\n%d.EDMA transfer OK!\n",i);
}else{
printf("\n%d.EDMA transfer FAILED!\n",i);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -