Example #1
0
/* 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;
}
Example #2
0
File: sd_boot.c Project: ykli/misc
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);
	}
}