/* ---------------------------------------------------------------- */
/* Copyright declaration */
/* ---------------------------------------------------------------- */
/* ---------------------------------------------------------------- */
/* FileName : DSP6713_EDMA.c */
/* Writen by : Yu zheng */
/* ---------------------------------------------------------------- */
#define CHIP_6713
#include <csl.h>
#include <csl_edma.h>
#include <csl_mcbsp.h>
#include "DSP6713_EDMA.h"
#include "DSP6713_const.h"
/*********************************************************/
extern int inputbuffer_ping[];
extern int inputbuffer_pong[];
extern int outputbuffer_ping[];
extern int outputbuffer_pong[];
/* handle of PaRAM */
extern EDMA_Handle hEdma_mcbsp_rcv;
extern EDMA_Handle hEdma_ping_rcv;
extern EDMA_Handle hEdma_pong_rcv;
extern EDMA_Handle hEdma_mcbsp_xmit;
extern EDMA_Handle hEdma_ping_xmit;
extern EDMA_Handle hEdma_pong_xmit;
/*********************************************************/
/* EDMA channel and pingpong config structure */
// input
EDMA_Config MyEDMAConfigRecv;
EDMA_Config MyEDMAConfig_inputping =
{
EDMA_OPT_RMK(
EDMA_OPT_PRI_HIGH,
EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_NONE,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(13),
EDMA_OPT_LINK_YES,
EDMA_OPT_FS_NO
),
EDMA_SRC_OF(MCBSP_ADDR(DRR0)),
EDMA_CNT_RMK(0,DATA_LEN),
EDMA_DST_OF(inputbuffer_ping),
EDMA_IDX_RMK(0,0),
EDMA_RLD_RMK(0,0)
};
EDMA_Config MyEDMAConfig_inputpong =
{
EDMA_OPT_RMK(
EDMA_OPT_PRI_HIGH,
EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_NONE,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(13),
EDMA_OPT_LINK_YES,
EDMA_OPT_FS_NO
),
EDMA_SRC_OF(MCBSP_ADDR(DRR0)),
EDMA_CNT_RMK(0,DATA_LEN),
EDMA_DST_OF(inputbuffer_pong),
EDMA_IDX_RMK(0,0),
EDMA_RLD_RMK(0,0)
};
// output
EDMA_Config MyEDMAConfigXmit;
EDMA_Config MyEDMAConfig_outping =
{
EDMA_OPT_RMK(
EDMA_OPT_PRI_HIGH,
EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_INC,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_NONE,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(12),
EDMA_OPT_LINK_YES,
EDMA_OPT_FS_NO
),
EDMA_SRC_OF(outputbuffer_ping),
EDMA_CNT_RMK(0,DATA_LEN),
EDMA_DST_OF(MCBSP_ADDR(DXR0)),
EDMA_IDX_RMK(0,0),
EDMA_RLD_RMK(0,0)
};
EDMA_Config MyEDMAConfig_outpong =
{
EDMA_OPT_RMK(
EDMA_OPT_PRI_HIGH,
EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_INC,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_NONE,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(12),
EDMA_OPT_LINK_YES,
EDMA_OPT_FS_NO
),
EDMA_SRC_OF(outputbuffer_pong),
EDMA_CNT_RMK(0,DATA_LEN),
EDMA_DST_OF(MCBSP_ADDR(DXR0)),
EDMA_IDX_RMK(0,0),
EDMA_RLD_RMK(0,0)
};
/*********************************************************/
/* Set the interrupts */
void set_interrupts_edma(void)
{
IRQ_nmiEnable();
IRQ_globalEnable();
IRQ_reset(IRQ_EVT_EDMAINT);
IRQ_disable(IRQ_EVT_EDMAINT);
EDMA_intDisable(12); /* ch 12 for McBSP transmit event XEVT0 */
EDMA_intDisable(13); /* ch 13 for McBSP receive event REVT0 */
IRQ_clear(IRQ_EVT_EDMAINT);
EDMA_intClear(12);
EDMA_intClear(13);
IRQ_enable(IRQ_EVT_EDMAINT);
EDMA_intEnable(12);
EDMA_intEnable(13);
return;
} /* end of set_interrupts_edma() */
/*********************************************************/
void my_edma_start()
{
/* Enable interrupts. There is difference between CPU and EDMA service */
EDMA_clearPram(0x00000000); /* Clear PaRAM of the EDMA */
set_interrupts_edma();
// input
MyEDMAConfigRecv = MyEDMAConfig_inputping;
hEdma_mcbsp_rcv = EDMA_open(EDMA_CHA_REVT0,EDMA_OPEN_RESET);
EDMA_config(hEdma_mcbsp_rcv,&MyEDMAConfigRecv);
hEdma_pong_rcv = EDMA_allocTable(-1);
EDMA_config(hEdma_pong_rcv,&MyEDMAConfig_inputpong);
hEdma_ping_rcv = EDMA_allocTable(-1);
EDMA_config(hEdma_ping_rcv,&MyEDMAConfig_inputping);
EDMA_link(hEdma_mcbsp_rcv,hEdma_pong_rcv);
EDMA_link(hEdma_pong_rcv,hEdma_ping_rcv);
EDMA_link(hEdma_ping_rcv,hEdma_pong_rcv);
// output
MyEDMAConfigXmit = MyEDMAConfig_outping;
hEdma_mcbsp_xmit = EDMA_open(EDMA_CHA_XEVT0,EDMA_OPEN_RESET);
EDMA_config(hEdma_mcbsp_xmit,&MyEDMAConfigXmit);
hEdma_pong_xmit = EDMA_allocTable(-1);
EDMA_config(hEdma_pong_xmit,&MyEDMAConfig_outpong);
hEdma_ping_xmit = EDMA_allocTable(-1);
EDMA_config(hEdma_ping_xmit,&MyEDMAConfig_outping);
EDMA_link(hEdma_mcbsp_xmit,hEdma_pong_xmit);
EDMA_link(hEdma_pong_xmit,hEdma_ping_xmit);
EDMA_link(hEdma_ping_xmit,hEdma_pong_xmit);
/* SET EER register */
EDMA_enableChannel(hEdma_mcbsp_rcv);
EDMA_enableChannel(hEdma_mcbsp_xmit);
} /* end of my_edma_start() */
/*********************************************************/