diff --git a/os/src/drivers/sd_card/exynos5/dwmmc.h b/os/src/drivers/sd_card/exynos5/dwmmc.h index 308f3cbc23..7012c57483 100644 --- a/os/src/drivers/sd_card/exynos5/dwmmc.h +++ b/os/src/drivers/sd_card/exynos5/dwmmc.h @@ -383,16 +383,28 @@ struct Exynos5_msh_controller : private Dwmmc, Sd_card::Host_controller } Card_info card_info = _detect_mmc(); -#if 0 - /* set to eight bit transfer Bit */ - if (!setup_bus(CLK_DIV_52Mhz, _delayer)) + + /* switch frequency to high speed */ + enum { EXT_CSD_HS_TIMING = 185 }; + if (!issue_command(Mmc_switch(EXT_CSD_HS_TIMING, 1))) { + PERR("Error setting high speed frequency"); throw Detection_failed(); + } + + enum { EXT_CSD_BUS_WIDTH = 183 }; + /* set card to 8 bit */ + if (!issue_command(Mmc_switch(EXT_CSD_BUS_WIDTH, 2))) { + PERR("Error setting card bus width"); + throw Detection_failed(); + } bus_width(BUS_WIDTH_8); - /* - * TODO SD card: set bus width (on card) - 4 bit - */ -#endif + + /* set to eight bit transfer Bit */ + if (!setup_bus(CLK_DIV_52Mhz, _delayer)) { + PERR("Error setting bus to high speed"); + throw Detection_failed(); + } /* * Enable Interrupts data read timeout | data transfer done | response diff --git a/os/src/drivers/sd_card/sd_card.h b/os/src/drivers/sd_card/sd_card.h index f926545ef0..92f926fc81 100644 --- a/os/src/drivers/sd_card/sd_card.h +++ b/os/src/drivers/sd_card/sd_card.h @@ -227,6 +227,25 @@ namespace Sd_card { } }; + struct Mmc_switch : Command<6, RESPONSE_48_BIT> + { + enum { SWITCH_MODE_WRITE_BYTE = 0x3 }; + + struct Arg : Sd_card::Arg + { + struct Value : Bitfield<8, 8> { }; + struct Index : Bitfield<16, 8> { }; + struct Mode : Bitfield<24, 8> { }; + }; + + Mmc_switch(unsigned index, unsigned val) + { + Arg::Mode::set(arg, SWITCH_MODE_WRITE_BYTE); + Arg::Index::set(arg, index); + Arg::Value::set(arg, val); + } + }; + struct Sd_send_op_cond : Prefixed_command<41, RESPONSE_48_BIT> { struct Arg : Sd_card::Arg