📄 cfidedma.c
字号:
#include <stdio.h>
//#include "cfIdefuncs.h"
#include "cfIdedma.h"
void SetDMA( DWORD ifread , DWORD from , DWORD to , DWORD size )
{
volatile PDMAC_REGS pDMACRegs = (PDMAC_REGS)DMAC_BASE;
volatile PDMAC_CHANNEL_REGS pDMACChannelRegs;
DWORD config = 0;
#if (ifread==0)
{
pDMACChannelRegs->DMACCxConfiguration = 0;
pDMACChannelRegs->DMACCxControl = 0;
pDMACChannelRegs->DMACCxSrcAddr = 0;
pDMACChannelRegs->DMACCxDestAddr = 0;
}
#endif
pDMACRegs->DMACConfiguration = (DWORD)DMAC_CONFIG_E; // Enable the DMA controller
pDMACChannelRegs = (PDMAC_CHANNEL_REGS)&pDMACRegs->DMACC0SrcAddr;
pDMACChannelRegs->DMACCxConfiguration &= ~(DWORD)DMAC_CHCONFIG_E;
while (pDMACChannelRegs->DMACCxConfiguration & (DWORD)DMAC_CHCONFIG_E);
pDMACChannelRegs->DMACCxControl = 0;
pDMACChannelRegs->DMACCxControl = (TRANSFER_WIDTH_WORD<< DMAC_SWIDTH_SHIFT) +
(TRANSFER_WIDTH_WORD<< DMAC_DWIDTH_SHIFT) +
(BURST_SIZE_32 << DMAC_SBSIZE_SHIFT) +
(BURST_SIZE_32 << DMAC_DBSIZE_SHIFT);
config = (11 << DMAC_SPER_SHIFT) + (12 << DMAC_DPER_SHIFT);
if( ifread )
{
pDMACChannelRegs->DMACCxControl |= DMAC_CTRL_D + DMAC_CTRL_DI;
config |= FLOW_PER_MEM_DMAC << DMAC_FLOW_SHIFT;
}
else
{
pDMACChannelRegs->DMACCxControl |= DMAC_CTRL_S + DMAC_CTRL_SI;
config |= FLOW_MEM_PER_DMAC << DMAC_FLOW_SHIFT;
}
pDMACChannelRegs->DMACCxControl |= (size) / 2;
pDMACChannelRegs->DMACCxSrcAddr = from;
pDMACChannelRegs->DMACCxDestAddr = to;
pDMACChannelRegs->DMACCxLLI = 0;
pDMACChannelRegs->DMACCxConfiguration = config;
pDMACChannelRegs->DMACCxConfiguration |= (DWORD)DMAC_CHCONFIG_E;
// printf(" the DMACCxConfiguration is 0x%x\n",pDMACChannelRegs->DMACCxConfiguration);
}
int WaitDMA()
{
int loop = 10000;
volatile PDMAC_REGS pDMACRegs = (PDMAC_REGS)DMAC_BASE;
volatile PDMAC_CHANNEL_REGS pDMACChannelRegs = (PDMAC_CHANNEL_REGS)&pDMACRegs->DMACC0SrcAddr;
while ( (pDMACChannelRegs->DMACCxConfiguration & (DWORD)DMAC_CHCONFIG_E) && --loop )
{
hw_delay(1);
//printf(" the DMACCxConfiguration is( wait DMA) 0x%x\n",pDMACChannelRegs->DMACCxConfiguration);
}
if (loop == 0)
{
pDMACChannelRegs->DMACCxConfiguration = 0;
pDMACChannelRegs->DMACCxControl = 0;
pDMACChannelRegs->DMACCxSrcAddr = 0;
pDMACChannelRegs->DMACCxDestAddr = 0;
printf("*ERROR* - IDE DMA cant finished!\r\n");
return 0;
}
pDMACChannelRegs->DMACCxConfiguration &= ~(DWORD)DMAC_CHCONFIG_E;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -