Hi,

 

This may not be the right place for this question, but I have exhausted
other options!

 

I am using ACPY3 to do a 2D-1D DMA transfer from DDR to L1DSRAM.

 

It is for a UYVY D1 -> greyscale QCIF resize algorithm.

 

I want to extract the Y bytes from a line of the image at a time and
write them into L1DSRAM with DMA.

 

So I have set my transfer up as follows:

 

            ACPY3_Params  dmaParams;

 

            dmaParams.transferType                        = ACPY3_2D1D;

            dmaParams.srcAddr                               =
pContext->ippSrcImage.pBytes;

            dmaParams.dstAddr                               =
pContext->pScratchBuf_0;

            dmaParams.elementSize             = 1;

            dmaParams.numElements                       = 720;
//720 Y values in a line

            dmaParams.numFrames                         = 1;

            dmaParams.srcElementIndex      = 2;

            dmaParams.dstElementIndex      = 1;

            dmaParams.srcFrameIndex                     = 0;

            dmaParams.dstFrameIndex                     = 0;

            dmaParams.waitId                                 = 0;

 

            ACPY3_activate( pContext->dmaHandle_0 );

            ACPY3_configure( pContext->dmaHandle_0, &dmaParams, 0 );

 

            // Reset busy flag

            ((IDMA3_Obj *)pContext->dmaHandle_0)->transferPending =
FALSE;

 

            // Start the transfer

            ACPY3_start( pContext->dmaHandle_0 );

 

The problem is that the ACPY3_wait function (not shown) hangs for all
values of numElements > 16.

 

My DMA channels are set up as follows:

 

Uns ALGO_dmaGetChannels( IALG_Handle handle, IDMA3_ChannelRec dmaTab[] )

{

            ALGO_Obj *pObj = (ALGO_Obj *) handle;

 

            dmaTab[0].handle                      =
pObj->pContext->dmaHandle_0;

            dmaTab[0].numTransfers           = 1;

            dmaTab[0].numWaits                 = 1;

            dmaTab[0].priority                     =
IDMA3_PRIORITY_HIGH;

            dmaTab[0].persistent     = TRUE;

            dmaTab[0].protocol                    = &ACPY3_PROTOCOL;

 

            return 1;

}

 

And my RTSC configuration for DMAN3 is:

 

var DMAN3 = xdc.useModule('ti.sdo.fc.dman3.DMAN3');

DMAN3.heapInternal                   = "L1DHEAP";

DMAN3.heapExternal                   = "DDR";

DMAN3.qdmaPaRamBase                       = 0x01C04000

DMAN3.maxPaRamEntries           = 128;

DMAN3.paRamBaseIndex     = 96;

DMAN3.numPaRamEntries    = 32;

DMAN3.maxQdmaChannels         = 8;

DMAN3.numQdmaChannels         = 8;

DMAN3.qdmaChannels               = [0,1,2,3,4,5,6,7];

DMAN3.numTccGroup[0]            = 8;

DMAN3.numPaRamGroup[0]       = 32;

DMAN3.tccAllocationMaskH = 0xffffffff;

DMAN3.tccAllocationMaskL = 0x00000000;   

DMAN3.debug                                        = true;

 

All of my buffers are allocated on a 64-byte (L1D Cache line length)
boundary.

 

I am using the DM6446 cycle accurate simulator in CCS v3.2.

 

I just can't figure out why it works for values of numElements <=16, but
fails for those above.

 

Thanks!

Ben

_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to