unsigned char omap_mmc_read_sect(unsigned int start_sec, unsigned int num_bytes, mmc_controller_data *mmc_cont_cur, mmc_card_data *mmc_c, unsigned int *output_buf) { unsigned char err; unsigned int argument; unsigned int resp[4]; unsigned int num_sec_val = (num_bytes + (MMCSD_SECTOR_SIZE - 1)) / MMCSD_SECTOR_SIZE; unsigned int sec_inc_val; if (num_sec_val == 0) { printf("mmc read: Invalid size\n"); return 1; } if (mmc_c->mode == SECTOR_MODE) { argument = start_sec; sec_inc_val = 1; } else { argument = start_sec * MMCSD_SECTOR_SIZE; sec_inc_val = MMCSD_SECTOR_SIZE; } while (num_sec_val) { err = mmc_send_cmd(mmc_cont_cur->base, MMC_CMD17, argument, resp); if (err != 1) { printf("mmc read cmd sector 0x%x error 0x%x\n",argument, mmc_stat_last); printf("OMAP_HSMMC_SYSCTL(mmc_cont_cur->base)= 0x%x\n",OMAP_HSMMC_SYSCTL(mmc_cont_cur->base)); printf("OMAP_HSMMC_CAPA(mmc_cont_cur->base) = 0x%x\n", OMAP_HSMMC_CAPA(mmc_cont_cur->base)); return err; } err = mmc_read_data(mmc_cont_cur->base, output_buf); if (err != 1) { printf("mmc read data sector 0x%x error 0x%x\n",argument, mmc_stat_last); printf("OMAP_HSMMC_SYSCTL(mmc_cont_cur->base)= 0x%x\n",OMAP_HSMMC_SYSCTL(mmc_cont_cur->base)); printf("OMAP_HSMMC_CAPA(mmc_cont_cur->base) = 0x%x\n", OMAP_HSMMC_CAPA(mmc_cont_cur->base)); return err; } output_buf += (MMCSD_SECTOR_SIZE / 4); argument += sec_inc_val; num_sec_val--; } return 1; }
unsigned char mmc_init_setup(mmc_controller_data *mmc_cont_cur) { unsigned int reg_val; mmc_board_init(mmc_cont_cur); OMAP_HSMMC_SYSCONFIG(mmc_cont_cur->base) |= MMC_SOFTRESET; while (1) { if ((OMAP_HSMMC_SYSSTATUS(mmc_cont_cur->base) & RESETDONE) != 0) break; } OMAP_HSMMC_SYSCTL(mmc_cont_cur->base) |= SOFTRESETALL; while ((OMAP_HSMMC_SYSCTL(mmc_cont_cur->base) & SOFTRESETALL) != 0x0) ; OMAP_HSMMC_HCTL(mmc_cont_cur->base) = DTW_1_BITMODE | SDBP_PWROFF | SDVS_3V0; OMAP_HSMMC_CAPA(mmc_cont_cur->base) |= VS30_3V0SUP | VS18_1V8SUP; reg_val = OMAP_HSMMC_CON(mmc_cont_cur->base) & RESERVED_MASK; OMAP_HSMMC_CON(mmc_cont_cur->base) = CTPL_MMC_SD | reg_val | WPP_ACTIVEHIGH | CDP_ACTIVEHIGH | MIT_CTO | DW8_1_4BITMODE | MODE_FUNC | STR_BLOCK | HR_NOHOSTRESP | INIT_NOINIT | NOOPENDRAIN; mmc_clock_config(mmc_cont_cur, CLK_INITSEQ, 0); OMAP_HSMMC_HCTL(mmc_cont_cur->base) |= SDBP_PWRON; OMAP_HSMMC_IE(mmc_cont_cur->base) = OMAP_HSMMC_STATUS_REQ; mmc_init_stream(mmc_cont_cur); return 1; }