Skip to content

Commit e7516f1

Browse files
committed
fix: manage SDMMCx signals availability
For some series some PinMap_SD* are not available. Signed-off-by: Frederic Pillon <frederic.pillon@st.com>
1 parent 29208ce commit e7516f1

File tree

1 file changed

+67
-15
lines changed

1 file changed

+67
-15
lines changed

src/bsp_sd.c

Lines changed: 67 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,18 @@ uint8_t BSP_SD_GetInstance(void)
156156
SD_PinNames.pin_cmd = PinMap_SD_CMD[0].pin;
157157
SD_PinNames.pin_ck = PinMap_SD_CK[0].pin;
158158
#if defined(SDMMC1) || defined(SDMMC2)
159+
#if !defined(SDMMC_CKIN_NA)
159160
SD_PinNames.pin_ckin = PinMap_SD_CKIN[0].pin;
161+
#endif
162+
#if !defined(SDMMC_CDIR_NA)
160163
SD_PinNames.pin_cdir = PinMap_SD_CDIR[0].pin;
164+
#endif
165+
#if !defined(SDMMC_D0DIR_NA)
161166
SD_PinNames.pin_d0dir = PinMap_SD_D0DIR[0].pin;
167+
#endif
168+
#if !defined(SDMMC_D123DIR_NA)
162169
SD_PinNames.pin_d123dir = PinMap_SD_D123DIR[0].pin;
170+
#endif
163171
#endif /* SDMMC1 || SDMMC2 */
164172
}
165173
/* Get SD instance from pins */
@@ -188,35 +196,51 @@ uint8_t BSP_SD_GetInstance(void)
188196
}
189197
uSdHandle.Instance = sd_base;
190198
#if defined(SDMMC1) || defined(SDMMC2)
199+
#if !defined(SDMMC_CKIN_NA)
191200
if (SD_PinNames.pin_ckin != NC) {
192201
SD_TypeDef *sd_ckin = pinmap_peripheral(SD_PinNames.pin_ckin, PinMap_SD_CKIN);
202+
if (pinmap_merge_peripheral(sd_ckin, sd_base) == NP) {
203+
core_debug("ERROR: SD CKIN pin mismatch\n");
204+
return MSD_ERROR;
205+
}
206+
}
207+
#endif
208+
#if !defined(SDMMC_CDIR_NA)
209+
if (SD_PinNames.pin_cdir != NC) {
193210
SD_TypeDef *sd_cdir = pinmap_peripheral(SD_PinNames.pin_cdir, PinMap_SD_CDIR);
211+
if (pinmap_merge_peripheral(sd_cdir, sd_base) == NP) {
212+
core_debug("ERROR: SD CDIR pin mismatch\n");
213+
return MSD_ERROR;
214+
}
215+
}
216+
#endif
217+
#if !defined(SDMMC_D0DIR_NA)
218+
if (SD_PinNames.pin_cdir != NC) {
194219
SD_TypeDef *sd_d0dir = pinmap_peripheral(SD_PinNames.pin_d0dir, PinMap_SD_D0DIR);
195-
SD_TypeDef *sd_d123dir = pinmap_peripheral(SD_PinNames.pin_d123dir, PinMap_SD_D123DIR);
196-
197-
/* Pins Dx/cmd/CK must not be NP. */
198-
if (sd_ckin == NP || sd_cdir == NP || sd_d0dir == NP || sd_d123dir == NP) {
199-
core_debug("ERROR: at least one SDMMC pin has no peripheral\n");
220+
if (pinmap_merge_peripheral(sd_d0dir, sd_base) == NP) {
221+
core_debug("ERROR: SD DODIR pin mismatch\n");
200222
return MSD_ERROR;
201223
}
202-
SD_TypeDef *sdmmc_cx = pinmap_merge_peripheral(sd_ckin, sd_cdir);
203-
SD_TypeDef *sdmmc_dx = pinmap_merge_peripheral(sd_d0dir, sd_d123dir);
204-
SD_TypeDef *sdmmc_base = pinmap_merge_peripheral(sdmmc_cx, sdmmc_dx);
205-
if (sdmmc_cx == NP || sdmmc_dx == NP || sdmmc_base == NP) {
206-
core_debug("ERROR: SD pins mismatch\n");
224+
}
225+
#endif
226+
#if !defined(SDMMC_D123DIR_NA)
227+
if (SD_PinNames.pin_cdir != NC) {
228+
SD_TypeDef *sd_d123dir = pinmap_peripheral(SD_PinNames.pin_d123dir, PinMap_SD_D123DIR);
229+
if (pinmap_merge_peripheral(sd_d123dir, sd_base) == NP) {
230+
core_debug("ERROR: SD D123DIR pin mismatch\n");
207231
return MSD_ERROR;
208232
}
209-
uSdHandle.Instance = pinmap_merge_peripheral(sd_base, sdmmc_base);
210233
}
211234
#endif
235+
#endif /* SDMMC1 || SDMMC2 */
212236
/* Are all pins connected to the same SDx instance? */
213237
if (uSdHandle.Instance == NP) {
214238
core_debug("ERROR: SD pins mismatch\n");
215239
return MSD_ERROR;
216240
}
217241
return MSD_OK;
218242
}
219-
#endif /* STM32_CORE_VERSION */
243+
#endif /* STM32_CORE_VERSION && (STM32_CORE_VERSION > 0x02050000) */
220244

221245
/**
222246
* @brief Initializes the SD card device with CS check if any.
@@ -235,7 +259,7 @@ uint8_t BSP_SD_Init(void)
235259
if (BSP_SD_GetInstance() == MSD_ERROR) {
236260
return MSD_ERROR;
237261
}
238-
#endif
262+
#endif /* !STM32_CORE_VERSION || (STM32_CORE_VERSION <= 0x02050000) */
239263

240264
uSdHandle.Init.ClockEdge = SD_CLK_EDGE;
241265
#if defined(SD_CLK_BYPASS)
@@ -504,14 +528,28 @@ __weak void BSP_SD_MspInit(SD_HandleTypeDef *hsd, void *Params)
504528
pinmap_pinout(SD_PinNames.pin_cmd, PinMap_SD_CMD);
505529
pinmap_pinout(SD_PinNames.pin_ck, PinMap_SD_CK);
506530
#if defined(SDMMC1) || defined(SDMMC2)
531+
#if !defined(SDMMC_CKIN_NA)
507532
if (SD_PinNames.pin_ckin != NC) {
508533
pinmap_pinout(SD_PinNames.pin_ckin, PinMap_SD_CKIN);
534+
}
535+
#endif
536+
#if !defined(SDMMC_CDIR_NA)
537+
if (SD_PinNames.pin_cdir != NC) {
509538
pinmap_pinout(SD_PinNames.pin_cdir, PinMap_SD_CDIR);
539+
}
540+
#endif
541+
#if !defined(SDMMC_D0DIR_NA)
542+
if (SD_PinNames.pin_d0dir != NC) {
510543
pinmap_pinout(SD_PinNames.pin_d0dir, PinMap_SD_D0DIR);
511-
pinmap_pinout(SD_PinNames.pin_d123dir, PinMap_SD_D123DIR);
512544
}
513545
#endif
546+
#if !defined(SDMMC_D123DIR_NA)
547+
if (SD_PinNames.pin_d123dir != NC) {
548+
pinmap_pinout(SD_PinNames.pin_d123dir, PinMap_SD_D123DIR);
549+
}
514550
#endif
551+
#endif /* SDMMC1 || SDMMC2 */
552+
#endif /* !STM32_CORE_VERSION || (STM32_CORE_VERSION <= 0x02050000) */
515553
/* Enable SD clock */
516554
#if defined(SDMMC1) || defined(SDMMC2)
517555
#if defined(SDMMC1)
@@ -574,14 +612,28 @@ __weak void BSP_SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params)
574612
HAL_GPIO_DeInit((GPIO_TypeDef *)STM_PORT(SD_PinNames.pin_cmd), STM_GPIO_PIN(SD_PinNames.pin_cmd));
575613
HAL_GPIO_DeInit((GPIO_TypeDef *)STM_PORT(SD_PinNames.pin_ck), STM_GPIO_PIN(SD_PinNames.pin_ck));
576614
#if defined(SDMMC1) || defined(SDMMC2)
615+
#if !defined(SDMMC_CKIN_NA)
577616
if (SD_PinNames.pin_ckin != NC) {
578617
HAL_GPIO_DeInit((GPIO_TypeDef *)STM_PORT(SD_PinNames.pin_ckin), STM_GPIO_PIN(SD_PinNames.pin_ckin));
618+
}
619+
#endif
620+
#if !defined(SDMMC_CDIR_NA)
621+
if (SD_PinNames.pin_cdir != NC) {
579622
HAL_GPIO_DeInit((GPIO_TypeDef *)STM_PORT(SD_PinNames.pin_cdir), STM_GPIO_PIN(SD_PinNames.pin_cdir));
623+
}
624+
#endif
625+
#if !defined(SDMMC_D0DIR_NA)
626+
if (SD_PinNames.pin_d0dir != NC) {
580627
HAL_GPIO_DeInit((GPIO_TypeDef *)STM_PORT(SD_PinNames.pin_d0dir), STM_GPIO_PIN(SD_PinNames.pin_d0dir));
581-
HAL_GPIO_DeInit((GPIO_TypeDef *)STM_PORT(SD_PinNames.pin_d123dir), STM_GPIO_PIN(SD_PinNames.pin_d123dir));
582628
}
583629
#endif
630+
#if !defined(SDMMC_D123DIR_NA)
631+
if (SD_PinNames.pin_d123dir != NC) {
632+
HAL_GPIO_DeInit((GPIO_TypeDef *)STM_PORT(SD_PinNames.pin_d123dir), STM_GPIO_PIN(SD_PinNames.pin_d123dir));
633+
}
584634
#endif
635+
#endif /* SDMMC1 || SDMMC2 */
636+
#endif /* !STM32_CORE_VERSION || (STM32_CORE_VERSION <= 0x02050000) */
585637

586638
/* Disable SD clock */
587639
#if defined(SDMMC1) || defined(SDMMC2)

0 commit comments

Comments
 (0)