Beispiel #1
0
static void sd_skymedi_on_off_power(void)
{
	serial_puts("open card off on power\n");
	__gpio_as_output(mmc_power_pin);
	mmc_power_off();
	sd_mdelay(200);
	mmc_power_on();
	sd_mdelay(800);
}
Beispiel #2
0
static void sd_init(void)
{
	int retries, wait;
	u8 *resp;
	unsigned int cardaddr;
	serial_puts("SD card found!\n");

	resp = mmc_cmd(41, 0x40ff8000, 0x3, MSC_CMDAT_RESPONSE_R3);
	retries = 100;
	while (retries-- && resp && !(resp[4] & 0x80)) {
		resp = mmc_cmd(55, 0, 0x1, MSC_CMDAT_RESPONSE_R1);
		resp = mmc_cmd(41, 0x40ff8000, 0x3, MSC_CMDAT_RESPONSE_R3);
		sd_mdelay(10);
	}

	if (resp[4] & 0x80) 
		serial_puts("MMC/SD init ok\n");
	else 
		serial_puts("SD init fail\n");

	/* try to get card id */
	resp = mmc_cmd(2, 0, 0x2, MSC_CMDAT_RESPONSE_R2);
	resp = mmc_cmd(3, 0, 0x6, MSC_CMDAT_RESPONSE_R1);
	cardaddr = (resp[4] << 8) | resp[3]; 
	rca = cardaddr << 16;

	resp = mmc_cmd(9, rca, 0x2, MSC_CMDAT_RESPONSE_R2);
	highcap = (resp[14] & 0xc0) >> 6;
	REG_MSC_CLKRT = 0;
	resp = mmc_cmd(7, rca, 0x41, MSC_CMDAT_RESPONSE_R1);
	resp = mmc_cmd(55, rca, 0x1, MSC_CMDAT_RESPONSE_R1);
	resp = mmc_cmd(6, 0x2, 0x401, MSC_CMDAT_RESPONSE_R1);
}
Beispiel #3
0
static int mmc_found(unsigned int msc_clkrt_val)
{
    int retries;
    u8 *resp;
    int ocr;

    serial_puts("MMC card found!\n");
    resp = mmc_cmd(1, 0x40ff8000, 0x3, MSC_CMDAT_RESPONSE_R3);
    retries = 1000;
    while (retries-- && resp && !(resp[4] & 0x80)) {
        resp = mmc_cmd(1, 0x40300000, 0x3, MSC_CMDAT_RESPONSE_R3);
        ocr = (resp[4] << 24) | (resp[3] << 16) | (resp[2] << 8) | resp[1];
        serial_puts("  ocr = ");
        serial_put_hex(ocr);
        sd_mdelay(10);
    }

    sd_mdelay(10);

    if ((resp[4] & 0x80 )== 0x80)
        serial_puts("MMC init ok\n");
    else {
        serial_puts("MMC init fail\n");
        return -1;
    }
    if((resp[4] & 0x60 ) == 0x40)
        highcap = 1;
    else
        highcap =0;
    /* try to get card id */
    resp = mmc_cmd(2, 0, 0x2, MSC_CMDAT_RESPONSE_R2);
    serial_puts("CID=");
    serial_dump_data(resp, 15);

    resp = mmc_cmd(3, 0x10, 0x1, MSC_CMDAT_RESPONSE_R1);

    REG_MSC_CLKRT = msc_clkrt_val;	/* 16/1 MHz */
    resp = mmc_cmd(7, 0x10, 0x1, MSC_CMDAT_RESPONSE_R1);

    if(BUS_WIDTH == 2) {
        resp = mmc_cmd(6, 0x3b70101, 0x441, MSC_CMDAT_RESPONSE_R1);
    }
    else if(BUS_WIDTH == 0) {
        resp = mmc_cmd(6, 0x3b30001, 0x41, MSC_CMDAT_RESPONSE_R1);
    }
    return 0;
}
Beispiel #4
0
/* init mmc/sd card we assume that the card is in the slot */
int  mmc_init(void)
{
	int retries, wait;
	u8 *resp;

	__gpio_as_msc();
	__msc_reset();
	MMC_IRQ_MASK();	
	REG_MSC_CLKRT = 7;    //250k
	REG_MSC_RDTO = 0xffffffff;

	serial_puts("\n\nMMC/SD INIT\n");

	/* 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[0] & 0x20) && (resp[5] != 0x37)) { 
		serial_puts("MMC card found!\n");
		resp = mmc_cmd(1, 0x40ff8000, 0x3, MSC_CMDAT_RESPONSE_R3);
		retries = 100;
		while (retries-- && resp && !(resp[4] & 0x80)) {
			resp = mmc_cmd(1, 0x40300000, 0x3, MSC_CMDAT_RESPONSE_R3);
			sd_mdelay(10);
		}

		if ((resp[4] & 0x80) == 0x80) 
			serial_puts("MMC init ok\n");
		else 
			serial_puts("MMC init fail\n");
		
		if((resp[4] & 0x60) == 0x40)
			highcap = 1;
		else
			highcap = 0;
		/* try to get card id */
		resp = mmc_cmd(2, 0, 0x2, MSC_CMDAT_RESPONSE_R2);
		resp = mmc_cmd(3, 0x10, 0x1, MSC_CMDAT_RESPONSE_R1);

		REG_MSC_CLKRT = 0;	/* 16/1 MHz */
		resp = mmc_cmd(7, 0x10, 0x1, MSC_CMDAT_RESPONSE_R1);
		resp = mmc_cmd(6, 0x3b70101, 0x441, MSC_CMDAT_RESPONSE_R1);
	}
	else
		sd_init();
	return 0;
}
Beispiel #5
0
/*test power pin setting error or not */
static void sd_skymedi_off_power(void)
{
	int i;
	serial_puts("open card off  power test\n");
	__gpio_as_output(mmc_power_pin);
	//set power pin level
	if(power_off_level > 0)		
		__gpio_set_pin(mmc_power_pin);  	
	else		
		__gpio_clear_pin(mmc_power_pin);

	//去掉GPIO漏电对电影控制引脚检查的影响
	for(i=0;i<6;i++){
		__gpio_as_output(18+i);
		__gpio_clear_pin(18+i);
	}
	sd_mdelay(20);
}
Beispiel #6
0
static int sd_init(unsigned int msc_clkrt_val)
{
    int retries, wait;
//	int rca;
    u8 *resp;
    unsigned int cardaddr;
    serial_puts("SD card found!\n");
    resp = mmc_cmd(55, 0, 0x1, MSC_CMDAT_RESPONSE_R1);
    resp = mmc_cmd(41, 0x40ff8000, 0x3, MSC_CMDAT_RESPONSE_R3);
    retries = 500;
    while (retries-- && resp && !(resp[4] & 0x80)) {
        resp = mmc_cmd(55, 0, 0x1, MSC_CMDAT_RESPONSE_R1);
        resp = mmc_cmd(41, 0x40ff8000, 0x3, MSC_CMDAT_RESPONSE_R3);

        sd_mdelay(10);
    }

    if ((resp[4] & 0x80) == 0x80)
        serial_puts("SD init ok\n");
    else {
        serial_puts("SD init fail\n");
        return -1;
    }
    /* try to get card id */
    resp = mmc_cmd(2, 0, 0x2, MSC_CMDAT_RESPONSE_R2);
    serial_puts("CID=");
    serial_dump_data(resp, 15);
    resp = mmc_cmd(3, 0, 0x6, MSC_CMDAT_RESPONSE_R1);
    cardaddr = (resp[4] << 8) | resp[3];
    rca = cardaddr << 16;

    resp = mmc_cmd(9, rca, 0x2, MSC_CMDAT_RESPONSE_R2);
    highcap = (resp[14] & 0xc0) >> 6;
    REG_MSC_CLKRT = msc_clkrt_val;
    resp = mmc_cmd(7, rca, 0x41, MSC_CMDAT_RESPONSE_R1);
    resp = mmc_cmd(55, rca, 0x1, MSC_CMDAT_RESPONSE_R1);
    resp = mmc_cmd(6, BUS_WIDTH, 0x1 | (BUS_WIDTH << 9), MSC_CMDAT_RESPONSE_R1);
    return 0;
}