From b26704aac5dbeffe54c575c29a786879e439e72a Mon Sep 17 00:00:00 2001 From: Damien George Date: Tue, 14 Dec 2021 00:04:57 +1100 Subject: [PATCH] stm32/sdcard: Support 8-bit wide SDIO bus. Signed-off-by: Damien George --- ports/stm32/sdcard.c | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/ports/stm32/sdcard.c b/ports/stm32/sdcard.c index ea69e7285b..4e461749ac 100644 --- a/ports/stm32/sdcard.c +++ b/ports/stm32/sdcard.c @@ -60,6 +60,10 @@ #define STATIC_AF_SDCARD_D1 STATIC_AF_SDMMC2_D1 #define STATIC_AF_SDCARD_D2 STATIC_AF_SDMMC2_D2 #define STATIC_AF_SDCARD_D3 STATIC_AF_SDMMC2_D3 +#define STATIC_AF_SDCARD_D4 STATIC_AF_SDMMC2_D4 +#define STATIC_AF_SDCARD_D5 STATIC_AF_SDMMC2_D5 +#define STATIC_AF_SDCARD_D6 STATIC_AF_SDMMC2_D6 +#define STATIC_AF_SDCARD_D7 STATIC_AF_SDMMC2_D7 #else #define SDIO SDMMC1 #define SDMMC_IRQHandler SDMMC1_IRQHandler @@ -75,6 +79,10 @@ #define STATIC_AF_SDCARD_D1 STATIC_AF_SDMMC1_D1 #define STATIC_AF_SDCARD_D2 STATIC_AF_SDMMC1_D2 #define STATIC_AF_SDCARD_D3 STATIC_AF_SDMMC1_D3 +#define STATIC_AF_SDCARD_D4 STATIC_AF_SDMMC1_D4 +#define STATIC_AF_SDCARD_D5 STATIC_AF_SDMMC1_D5 +#define STATIC_AF_SDCARD_D6 STATIC_AF_SDMMC1_D6 +#define STATIC_AF_SDCARD_D7 STATIC_AF_SDMMC1_D7 #endif // The F7 & L4 series calls the peripheral SDMMC rather than SDIO, so provide some @@ -120,6 +128,10 @@ #define STATIC_AF_SDCARD_D1 STATIC_AF_SDIO_D1 #define STATIC_AF_SDCARD_D2 STATIC_AF_SDIO_D2 #define STATIC_AF_SDCARD_D3 STATIC_AF_SDIO_D3 +#define STATIC_AF_SDCARD_D4 STATIC_AF_SDIO_D4 +#define STATIC_AF_SDCARD_D5 STATIC_AF_SDIO_D5 +#define STATIC_AF_SDCARD_D6 STATIC_AF_SDIO_D6 +#define STATIC_AF_SDCARD_D7 STATIC_AF_SDIO_D7 #endif @@ -133,6 +145,13 @@ #define MICROPY_HW_SDCARD_CMD (pin_D2) #endif +// Define a constant to select the bus width. +#if MICROPY_HW_SDCARD_BUS_WIDTH == 4 +#define SDIO_BUS_WIDE_VALUE SDIO_BUS_WIDE_4B +#elif MICROPY_HW_SDCARD_BUS_WIDTH == 8 +#define SDIO_BUS_WIDE_VALUE SDIO_BUS_WIDE_8B +#endif + #define PYB_SDMMC_FLAG_SD (0x01) #define PYB_SDMMC_FLAG_MMC (0x02) #define PYB_SDMMC_FLAG_ACTIVE (0x04) @@ -162,10 +181,16 @@ void sdcard_init(void) { mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_CK, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_CK); mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_CMD, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_CMD); mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_D0, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_D0); - #if MICROPY_HW_SDCARD_BUS_WIDTH == 4 + #if MICROPY_HW_SDCARD_BUS_WIDTH >= 4 mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_D1, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_D1); mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_D2, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_D2); mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_D3, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_D3); + #if MICROPY_HW_SDCARD_BUS_WIDTH == 8 + mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_D4, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_D4); + mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_D5, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_D5); + mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_D6, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_D6); + mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_D7, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_D7); + #endif #endif // configure the SD card detect pin @@ -252,9 +277,9 @@ STATIC HAL_StatusTypeDef sdmmc_init_sd(void) { mp_hal_delay_ms(50); } - #if MICROPY_HW_SDCARD_BUS_WIDTH == 4 - // configure the SD bus width for 4-bit wide operation - status = HAL_SD_ConfigWideBusOperation(&sdmmc_handle.sd, SDIO_BUS_WIDE_4B); + #if MICROPY_HW_SDCARD_BUS_WIDTH >= 4 + // configure the SD bus width for 4/8-bit wide operation + status = HAL_SD_ConfigWideBusOperation(&sdmmc_handle.sd, SDIO_BUS_WIDE_VALUE); if (status != HAL_OK) { HAL_SD_DeInit(&sdmmc_handle.sd); return status; @@ -287,12 +312,12 @@ STATIC HAL_StatusTypeDef sdmmc_init_mmc(void) { // As this is an eMMC card, overwrite LogBlockNbr with actual value sdmmc_handle.mmc.MmcCard.LogBlockNbr = 7469056 + 2048; - #if MICROPY_HW_SDCARD_BUS_WIDTH == 4 - // Configure the SDIO bus width for 4-bit wide operation + #if MICROPY_HW_SDCARD_BUS_WIDTH >= 4 + // Configure the SDIO bus width for 4/8-bit wide operation #ifdef STM32F7 sdmmc_handle.mmc.Init.ClockBypass = SDIO_CLOCK_BYPASS_ENABLE; #endif - status = HAL_MMC_ConfigWideBusOperation(&sdmmc_handle.mmc, SDIO_BUS_WIDE_4B); + status = HAL_MMC_ConfigWideBusOperation(&sdmmc_handle.mmc, SDIO_BUS_WIDE_VALUE); if (status != HAL_OK) { HAL_MMC_DeInit(&sdmmc_handle.mmc); return status;