Sdio Dump Memory
Sdio Dump Memory
h"
#include "evalsoc.h"
#include "system_arcs.h"
#include <stdio.h>
unsigned int desc_start_addr;
int main(void) {
unsigned int rdata ;
char data_tmp[16];
unsigned int data_addr,data_start_addr ;
unsigned int auto_cmd12_en ;
unsigned int blk_cnt_en ;
unsigned int dma_en,i ;
#ifdef SDIO_PINMUX1
iocfg = 1;
#else
#ifdef SDIO_PINMUX2
iocfg = 2;
#else
#ifdef SDIO_PINMUX3
iocfg = 3;
#else
#ifdef SDIO_PINMUX4
iocfg = 4;
#else
#ifdef SDIO_PINMUX5
iocfg = 5;
#else
#ifdef SDIO_PINMUX6
iocfg = 6;
#else
iocfg = 1;
#endif //SDIO_PINMUX6
#endif //SDIO_PINMUX5
#endif //SDIO_PINMUX4
#endif //SDIO_PINMUX3
#endif //SDIO_PINMUX2
#endif //SDIO_PINMUX1
sdio_common(iocfg);
CMN_SYS_NDFT->REG_SYSPLL_CFG.bit.SYSPLL_ENABLE = 0x1;
CMN_SYS_NDFT->REG_PERI_CLK_CFG4.bit.ENA_SMID_CLK =0x1; // enable sdiod
ECLIC_EnableIRQ(SDIOH_IRQn);
ECLIC_EnableIRQ(SDIOD_IRQn);
print("Hello, I am CoreA!\n");
//Initial memory
desc_start_addr = DATA_BASE+0x100;
data_start_addr = DATA_BASE+0x1b00;
/**************************************************************************/
/*****************************CONFIG FLOW**********************************/
/**************************************************************************/
//config sdio device
SDIOD->REG_SMID_CARD_RDY.bit.FUNCTION1_READY = 0x1; //enable io1
SDIOD->REG_SMID_CARD_RDY.bit.FUNCTION2_READY = 0x1; //enable io2
//SDIOD->REG_SMID_CTRL2_REG.bit.ADMA_ENABL_E = 0x1; //enable adma
SDIOD->REG_SMID_INT_STAT_EN.all = 0x0;
SDIOD->REG_SMID_INT_SIG_EN.all = 0x0;
SDIOD->REG_SMID_INT_STAT_EN2.all =0x0;
SDIOD->REG_SMID_INT_SIG_EN2.all =0x0;
for(i=0 ;i<4096;i++) {
//write_mem(data_start_addr+i*4,0x00683219+(i<<24));
write_mem8(data_start_addr+i,0x30+i%10);
}
//---- Determine the SD Data width, Data FIFO type and Size fifo_size=128Word
----//
print("Determine the SD Data Width\n");
rdata = SDIOH->REG_HWA.bit.HW_CONFIG;
if ((rdata & 0x80) == 0) {
print(" Use 4 bits SD Data Width\n");
//---- Change Bus Width ----//
SDIOH->REG_HC1_PCR_BGCR.bit.DATA_WIDTH = 0x1; // Set bus width to 4bit and high
speed enable
SDIOH->REG_HC1_PCR_BGCR.bit.HI_SPEED = 0x1;
rdata = SDIOH->REG_RESP0.all ;
printf("CMD5 response=0x%x\n",rdata);
SDIOH->REG_ARG1.all = 0x0;
SDIOH->REG_TMR_CR.all = 0x03120000; // CMD3 issue get rca
__WFI();
rdata = SDIOH->REG_RESP0.all ;
printf("CMD3 response=0x%x\n",rdata);
SDIOH->REG_ARG1.all = rdata; // It's device rca addr
SDIOH->REG_TMR_CR.all = 0x07120000; // CMD7 issue
__WFI();
SDIOH->REG_ARG1.all = 0x800004fe;
SDIOH->REG_TMR_CR.all = 0x341a0000; // CMD52 issue enable SDIO I/O
__WFI();
//**********************************************************//
//****************WRITE SDMA ADDR TO DEVICE*****************//
//**********************************************************//
//DSR[4] sdio_debug_adma_en
//DSR[3] sdio_debug_sdma_en
//DSR[2] dbg_dma_valid
//DSR[1] sdio_debug_program done
//DSR[0] sdio_debug_mode
rdata = SDIOH->REG_PSR.all;
while((rdata & 0x3) != 0x0) {
rdata = SDIOH->REG_PSR.all;
}
for (i=0;i<4096;i=i+1) {
rdata = read_mem8(data_start_addr+0x1000 + i);
if(rdata != (0x30+i%10)) {
printf("ERROR: i=%0d, rdata=0x%0x, exp=0x%x\n",i,rdata,(0x30+(i%10)));
c_fail();
} else {
//printf("rdata[%0x]=0x%0x\n",k*32+i,rdata);
}
}
c_pass();
return 0;
}
//Interrupt Handler
__INTERRUPT void eclic_sdioh_int_handler (void) {
unsigned int rdata ;
rdata = SDIOH->REG_NISR_EISR.all;
printf("aaaaaaaaaaaaaaaaaaaaaa SDIO Intr = 0x%x\n", rdata);
if((rdata & 0x1)== 0x1) {
print("CMD Done\n");
SDIOH->REG_NISR_EISR.all = 0x1; // Clear cmd complete interrupt
}
if((rdata & 0x2)== 0x2) {
print("Tran complete\n");
SDIOH->REG_NISR_EISR.all = 0x2; // Clear transfer complete interrupt
}
if((rdata & 0x100)== 0x100) {
print("Tran complete 100 \n");
SDIOH->REG_NISER_EISER.bit.CARD_INT_ST_EN = 0x0; // Clear transfer complete
interrupt
}
}
}
if((rdata & 0x00000010)== 0x00000010) {
print("A read operation is coming \n");
SDIOD->REG_SMID_INT_STAT.bit.READ_START_INTERRUPT = 0x1;
//config DMA reg
SDIOD->REG_SMID_DMA1_CTRL.bit.DMA1_BUFFER_SIZE = 0x80;
SDIOD->REG_SMID_DMA1_ADDR.all = DATA_BASE;
SDIOD->REG_SMID_DMA1_CTRL.bit.DMA1_ADDRESS_VALID = 0x1;
}
if((rdata & 0x00000001)== 0x00000001) {
print("A trans completed\n");
SDIOD->REG_SMID_INT_STAT.bit.TRANSFER_COMPLETE_INTERRUPT = 0x1;
SDIOD->REG_SMID_CONTROL_REG.bit.PROGRAM_DONE = 0x1;
}
}
SDIOH->REG_BSR_BCR.bit.BLK_SIZE_R = 0x4;
SDIOH->REG_BSR_BCR.bit.BLK_CNT_R = 0x1; //1 block
//**************CONFIG sdio device DMA/ADMA addr*********//
//Argument[7:0] are data to regs FN2 reg0 use for dma addr
arg = (dma_addr & 0xFF) + 0xa0024000;
printf("arg = 0x%x\n", arg);
SDIOH->REG_ARG1.all = arg; //write data to device fn regs
SDIOH->REG_TMR_CR.all = 0x341a0000; // CMD52 issue
__WFI();
arg = ((dma_addr >>8) & 0xFF) + 0xa0024200;
printf("arg = 0x%x\n", arg);
SDIOH->REG_ARG1.all = arg; //write data to device fn regs
SDIOH->REG_TMR_CR.all = 0x341a0000; // CMD52 issue
__WFI();
write_ready = SDIOH->REG_NISR_EISR.bit.BUF_W_RDY_R;
while(write_ready == 0) {
write_ready = SDIOH->REG_NISR_EISR.bit.BUF_W_RDY_R;
}
SDIOH->REG_NISR_EISR.bit.BUF_W_RDY_R = 1;
SDIOH->REG_BDP.all = dma_data;