This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CSL/EDMA3 symbols not found by linker (no longer available?)

Hello,

I try to use the EDMA3 module of the chip support library in my SYS/BIOS application targetted at the C6678, however I experience the same problem as this fellow: http://e2e.ti.com/support/embedded/bios/f/355/t/107686.aspx

Even although I select MCSDK and MCSDK-PDK, the linker complains the EDMA3 symbols can't be resolved:

 CSL_edma3Init ./main.obj      
 CSL_edma3Open ./main.obj     

Is the EDMA3 module no longer included by default, or is it a configuration error? I know about the EDMA3 low level driver, however I would prefer using the CSL for this specific task.

Thank you in advance, Clemens

  • This sounds like a library link order issue.

    In your CCS project's Build Settings, please add an 'XDCOPTIONS' environment variable with the value 'v' (for verbose).

    Then rebuild and post the console output generated during the build process.

    Also, please post the contents of the generated configPkg/linker.cmd file. This file will be in your project's 'Debug' or 'Release' directory.

    Alan

  • Thanks to a collegague I found the problem - I had to manually add the following line to the .cfg-file:

    var Csl = xdc.loadPackage('ti.csl');

    What I wonder: Is the CSL deprecated for C66xx? <desperate-mode>I am having a really hard time finding up-to-date documentation - and yet CSL seems to be the only useable way to get access to the DMA. The Low-Level-Driver seems to require hundres of lines of initialization code hidden in some dubios sample files, whereas ACPY3 is deprecated and its successor ECPY is completly undocumented - and both rely on complex and configuration-intensive frameworks (framework components, codec engine, ires, dman, ...). Is there no way to get easy access to the QDMA feature, without a few hundred lines of code initialization code or app-server like application frameworks?</desperate-mode>

    I gave CSL a try now - trying to use QDMA, however as expected it didn't work:

      CSL_Edma3Context            context;
        CSL_Status                  status;
        CSL_Edma3ChannelAttr          chAttr;
        CSL_Edma3HwQdmaChannelSetup qdmahwSetup[8];
        CSL_Edma3HwDmaChannelSetup dmahwSetup[64];
        CSL_Edma3HwSetup setup;
        CSL_Edma3ParamHandle hParam;
        CSL_Edma3ParamSetup paramSetup;
        CSL_Edma3ChannelErr chErr;

        unsigned int index, u32val=0;

        /* Module initialization */
        status = CSL_edma3Init(&context);
        assert(CSL_SOK == status);

        /* Edma module open */
        dmaHandle = CSL_edma3Open(&edmaObj, CSL_EDMA3_0, NULL, &status);
        assert(CSL_SOK == status);

        for (index = 0; index < 64; index++) {
            dmahwSetup[index].que = index & 7;
            dmahwSetup[index].paramNum = u32val;
            u32val += 7;
        }
        for (index = 0; index < 8; index++) {
            qdmahwSetup[index].que = index & 7;
            qdmahwSetup[index].paramNum = u32val;
            qdmahwSetup[index].triggerWord = 7;
            u32val += 7;
        }
        setup.dmaChaSetup = dmahwSetup;
        setup.qdmaChaSetup = qdmahwSetup;
        status = CSL_edma3HwSetup(dmaHandle, &setup);
        assert(CSL_SOK == status);


        chAttr.regionNum = CSL_EDMA3_REGION_GLOBAL;
        chAttr.chaNum = EDMACHAN0;
        hChannel0 = CSL_edma3ChannelOpen(&chObj0, CSL_EDMA3_0, &chAttr, &status);
        assert(CSL_SOK == status);

        hParam = CSL_edma3GetParamHandle(hChannel0, 0, &status);
        assert(CSL_SOK == status && hParam != NULL);

        status = CSL_edma3HwChannelControl(hChannel0, CSL_EDMA3_CMD_CHANNEL_CLEAR , NULL);
        assert(CSL_SOK == status);

        status = CSL_edma3HwChannelControl(hChannel0, CSL_EDMA3_CMD_CHANNEL_CLEARERR, &chErr);
        assert(CSL_SOK == status);

        status = CSL_edma3HwChannelControl(hChannel0, CSL_EDMA3_CMD_CHANNEL_ENABLE, NULL);
        assert(CSL_SOK == status);

         //Do the DMA transfer


        unsigned char* l2MemAddr = ((unsigned char*) &l2Values[0]) + 0x10000000;
        unsigned int* ddr3Addr = (unsigned int*) 0x80000200;

        Cache_wbInvAll();

        paramSetup.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);
        paramSetup.srcAddr = (Uint32) ddr3Addr;
        paramSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(32,1);
        paramSetup.dstAddr = (UInt32) l2MemAddr;
        paramSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(1,1);
        paramSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE(CSL_EDMA3_LINK_NULL,0);
        paramSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,1);
        paramSetup.cCnt = 1;
        status = CSL_edma3ParamSetup(hParam, &paramSetup);
        assert(CSL_SOK == status);

    The transfer doesn't seem to start at all - although the trigger word is set to 7.

    Because of the lack of useful samples I would really appriciate any hints.

    Thank you in advance, Clemens

    PS: The "EDMA3 Driver" mentioned in spraan4a seems to have a sane interface - is it still maintained and available for C66xx?