#include <stdio.h> #include <xdc/std.h> #include <xdc/runtime/System.h> #include <xdc/runtime/Memory.h> #include <xdc/runtime/IHeap.h> #include <xdc/runtime/Error.h> #include <ti/sysbios/Bios.h> #include <ti/sysbios/hal/Hwi.h> #include <ti/sysbios/family/c66/Cache.h> #include <ti/sysbios/knl/Task.h> #include <ti/sysbios/knl/Idle.h> #include <ti/sysbios/knl/Semaphore.h> #include <ti/csl/csl_edma3.h> #include <ti/csl/csl_edma3Aux.h> #include <ti/csl/csl_cache.h> #include <ti/csl/csl_cacheAux.h> #include "QDMAFunc.h" #include "ReadBmpImage.h" CSL_Edma3Handle hModule_QDMA; CSL_Edma3Obj edmaObj_QDMA; CSL_Edma3ParamHandle hParam1,hParam2,hParam3; CSL_Edma3ChannelObj chObj_QDMA; CSL_Edma3CmdIntr regionIntr_QDMA; CSL_Edma3ChannelHandle hChannel_QDMA; CSL_Edma3ParamSetup myParamSetup_QDMA; CSL_Edma3Context context_QDMA; CSL_Edma3ChannelAttr chAttr_QDMA; CSL_Status status_QDMA; //CSL_EDMA3_REGION_GLOBAL; //����0��ɹ���1Ϊʧ�ܡ� int QDMAInit() { /* Module initialization */ if (CSL_edma3Init(&context_QDMA) != CSL_SOK) { printf ("Error: EDMA module initialization failed\n"); return -1; } /* Module level open */ hModule_QDMA = CSL_edma3Open(&edmaObj_QDMA,DDR3InstNum,NULL,&status_QDMA); if ((hModule_QDMA == NULL) || (status_QDMA != CSL_SOK)) { printf ("Error: EDMA module open failed\n"); return -1; } /* QDMA Channel Open */ chAttr_QDMA.regionNum = CSL_EDMA3_REGION_GLOBAL; chAttr_QDMA.chaNum = Core0QDMAChannelNum; hChannel_QDMA = CSL_edma3ChannelOpen(&chObj_QDMA, DDR3InstNum, &chAttr_QDMA, &status_QDMA); if ((hChannel_QDMA == NULL) || (status_QDMA != CSL_SOK)) { printf ("Error: EDMA channel open failed\n"); return -1; } //��0~3ӳ�䵽Queue0(Ĭ��)����4~7ӳ�䵽Queue1����ֹevent��ʧ----���Ǵ���ģ� //����Event Queue�����ȼ��������������֣����4~7���¼���Զ�����ᱻ��Ӧ�����ԣ�ͳһ���䵽ijһ��Queue�ϣ� if(!DDR3InstNum) { /* For first EDMA instance there are only 2 TCs and 2 event queues * Modify the channel default queue setup from 0 to 1 */ if (CSL_edma3HwChannelSetupQue(hChannel_QDMA,CSL_EDMA3_QUE_0) != CSL_SOK) { System_printf ("Error: EDMA channel setup queue failed\n"); } } else { /* For EDMA instance 1 and 2 maximum of 4 TCs and 4 event queues are supported * Change Channel Default queue setup from 0 to 3 */ if (CSL_edma3HwChannelSetupQue(hChannel_QDMA,CSL_EDMA3_QUE_3) != CSL_SOK) { System_printf ("Error: EDMA channel setup queue failed\n"); } } /* Map QDMA Channel to the PING Param Block i.e. 1 */ CSL_edma3HwChannelSetupParam (hChannel_QDMA, Core0ParamNum1);//EDMAInitTask()EDMA���Ѿ��õ�Param 7�ˣ� //QDMA��trigger wordֻ����0~7֮�䣺0����PaRam��OPT�Ĵ�������������7����PaRam��CCNT�Ĵ����� /* Setup the trigger word for the QDMA Channel. */ CSL_edma3HwChannelSetupTriggerWord(hChannel_QDMA, CoreQDMATW); /* Parameter 1 Entry Handle */ hParam1 = CSL_edma3GetParamHandle(hChannel_QDMA, Core0ParamNum1, &status_QDMA); if (hParam1 == NULL) { printf ("Error: EDMA get handle for param entry 1 failed\n"); return -1; } /* Parameter 2 Entry Handle */ hParam2 = CSL_edma3GetParamHandle(hChannel_QDMA, Core0ParamNum2, &status_QDMA); if (hParam2 == NULL) { printf ("Error: EDMA get handle for param entry 2 failed\n"); return -1; } /* Parameter 3 Entry Handle */ hParam3 = CSL_edma3GetParamHandle(hChannel_QDMA, Core0ParamNum3, &status_QDMA); if (hParam3 == NULL) { printf ("Error: EDMA get handle for param entry 3 failed\n"); return -1; } /* Enable Channel */ if (CSL_edma3HwChannelControl(hChannel_QDMA,CSL_EDMA3_CMD_CHANNEL_ENABLE, NULL) != CSL_SOK) { printf ("Error: EDMA channel enable command failed\n"); return -1; } /* Interrupt enable (Bits 0-2) for the global region interrupts */ regionIntr_QDMA.region = CSL_EDMA3_REGION_GLOBAL; regionIntr_QDMA.intr = 0x7; regionIntr_QDMA.intrh = 0x0000; CSL_edma3HwControl(hModule_QDMA,CSL_EDMA3_CMD_INTR_ENABLE,®ionIntr_QDMA); return 0; } //����0��ɹ���1Ϊʧ�ܡ� int DataRead(float* src1,float* src2,float* src3,float* dst1,float* dst2,float* dst3) { int i,j; //QDMA��PARAM����ʱ�����Զ�����channel������EDMA���У�������Ҫ���ϲ�ѯ�� //TCC��0~31����IPR��0~32λ����ʱTCC����Ψһ������ᴥ�������ں˵��ж�/�¼��� //����TCC���·���--��0��0��1��2����1��0��1��3������������7��0��1��9�� /* Setup param entry */ myParamSetup_QDMA.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, \ CSL_EDMA3_TCCH_DIS, \ CSL_EDMA3_ITCINT_DIS, \ CSL_EDMA3_TCINT_DIS,\ 0,CSL_EDMA3_TCC_NORMAL,\ CSL_EDMA3_FIFOWIDTH_NONE, \ CSL_EDMA3_STATIC_DIS, \ CSL_EDMA3_SYNC_A, \ CSL_EDMA3_ADDRMODE_INCR, \ CSL_EDMA3_ADDRMODE_INCR); myParamSetup_QDMA.srcAddr = (Uint32)src1; myParamSetup_QDMA.aCntbCnt = CSL_EDMA3_CNT_MAKE(ImageWidth*sizeof(float),1); myParamSetup_QDMA.dstAddr = (Uint32)dst1; myParamSetup_QDMA.srcDstBidx = CSL_EDMA3_BIDX_MAKE(1,1); myParamSetup_QDMA.linkBcntrld= CSL_EDMA3_LINKBCNTRLD_MAKE(hParam2,0); myParamSetup_QDMA.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,1); myParamSetup_QDMA.cCnt = 1; /* Setup PING to operate with this PARAM Entry. */ if (CSL_edma3ParamSetup(hParam1, &myParamSetup_QDMA) != CSL_SOK) { printf ("Error: EDMA param setup failed\n"); return -1; } /* Setting up the next entry */ myParamSetup_QDMA.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, \ CSL_EDMA3_TCCH_DIS, \ CSL_EDMA3_ITCINT_DIS, \ CSL_EDMA3_TCINT_DIS,\ 1,CSL_EDMA3_TCC_NORMAL,\ CSL_EDMA3_FIFOWIDTH_NONE, \ CSL_EDMA3_STATIC_DIS, \ CSL_EDMA3_SYNC_A, \ CSL_EDMA3_ADDRMODE_INCR, \ CSL_EDMA3_ADDRMODE_INCR); myParamSetup_QDMA.srcAddr = (Uint32)src2; myParamSetup_QDMA.aCntbCnt = CSL_EDMA3_CNT_MAKE(ImageWidth*sizeof(float),1); myParamSetup_QDMA.dstAddr = (Uint32)dst2; myParamSetup_QDMA.srcDstBidx = CSL_EDMA3_BIDX_MAKE(1,1); myParamSetup_QDMA.linkBcntrld= CSL_EDMA3_LINKBCNTRLD_MAKE(hParam3,0); myParamSetup_QDMA.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,1); myParamSetup_QDMA.cCnt = 1; /* Setup for the Pong buffer */ if (CSL_edma3ParamSetup(hParam2,&myParamSetup_QDMA) != CSL_SOK) { printf ("Error: EDMA param setup failed\n"); return -1; } /* Setting up the next entry */ myParamSetup_QDMA.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, \ CSL_EDMA3_TCCH_DIS, \ CSL_EDMA3_ITCINT_DIS, \ CSL_EDMA3_TCINT_EN,\ 2,CSL_EDMA3_TCC_NORMAL,\ CSL_EDMA3_FIFOWIDTH_NONE, \ CSL_EDMA3_STATIC_EN, \ CSL_EDMA3_SYNC_A, \ CSL_EDMA3_ADDRMODE_INCR, \ CSL_EDMA3_ADDRMODE_INCR); myParamSetup_QDMA.srcAddr = (Uint32)src3; myParamSetup_QDMA.aCntbCnt = CSL_EDMA3_CNT_MAKE(ImageWidth*sizeof(float),1); myParamSetup_QDMA.dstAddr = (Uint32)dst3; myParamSetup_QDMA.srcDstBidx = CSL_EDMA3_BIDX_MAKE(1,1); myParamSetup_QDMA.linkBcntrld= CSL_EDMA3_LINKBCNTRLD_MAKE(0xffff,0); myParamSetup_QDMA.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,1); myParamSetup_QDMA.cCnt = 1; /* Setup for the Pong buffer */ if (CSL_edma3ParamSetup(hParam3,&myParamSetup_QDMA) != CSL_SOK) { printf ("Error: EDMA param setup failed\n"); return -1; } /* Trigger the word by writing to the trigger word... */ if (CSL_edma3ParamWriteWord(hParam1,CoreQDMATW,1) != CSL_SOK) { printf ("Error: EDMA param write word failed\n"); return -1; } regionIntr_QDMA.region = CSL_EDMA3_REGION_GLOBAL; regionIntr_QDMA.intr = 0; regionIntr_QDMA.intrh = 0; /* Poll IPR bit */ do { CSL_edma3GetHwStatus(hModule_QDMA,CSL_EDMA3_QUERY_INTRPEND,®ionIntr_QDMA); } while (!(regionIntr_QDMA.intr & 0x4)); /* Clear pending interrupt */ if (CSL_edma3HwControl(hModule_QDMA,CSL_EDMA3_CMD_INTRPEND_CLEAR, ®ionIntr_QDMA) != CSL_SOK) { printf ("Error: EDMA clear interrupt pend command failed\n"); return -1; } return 0; } //����0��ɹ���1Ϊʧ�ܡ� int DataWrite(float* src1,float* dst1) { int i,j; /* Setting up the next entry */ myParamSetup_QDMA.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, \ CSL_EDMA3_TCCH_DIS, \ CSL_EDMA3_ITCINT_DIS, \ CSL_EDMA3_TCINT_EN,\ 2,CSL_EDMA3_TCC_NORMAL,\ CSL_EDMA3_FIFOWIDTH_NONE, \ CSL_EDMA3_STATIC_EN, \ CSL_EDMA3_SYNC_A, \ CSL_EDMA3_ADDRMODE_INCR, \ CSL_EDMA3_ADDRMODE_INCR); myParamSetup_QDMA.srcAddr = (Uint32)src1; myParamSetup_QDMA.aCntbCnt = CSL_EDMA3_CNT_MAKE(ImageWidth*sizeof(float),1); myParamSetup_QDMA.dstAddr = (Uint32)dst1; myParamSetup_QDMA.srcDstBidx = CSL_EDMA3_BIDX_MAKE(1,1); myParamSetup_QDMA.linkBcntrld= CSL_EDMA3_LINKBCNTRLD_MAKE(0xffff,0); myParamSetup_QDMA.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,1); myParamSetup_QDMA.cCnt = 1; /* Setup for the Pong buffer */ if (CSL_edma3ParamSetup(hParam1,&myParamSetup_QDMA) != CSL_SOK) { printf ("Error: EDMA param setup failed\n"); return -1; } /* Trigger the word by writing to the trigger word... */ if (CSL_edma3ParamWriteWord(hParam1,CoreQDMATW,1) != CSL_SOK) { printf ("Error: EDMA param write word failed\n"); return -1; } regionIntr_QDMA.region = CSL_EDMA3_REGION_GLOBAL; regionIntr_QDMA.intr = 0; regionIntr_QDMA.intrh = 0; /* Poll IPR bit */ do { CSL_edma3GetHwStatus(hModule_QDMA,CSL_EDMA3_QUERY_INTRPEND,®ionIntr_QDMA); } while (!(regionIntr_QDMA.intr & 0x4)); /* Clear pending interrupt */ if (CSL_edma3HwControl(hModule_QDMA,CSL_EDMA3_CMD_INTRPEND_CLEAR, ®ionIntr_QDMA) != CSL_SOK) { printf ("Error: EDMA clear interrupt pend command failed\n"); return -1; } return 0; }
Hello,
I use QDMA to move 3 different block data from DDR3 to L1DSRAM by DataRead() and then move back to DDR3 by DataWrite() in TMS320C6678EVM. I was wondering that if a linking PaRam set can reuse because for the first time calling DataRead(),all data moved correctly from DDR3 to L1DSRAM, but when I changed the src & dst address in all the 3 PaRam sets, the first PaRam set's data correctly moved to the L1DSRAM, but others PaRam sets act as null PaRam sets because data block in L1DSRAM never changed. I calling the function pair a lot of times just as follows:
for (i=0;i<1000;i++)
{
DataRead();
...
DataWrite();
}
And, of course , it was stuck in the middle of the loop. I checked the EDMA3_CC0 registers found that bit 0 was set in the QEMR.
I disabled cache, and changed the L1DSRAM local address to global address. Only core 0 use it.
I really do not know how could this happened? Really appreciate for you help !