📄 edma_c.c
字号:
#include "typedefine.h"
#include "edma_c.h"
#include "interrupt_manage.h"
#pragma DATA_SECTION(s_nEdmaChLink,".qbss");
#pragma DATA_ALIGN(s_nEdmaChLink,8);
static uint8 s_nEdmaChLink[64];
#pragma DATA_SECTION(s_nFreeEdmaChHead,".qbss");
static uint8 s_nFreeEdmaChHead;
void InitEdma()
{
int i;
uint32 *pUint;
// *** EDMA初始化 ***
// IRQ_globalDisable_user(); //kang12.19
pUint = (uint32*)EDMA_REG_BASE;
// EDMA priority queue allocation registers
pUint[_EDMA_PQAR0] = 6;
pUint[_EDMA_PQAR1] = 12;
pUint[_EDMA_PQAR2] = 12;
pUint[_EDMA_PQAR3] = 12;
// EDMA event enable registers
pUint[_EDMA_EERL] = 0;
pUint[_EDMA_EERH] = 0;
// EDMA channel interrupt enable registers
pUint[_EDMA_CIERL] = 0; //0x0000a000;
pUint[_EDMA_CIERH] = 0;
// EDMA channel chain enable registers
pUint[_EDMA_CCERL] = 0; //0xfdf00e60;
pUint[_EDMA_CCERH] = 0; //0x000e0000;
// EDMA event clear registers
pUint[_EDMA_ECRL] = 0xffffffff;
pUint[_EDMA_ECRH] = 0xffffffff;
// EDMA channel interrupt pending registers
pUint[_EDMA_CIPRL] = 0xffffffff;
pUint[_EDMA_CIPRH] = 0xffffffff;
// EDMA event enable registers
pUint[_EDMA_EERL] = 0; //0xfdf7af70;
pUint[_EDMA_EERH] = 0; //0x3f0f0e00;
//
/*
IRQ_map_user(8, 8); // 必须先将特定的event map 给某 channel 后,下面的函数才能起作用
IRQ_clear_user(8); //
IRQ_nmiEnable_user(); //kang 12.19 使能EDMA中断
IRQ_enable_user(8); //
*/
for(i=0;i<63;i++)
s_nEdmaChLink[i] = i+1;
s_nEdmaChLink[63] = 0xff;
s_nFreeEdmaChHead = 0;
}
HANDLE AllocEdma(int nEdmaNum)
{
HANDLE hFirst,hRet;
uint32 *pUint;
pUint = (uint32*)EDMA_REG_BASE;
if(nEdmaNum <= 0)
return INVALID_EDMA_HANDLE;
hFirst = s_nFreeEdmaChHead;
nEdmaNum--;
while(hFirst != 0xff && nEdmaNum != 0)
{
hFirst = s_nEdmaChLink[hFirst];
nEdmaNum--;
}
if(hFirst != 0xff && nEdmaNum == 0)
{
hRet = s_nFreeEdmaChHead;
s_nFreeEdmaChHead = s_nEdmaChLink[hFirst];
s_nEdmaChLink[hFirst] = 0xff;
hFirst = hRet;
while(hFirst != 0xff)
{
if(hFirst<32)
{
pUint[_EDMA_EERL] |= (1<<hFirst);
pUint[_EDMA_ECRL] |= (1<<hFirst);
if(hFirst != hRet)
pUint[_EDMA_CCERL] |= (1<<hFirst);
}
else
{
pUint[_EDMA_EERH] |= (1<<(hFirst-32));
pUint[_EDMA_ECRH] |= (1<<(hFirst-32));
if(hFirst != hRet)
pUint[_EDMA_CCERH] |= (1<<(hFirst-32));
}
hFirst = s_nEdmaChLink[hFirst];
}
return hRet;
}
else
{
return INVALID_EDMA_HANDLE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -