|
楼主 |
发表于 2013-2-25 17:10:54
|
显示全部楼层
本帖最后由 fengxin32 于 2013-2-25 17:14 编辑
#define CB (1<<2)
#define CS (1)
#define EOTD (1)
#define CTM (1<<2)
#define TEM (1<<3)
#define SAHE (1<<12)
#define SAHTS2 (1<<14)
#define SAHTS4 (1<<15)
#define BWC2 (1<<21)
#define BWC4 (1<<22)
#define BWC8 (3<<21)
#define PCICM (1<<15) /* PCI和DMA共用时钟 */
unsigned short TSA=0x1234,TSB=0x5678,TSC=0x9abc; /*测试用源数据*/
unsigned short TDA[512],TDB[512],TDC[512],TDD[64];
volatile UINT64 Descriptor[48]; /*描述符放在这里*/
volatile DMA_CHA* pDmaChain;
volatile unsigned char DmaChainCount = 0; /* 指向链上第几个段描述符 */
uint32 BS(uint32 reg) /* byte-swap */
{
uint32 Big,*p;
uint8 byte[4];
byte[0] = reg;
byte[1] = reg>>8;
byte[2] = reg>>16;
byte[3] = reg>>24;
p = (uint32*)byte;
Big = *p;
return (Big);
}
void DMAClockInit()
{
uint32* p = (uint32*)Descriptor;
uint32 t32;
Reg(SCCR,CCR) = Reg(SCCR,CCR)|PCICM;
taskDelay(50);
while(1) /*变成8字对齐*/
{
t32 = (uint32)p;
if ((t32%32)==0)
{
pDmaChain = (DMA_CHA*)p;
break;
}
p++;
}
}
/* 链模式 ,填充描述符*/
unsigned char DMAChainFill(uint32* pSour,uint32* pDesc,unsigned int num)
{
volatile unsigned int reg = 0;
DMA_CHA* p;
UINT64 Temp;
p = (DMA_CHA*)pDmaChain;
p = p + DmaChainCount;
Temp = BS((UINT32)pSour);
p->Sour = Temp<<32;
Temp = BS((UINT32)pDesc);
p->Desc = Temp<<32;
Temp = (UINT64)BS((uint32)(p+1));
p->NDA = Temp<<32;
Temp = BS(num);
p->Num = Temp<<32;
DmaChainCount = DmaChainCount + 1;
}
unsigned char DMAChaining(uint32 DMAchan,uint32 Mode) /* 链式DMA初始化 */
{
volatile unsigned int reg = 0;
DMA_CHA* p = (DMA_CHA*)pDmaChain;
uint32* p32;
uint32 i,n;
UINT64 Temp = 0;
while (Reg(SR,DMAchan)!=0)
{
DmaChainCount = 0;
return (ERROR);
}
p = p + DmaChainCount - 1;
p->NDA = (BS(EOTD));
reg = ((uint32)pDmaChain);
Reg(CDAR,DMAchan) = BS(reg);
reg = BS(SAHTS2|SAHE);
Reg(MR,DMAchan) = reg&0xf8ffffff;
reg = BS(SAHTS2|SAHE|CS);
Reg(MR,DMAchan) = reg;
return (OK);
}
void DmaChainTest()/*测试函数*/
{
volatile unsigned int reg=0,Num=0;
unsigned char i,n;
DMA_CHA* p = (DMA_CHA*)pDmaChain;
uint32* p32 = (uint32*)pDmaChain;
DMAChainFill((uint32*)&TSA,(uint32*)TDA,512);
DMAChainFill((uint32*)&TSA,(uint32*)TDB,512);
DMAChainFill((uint32*)&TSA,(uint32*)TDC,512);
DMAChaining(DMA1,0);
}
|
|