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