📄 dma.c
字号:
//=========================================================================================
//dma.c
//=========================================================================================
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "addr.h"
#include "def.h"
#include "lib.h"
#include "option.h"
#include "dma.h"
int dmaDone;
static void __irq Dma0Done( void );
static void __irq Dma1Done( void );
static void __irq Dma2Done( void );
static void __irq Dma3Done( void );
void DMA_M2M( int ch, int srcAddr, int dstAddr, int tc, int dsz, int burst);
void Test_DMA( void )
{
//DMA Ch 0
DMA_M2M(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single
DMA_M2M(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x40000,1,0); //halfword,single
DMA_M2M(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,2,0); //word,single
DMA_M2M(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,0,1); //byte,burst
DMA_M2M(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x10000,1,1); //halfword,burst
DMA_M2M(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000, 0x8000,2,1); //word,burst
//DMA Ch 1
DMA_M2M(1,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single
DMA_M2M(1,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x40000,1,0); //halfword,single
DMA_M2M(1,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,2,0); //word,single
DMA_M2M(1,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,0,1); //byte,burst
DMA_M2M(1,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x10000,1,1); //halfword,burst
DMA_M2M(1,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x8000,2,1); //word,burst
//DMA Ch 2
DMA_M2M(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single
DMA_M2M(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x40000,1,0); //halfword,single
DMA_M2M(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,2,0); //word,single
DMA_M2M(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,0,1); //byte,burst
DMA_M2M(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x10000,1,1); //halfword,burst
DMA_M2M(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000, 0x8000,2,1); //word,burst
//DMA Ch 3
DMA_M2M(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single
DMA_M2M(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x40000,1,0); //halfword,single
DMA_M2M(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,2,0); //word,single
DMA_M2M(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x20000,0,1); //byte,burst
DMA_M2M(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x10000,1,1); //halfword,burst
DMA_M2M(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000, 0x8000,2,1); //word,burst
}
void DMA_M2M( int ch, int srcAddr, int dstAddr, int tc, int dsz, int burst)
{
int i,time;
volatile U32 memSum0=0,memSum1=0;
DMA *pDMA;
int length;
length = tc * ( burst ? 4:1 ) *
( ( dsz == 0 ) + ( dsz == 1 ) * 2 + ( dsz == 2 ) * 4 );
Uart0_Printf( "[DMA%d MEM2MEM Test]\n",ch);
switch(ch)
{
case 0:
Irq_InstallHandler( BIT_DMA0, Dma0Done );
Irq_Enable( BIT_DMA0 );
pDMA = ( DMA *) & rDISRC0;
break;
case 1:
Irq_InstallHandler( BIT_DMA1, Dma1Done );
Irq_Enable( BIT_DMA1 );
pDMA = ( DMA *) & rDISRC1;
break;
case 2:
Irq_InstallHandler( BIT_DMA2, Dma2Done );
Irq_Enable( BIT_DMA2 );
pDMA = ( DMA *) & rDISRC2;
break;
case 3:
Irq_InstallHandler( BIT_DMA3, Dma3Done );
Irq_Enable( BIT_DMA3 );
pDMA = ( DMA *) & rDISRC3;
break;
}
Uart0_Printf( "DMA%d %8xh -> %8xh, size = %xh(tc=%xh), dsz = %d, burst = %d\n", ch,
srcAddr, dstAddr, length, tc, dsz, burst);
Uart0_Printf( "Initialize the src.\n" );
for(i=srcAddr;i<(srcAddr+length);i+=4)
{
*((U32 *)i)=i^0x55aa5aa5;
memSum0+=i^0x55aa5aa5;
}
Uart0_Printf( "DMA%d start\n",ch);
dmaDone=0;
pDMA->rDISRC = srcAddr;
pDMA->rDISRCC = ( 0 << 1 ) | ( 0 << 0 ); // inc,AHB
pDMA->rDIDST = dstAddr;
pDMA->rDIDSTC = ( 0 << 1 ) | ( 0 << 0 ); // inc,AHB
pDMA->rDCON = tc | ( 1 << 31 ) | ( 1 << 30 ) | ( 1 << 29 ) | ( burst << 28 ) |
( 1 << 27 ) | ( 0 << 23 ) | ( 1 << 22 ) |( dsz << 20 ) | ( tc );
//HS,AHB,TC interrupt,whole, SW request mode,relaod off
pDMA->rDMASKTRIG = ( 1 << 1 ) | 1; //DMA on, SW_TRIG
//Timer_Start(3);//128us resolution
while( dmaDone == 0 );
//time=Timer_Stop();
Uart0_Printf( "DMA transfer done.\n" );
// Uart0_Printf( "DMA transfer done. time=%f, %fMB/S\n",(float)time/ONESEC3,
// length/((float)time/ONESEC3)/1000000.);
Irq_Disable( BIT_DMA0 | BIT_DMA1 | BIT_DMA2 | BIT_DMA3 );
for( i = dstAddr; i < dstAddr + length; i += 4)
{
memSum1 += *( ( U32 *)i ) = i ^ 0x55AA5AA5;
}
Uart0_Printf( "memSum0 = %x, memSum1 = %x\n", memSum0, memSum1 );
if(memSum0==memSum1)
Uart0_Printf( "DMA test result--------------------------------------O.K.\n" );
else
Uart0_Printf( "DMA test result--------------------------------------ERROR!!!\n" );
}
static void __irq Dma0Done( void )
{
ClearPending( BIT_DMA0 );
dmaDone=1;
}
static void __irq Dma1Done( void )
{
ClearPending( BIT_DMA1 );
dmaDone=1;
}
static void __irq Dma2Done( void )
{
ClearPending( BIT_DMA2 );
dmaDone=1;
}
static void __irq Dma3Done( void )
{
ClearPending( BIT_DMA3 );
dmaDone=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -