/* init mmc/sd card we assume that the card is in the slot */ static int mmc_init(unsigned int msc_clkrt_val) { int retries, ret; u8 *resp; //unsigned int msc_clk_div = (__cpm_get_pllout())/24000000; __msc_reset(); mmc_init_gpio(); REG_MSC_IMASK = 0xffff; REG_MSC_IREG = 0xffff; REG_MSC_CLKRT = 6; //200k /* just for reading and writing, suddenly it was reset, and the power of sd card was not broken off */ resp = mmc_cmd(12, 0, 0x41, MSC_CMDAT_RESPONSE_R1); /* reset */ resp = mmc_cmd(0, 0, 0x80, 0); resp = mmc_cmd(8, 0x1aa, 0x1, MSC_CMDAT_RESPONSE_R1); resp = mmc_cmd(55, 0, 0x1, MSC_CMDAT_RESPONSE_R1); if(resp[5] == 0x37) { resp = mmc_cmd(41, 0x40ff8000, 0x3, MSC_CMDAT_RESPONSE_R3); if(resp[5] == 0x3f) ret = sd_init(msc_clkrt_val); return ret; } ret = mmc_found(msc_clkrt_val); return ret; }
int sd_boot(num) { u8 *resp; u32 ret = 0; u32 clk_set = 0, clkrt = 0; DBG("sd_boot\n"); current_boot = SD_BOOT; ctl_num = num; if (ctl_num == 1) REG_CPM_CLKGR &= ~(1 << 11); sd_init(); clk_set = jz_extal / 2; while (200000 < clk_set) { clkrt++; clk_set >>= 1; } if (clkrt > 7) { clkrt = 7; } REG_MSC_CLKRT(ctl_num) = clkrt; REG_MSC_LPM(ctl_num) = 1; /* cmd12 reset when we reading or writing from the card, send this cmd */ resp = mmc_cmd(12, 0, 0x41, MSC_CMDAT_RESPONSE_R1); resp = mmc_cmd(0, 0, 0x80, MSC_CMDAT_RESPONSE_NONE); resp = mmc_cmd(8, 0x1aa, 0x1, MSC_CMDAT_RESPONSE_R1); resp = mmc_cmd(55, 0, 0x1, MSC_CMDAT_RESPONSE_R1); if (resp[0] & 0x20){ if (resp[5] == 0x37){ resp = mmc_cmd(41, 0x40ff8000, 0x3, MSC_CMDAT_RESPONSE_R3); if (resp[5] == 0x3f) ret = sd_found(); else ret = mmc_found(); } else { ret = mmc_found(); } } else { ret = mmc_found(); } if (ret) return error_handler(current_boot); ret = mmc_block_read(SPL_SIZE + redundancy_size, (u32 *)start_addr); //SDRAM ADDR if(!ret) { if (!(REG32(start_addr) == 0x4d53504c)) { if (ctl_num == 0) return sd_boot(1); if (ctl_num == 1) return usb_boot(); } else { return xfer_d2i(start_addr + jump_offset, SPL_SIZE); } } else { return error_handler(current_boot); } }