Are there any examples using the CSL to setup and use the EDMA3 to setup a peripheral (like SPI, TWI, or UART) on a keystone multicore device? I currently have tried setting it up for the 6670, but am not quite sure what is wrong.
CSL_Edma3Handle hModule;
CSL_Edma3ParamHandle paramHandle0;
CSL_Edma3ParamHandle paramHandle1;
CSL_Edma3ChannelAttr chParam;
CSL_Edma3ChannelObj ChObj0,ChObj1;
CSL_Edma3ChannelHandle hChannel0,hChannel1;
CSL_Edma3HwDmaChannelSetup chSetup;
CSL_Edma3ParamSetup paramSetup;
CSL_Edma3Obj moduleObj;
CSL_Edma3CmdIntr regionIntr;
CSL_Edma3ChannelErr chErrClear;
CSL_Status EdmaStat;
#define TEST_ACNT 4
#define TEST_BCNT 16
#define TEST_CCNT 1
bool ti_spi_edma_transfer(void *src, void *dest, uint32 transLen) {
int i;
// Module Initialization
CSL_edma3Init(NULL);
// Module Open
hModule = CSL_edma3Open(&moduleObj,2,NULL,&EdmaStat);
// Channel Open
chParam.regionNum = CSL_EDMA3_REGION_GLOBAL;
chSetup.que = CSL_EDMA3_QUE_0;
chParam.chaNum = CSL_TPCC2_SPIXEVT;
hChannel0 = CSL_edma3ChannelOpen(&ChObj0,
2,
&chParam,
&EdmaStat);
// Channel Setup
chSetup.paramNum = CSL_TPCC2_SPIXEVT;
CSL_edma3HwChannelSetupQue(hChannel0,chSetup.que);
CSL_edma3HwChannelSetupParam(hChannel0,chSetup.paramNum);
chParam.regionNum = CSL_EDMA3_REGION_GLOBAL;
chSetup.que = CSL_EDMA3_QUE_0;
chParam.chaNum = CSL_TPCC2_SPIREVT;
hChannel1 = CSL_edma3ChannelOpen(&ChObj1,
2,
&chParam,
&EdmaStat);
// Channel Setup
chSetup.paramNum = CSL_TPCC2_SPIREVT;
CSL_edma3HwChannelSetupQue(hChannel1,chSetup.que);
CSL_edma3HwChannelSetupParam(hChannel1,chSetup.paramNum);
// Parameter Handle Open
// Open all the handles and keep them ready
paramHandle0 = CSL_edma3GetParamHandle(hChannel0,CSL_TPCC2_SPIXEVT,NULL);
paramHandle1 = CSL_edma3GetParamHandle(hChannel1,CSL_TPCC2_SPIREVT,NULL);
paramSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(TEST_ACNT,TEST_BCNT);
paramSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(TEST_ACNT,0);
paramSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,0);
paramSetup.cCnt = TEST_CCNT;
paramSetup.option = CSL_EDMA3_OPT_MAKE(FALSE,TRUE,FALSE,TRUE,
CSL_TPCC2_SPIXEVT,
CSL_EDMA3_TCC_NORMAL,
CSL_EDMA3_FIFOWIDTH_NONE,
FALSE, CSL_EDMA3_SYNC_A,
CSL_EDMA3_ADDRMODE_INCR,
CSL_EDMA3_ADDRMODE_INCR);
paramSetup.srcAddr = (Uint32)src;
paramSetup.dstAddr = (Uint32)&(SPI_REGS->SPIDAT1);
paramSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE(CSL_EDMA3_LINK_NULL,0);
CSL_edma3ParamSetup(paramHandle0,¶mSetup);
paramSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(TEST_ACNT,TEST_BCNT);
paramSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(0,TEST_ACNT );
paramSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,0);
paramSetup.cCnt = TEST_CCNT;
paramSetup.option = CSL_EDMA3_OPT_MAKE(FALSE,TRUE,FALSE,TRUE,
CSL_TPCC2_SPIREVT,
CSL_EDMA3_TCC_NORMAL,
CSL_EDMA3_FIFOWIDTH_NONE,
FALSE, CSL_EDMA3_SYNC_A,
CSL_EDMA3_ADDRMODE_INCR,
CSL_EDMA3_ADDRMODE_INCR);
paramSetup.srcAddr = (Uint32)&(SPI_REGS->SPIBUF);
paramSetup.dstAddr = (Uint32)dest;
paramSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE(CSL_EDMA3_LINK_NULL,0);
CSL_edma3ParamSetup(paramHandle1,¶mSetup);
/* clear the EDMA error registers */
chErrClear.missed = TRUE;
chErrClear.secEvt = TRUE;
CSL_edma3HwChannelControl (hChannel0, CSL_EDMA3_CMD_CHANNEL_DISABLE, NULL);
CSL_edma3HwChannelControl (hChannel1, CSL_EDMA3_CMD_CHANNEL_DISABLE, NULL);
CSL_edma3HwChannelControl (hChannel0, CSL_EDMA3_CMD_CHANNEL_CLEARERR,
&chErrClear);
CSL_edma3HwChannelControl (hChannel1, CSL_EDMA3_CMD_CHANNEL_CLEARERR,
&chErrClear);
CSL_edma3HwChannelControl (hChannel0, CSL_EDMA3_CMD_CHANNEL_CLEAR, NULL);
CSL_edma3HwChannelControl (hChannel1, CSL_EDMA3_CMD_CHANNEL_CLEAR, NULL);
// Trigger channel
CSL_edma3HwChannelControl(hChannel0,CSL_EDMA3_CMD_CHANNEL_ENABLE,NULL);
// Trigger channel
CSL_edma3HwChannelControl(hChannel1,CSL_EDMA3_CMD_CHANNEL_ENABLE,NULL);
/* Start I2C */
SPI_REGS->SPIDAT1 |= (1 << 28); // Hold CS Line
SPI_REGS->SPIGCR1 |= (1 << 24); // SPI enable bit (should only be set to 1 when ready to enable)
// Wait for interrupt
regionIntr.region = CSL_EDMA3_REGION_GLOBAL;
regionIntr.intr = 0;
regionIntr.intrh = 0;
do{
CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,®ionIntr);
for(i=0; i < 1000; i++) asm("nop");
}while (!(regionIntr.intr & 0xC000));// channel 30 & 31
/* Stop the transmission */
SPI_REGS->SPIGCR1 &= ~(1 << 24); // SPI enable bit (should only be set to 1 when ready to enable)
SPI_REGS->SPIDAT1 &= ~(1 << 28); // Hold CS Line
/* close instance of EDMA */
CSL_edma3ChannelClose(hChannel0);
CSL_edma3ChannelClose(hChannel1);
CSL_edma3Close(hModule);
}