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); }
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); }
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; }
/* 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; }
/*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); }
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; }