diff --git a/os/hal/include/hal_sdc.h b/os/hal/include/hal_sdc.h index 00da61b6da..b9eddecb43 100644 --- a/os/hal/include/hal_sdc.h +++ b/os/hal/include/hal_sdc.h @@ -198,6 +198,7 @@ extern "C" { bool sdcGetInfo(SDCDriver *sdcp, BlockDeviceInfo *bdip); bool sdcErase(SDCDriver *sdcp, uint32_t startblk, uint32_t endblk); bool _sdc_wait_for_transfer_state(SDCDriver *sdcp); + bool _sdc_wait_for_transfer_state_nocrc(SDCDriver *sdcp); #ifdef __cplusplus } #endif diff --git a/os/hal/src/hal_sdc.c b/os/hal/src/hal_sdc.c index f998b4393d..a3046bc67c 100644 --- a/os/hal/src/hal_sdc.c +++ b/os/hal/src/hal_sdc.c @@ -499,13 +499,18 @@ static bool mmc_set_bus_width(SDCDriver *sdcp) { * * @notapi */ -bool _sdc_wait_for_transfer_state(SDCDriver *sdcp) { +bool _sdc_wait_transfer_state_internal(SDCDriver *sdcp, bool crc_check) { uint32_t resp[1]; + bool cmd_fail; while (true) { - if (sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_SEND_STATUS, - sdcp->rca, resp) || - MMCSD_R1_ERROR(resp[0])) { + if (crc_check) { + cmd_fail = sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_SEND_STATUS, sdcp->rca, resp); + } else { + cmd_fail = sdc_lld_send_cmd_short(sdcp, MMCSD_CMD_SEND_STATUS, sdcp->rca, resp); + } + + if (cmd_fail || MMCSD_R1_ERROR(resp[0])) { return HAL_FAILED; } @@ -527,6 +532,14 @@ bool _sdc_wait_for_transfer_state(SDCDriver *sdcp) { } } +bool _sdc_wait_for_transfer_state(SDCDriver *sdcp) { + return _sdc_wait_transfer_state_internal(sdcp, true); +} + +bool _sdc_wait_for_transfer_state_nocrc(SDCDriver *sdcp) { + return _sdc_wait_transfer_state_internal(sdcp, false); +} + /*===========================================================================*/ /* Driver exported functions. */ /*===========================================================================*/ @@ -723,6 +736,11 @@ bool sdcConnect(SDCDriver *sdcp) { } sdc_lld_set_data_clk(sdcp, clk); + /* Not checking CRC here according to JEDEC Standard No. 84-B51 6.6.2 */ + if (HAL_SUCCESS != _sdc_wait_for_transfer_state_nocrc(sdcp)) { + goto failed; + } + /* Block length fixed at 512 bytes.*/ if (sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_SET_BLOCKLEN, MMCSD_BLOCK_SIZE, resp) ||