drivers: sdmmc_stm32: Fix bus width initialization sequence
Fix SDMMC initialization by starting with 1-bit bus mode and
properly configuring wide bus operation after HAL
initialization.
The SDMMC protocol requires initialization to start in
1-bit mode before switching to wider bus widths.
Previously, the driver attempted to initialize directly
with the target bus width, which could cause later read/write
failures.
Changes:
- Initialize with SDMMC_BUS_WIDE_1B instead of target bus width
- Add HAL_SD_ConfigWideBusOperation() call if needed after
successful init
- Add error logging for wide bus configuration failures
Fixes potential SDMMC read/write failures issues on STM32 platforms.
Signed-off-by: Shan Pen <bricle031@gmail.com>
diff --git a/drivers/disk/sdmmc_stm32.c b/drivers/disk/sdmmc_stm32.c
index 7f44454..0fc94d1 100644
--- a/drivers/disk/sdmmc_stm32.c
+++ b/drivers/disk/sdmmc_stm32.c
@@ -63,6 +63,14 @@
#define SDMMC_HARDWARE_FLOW_CONTROL_DISABLE SDIO_HARDWARE_FLOW_CONTROL_DISABLE
#endif
+#if DT_INST_PROP(0, bus_width) == 1
+#define SDMMC_BUS_WIDTH SDMMC_BUS_WIDE_1B
+#elif DT_INST_PROP(0, bus_width) == 4
+#define SDMMC_BUS_WIDTH SDMMC_BUS_WIDE_4B
+#elif DT_INST_PROP(0, bus_width) == 8
+#define SDMMC_BUS_WIDTH SDMMC_BUS_WIDE_8B
+#endif /* DT_INST_PROP(0, bus_width) */
+
typedef void (*irq_config_func_t)(const struct device *dev);
#if STM32_SDMMC_USE_DMA
@@ -414,6 +422,17 @@
goto error;
}
+ if (SDMMC_BUS_WIDTH != SDMMC_BUS_WIDE_1B) {
+ priv->hsd.Init.BusWide = SDMMC_BUS_WIDTH;
+ err = HAL_SD_ConfigWideBusOperation(&priv->hsd, priv->hsd.Init.BusWide);
+ if (err != HAL_OK) {
+ LOG_ERR("failed to configure wide bus operation (ErrorCode 0x%X)",
+ priv->hsd.ErrorCode);
+ err = -EIO;
+ goto error;
+ }
+ }
+
#ifdef CONFIG_SDMMC_STM32_HWFC
stm32_sdmmc_fc_enable(priv);
#endif
@@ -899,14 +918,6 @@
irq_enable(DT_INST_IRQN(0));
}
-#if DT_INST_PROP(0, bus_width) == 1
-#define SDMMC_BUS_WIDTH SDMMC_BUS_WIDE_1B
-#elif DT_INST_PROP(0, bus_width) == 4
-#define SDMMC_BUS_WIDTH SDMMC_BUS_WIDE_4B
-#elif DT_INST_PROP(0, bus_width) == 8
-#define SDMMC_BUS_WIDTH SDMMC_BUS_WIDE_8B
-#endif /* DT_INST_PROP(0, bus_width) */
-
static struct stm32_pclken pclken_sdmmc[] = STM32_DT_INST_CLOCKS(0);
static struct stm32_sdmmc_priv stm32_sdmmc_priv_1 = {
@@ -924,7 +935,7 @@
: SDMMC_CLOCK_BYPASS_DISABLE,
#endif
.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE,
- .Init.BusWide = SDMMC_BUS_WIDTH,
+ .Init.BusWide = SDMMC_BUS_WIDE_1B,
.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE,
.Init.ClockDiv = DT_INST_PROP_OR(0, clk_div, 0),
},