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.

SDMA transfer from NAND flash in AM3517

Hi,

I would like to know how to do sDMA trasfer from NAND flash.

The below is a source code of sDMA of my customer.

---------------

static void dma_read(UCHAR* dst_addr, ULONG len)

{
unsigned int sdmaChNum=10;
ULONG* pd = (ULONG*)dst_addr;
ULONG src = BSP_NAND_REGS_PA+0x01F0;
ULONG dst = OALVAtoPA(dst_addr);

PutTextLn("DMA start");

CacheDataInvalidateBuff(dst_addr, len);

/* CSDP */
sdmaRegs->CH[sdmaChNum].CSDP
= CSL_FMKT(SDMA_CSDP_SRC_ENDIAN,LITTLEENDIAN) /* LITTLEENDIAN,BIGENDIAN */
| CSL_FMK (SDMA_CSDP_SRC_ENDIAN_LOCK,0) /* ?? */
| CSL_FMKT(SDMA_CSDP_DST_ENDIAN,LITTLEENDIAN) /* LITTLEENDIAN,BIGENDIAN */
| CSL_FMK (SDMA_CSDP_DST_ENDIAN_LOCK,0) /* ?? */
| CSL_FMK (SDMA_CSDP_WRITE_MODE,0)
| CSL_FMKT(SDMA_CSDP_DST_BURST,1BYTE) /* 1BYTE,16BYTE,32BYTE,64BYTE */
| CSL_FMKT(SDMA_CSDP_DST_PACKED,NONPACKED) /* NONPACKED,PACKED */
| CSL_FMKT(SDMA_CSDP_SRC_BURST,1BYTE)
| CSL_FMKT(SDMA_CSDP_SRC_PACKED,NONPACKED) /* NONPACKED,PACKED */
| CSL_FMKT(SDMA_CSDP_DATA_TYPE,16BIT); /* 8BIT,16BIT,32BIT */

/* CEN : Element per Frame (24bit) */
len /= 2;
sdmaRegs->CH[sdmaChNum].CEN = len;

/* CFN : Frame per Block (16bit) */
sdmaRegs->CH[sdmaChNum].CFN = 1;

/* Src and Dst */
sdmaRegs->CH[sdmaChNum].CSSA = src;
sdmaRegs->CH[sdmaChNum].CDSA = dst;

/* CCR */
sdmaRegs->CH[sdmaChNum].CCR
= CSL_FMKT(SDMA_CCR_WRITE_PRIORITY, HIGH) /* LOW,HIGH */
| CSL_FMKT(SDMA_CCR_BUFFERING, DISABLE) /* ENABLE,DISABLE */
| CSL_FMK (SDMA_CCR_SEL_SRC_DST_SYNC, 1)
| CSL_FMKT(SDMA_CCR_PREFETCH, DISABLE) /* DISABLE,ENABLE */
| CSL_FMKT(SDMA_CCR_SUPERVISOR, DISABLE) /* DISABLE,ENABLE */
| CSL_FMKT(SDMA_CCR_SECURE, DISABLE) /* DISABLE,ENABLE */
| CSL_FMK (SDMA_CCR_SYNCHRO_CONTROL_UPPER ,0)
| CSL_FMK (SDMA_CCR_BS, 0)
| CSL_FMKT(SDMA_CCR_TRANSPARENT_COPY, DISABLE) /* DISABLE,ENABLE */
| CSL_FMKT(SDMA_CCR_CONST_FILL, DISABLE) /* DISABLE,ENABLE */
| CSL_FMK (SDMA_CCR_DST_AMODE, 1) /* 0::CONST,1:POST_INC,2:SingleIndex,3:DblIndex */
| CSL_FMK (SDMA_CCR_SRC_AMODE, 0) /* 0::CONST,1:POST_INC,2:SingleIndex,3:DblIndex */
| CSL_FMKT(SDMA_CCR_WR_ACTIVE, INACTIVE) /* INACTIVE,ACTIVE */
| CSL_FMKT(SDMA_CCR_RD_ACTIVE, INACTIVE) /* INACTIVE,ACTIVE */
| CSL_FMK (SDMA_CCR_SUSPEND_SENSITIVE, 0)
| CSL_FMKT(SDMA_CCR_CHANNEL, DISABLE) /* DISABLE,ENABLE */
| CSL_FMKT(SDMA_CCR_READ_PRIORITY, HIGH) /* LOW,HIGH */
| CSL_FMK (SDMA_CCR_FS, 0)
| CSL_FMK (SDMA_CCR_SYNCHRO_CONTROL, 0);


/* INDEX */
sdmaRegs->CH[sdmaChNum].CSEI = 1; /* Source Element Index */
sdmaRegs->CH[sdmaChNum].CSFI = 1; /* Source Frame Index */
sdmaRegs->CH[sdmaChNum].CDEI = 1; /* Dst Element Index */
sdmaRegs->CH[sdmaChNum].CDFI = 1; /* Dst Frame Index */

sdmaRegs->CH[sdmaChNum].CICR = 0x0FFF; /* Interrupt Ebable */

/* START DMA */
CSL_FINST( sdmaRegs->CH[sdmaChNum].CCR, SDMA_CCR_CHANNEL, ENABLE);

while( (sdmaRegs->CH[sdmaChNum].CSR & 0x28) == 0 ) {}

PutTextLn("DMA end");
}

------------

I checked the above source code based on "SDMA Basic Programming Model". But I could not find any issue.

Customer said me. This code works and transfer is completed. But the data of memory is not changed.

Could you find something wrong in the above source code?

Also I  posted the  dump list of DMA register.

CCR:    0x07004040

    CICR:    0x00000FBE

    CSR:    0X0000003C

    CSDR:    0X00000001

    CEN:    0X00000100

    CFN:    0X00000001

    CSSA:    0X060001F0

    CDSA:    0X8FE50AA0

    CSEI:    0X00000001

    CSFI:    0X00000001

    CDEI:    0X00000001

    CDFI:    0X00000001

    CSAC:    0X000001F0

    CDAC:    0X8FE50CA0

    CCEN:    0X00000100

    CCFN:    0X00000000

I appreciate your quick reply.

Best regards,

Michi