Skip to content

Commit 7f4cd88

Browse files
committed
feat: support transceiver for H7, L5 and U5
Signed-off-by: Frederic Pillon <frederic.pillon@st.com>
1 parent 2879351 commit 7f4cd88

File tree

4 files changed

+51
-39
lines changed

4 files changed

+51
-39
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ Some default definitions can be overridden using:
5454

5555
#### SD Transceiver
5656

57-
* `SD_TRANSCEIVER_MODE`: specifies whether external Transceiver is enabled or disabled. Available only on some STM32
58-
* `SDMMC_TRANSCEIVER_ENABLE`
59-
* `SDMMC_TRANSCEIVER_DISABLE` (default)
57+
* To specifies whether external Transceiver is present and enabled (Available only on some STM32) add:
6058

61-
* `SD_TRANSCEIVER_EN` pin number to enable the level shifter
62-
* `SD_TRANSCEIVER_SEL` pin number for voltage selection
59+
`#define USE_SD_TRANSCEIVER 1`
60+
* Then define pins:
61+
* `SD_TRANSCEIVER_EN` pin number to enable the level shifter
62+
* `SD_TRANSCEIVER_SEL` pin number for voltage selection
6363

6464
#### SD detect and timeout
6565
* `SD_DETECT_PIN` pin number

src/Sd2Card.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,15 @@ bool Sd2Card::init(uint32_t detectpin)
4747
return false;
4848
}
4949
}
50-
#ifdef SDMMC_TRANSCEIVER_ENABLE
50+
#if defined(USE_SD_TRANSCEIVER) && (USE_SD_TRANSCEIVER != 0U)
5151
PinName sd_en = digitalPinToPinName(SD_TRANSCEIVER_EN);
5252
PinName sd_sel = digitalPinToPinName(SD_TRANSCEIVER_SEL);
53-
BSP_SD_TransceiverPin(set_GPIO_Port_Clock(STM_PORT(sd_en)),
54-
STM_LL_GPIO_PIN(sd_en),
55-
set_GPIO_Port_Clock(STM_PORT(sd_sel)),
56-
STM_LL_GPIO_PIN(sd_sel));
53+
if (BSP_SD_TransceiverPin(set_GPIO_Port_Clock(STM_PORT(sd_en)),
54+
STM_LL_GPIO_PIN(sd_en),
55+
set_GPIO_Port_Clock(STM_PORT(sd_sel)),
56+
STM_LL_GPIO_PIN(sd_sel)) == MSD_ERROR) {
57+
return false;
58+
}
5759
#endif
5860
if (BSP_SD_Init() == MSD_OK) {
5961
BSP_SD_GetCardInfo(&_SdCardInfo);

src/bsp_sd.c

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,14 @@
6969
#define SD_CLK_DIV SDMMC_NSpeed_CLK_DIV
7070
#endif
7171

72-
#ifdef SDMMC_TRANSCEIVER_ENABLE
73-
#define SD_TRANSCEIVER_ENABLE SDMMC_TRANSCEIVER_ENABLE
74-
#define SD_TRANSCEIVER_DISABLE SDMMC_TRANSCEIVER_DISABLE
72+
#if defined(USE_SD_TRANSCEIVER) && (USE_SD_TRANSCEIVER != 0U)
73+
#if defined(SDMMC_TRANSCEIVER_ENABLE)
74+
#define SD_TRANSCEIVER_ENABLE SDMMC_TRANSCEIVER_ENABLE
75+
#define SD_TRANSCEIVER_DISABLE SDMMC_TRANSCEIVER_DISABLE
76+
#else
77+
#define SD_TRANSCEIVER_ENABLE SDMMC_TRANSCEIVER_PRESENT
78+
#define SD_TRANSCEIVER_DISABLE SDMMC_TRANSCEIVER_NOT_PRESENT
79+
#endif
7580
#endif
7681

7782
#elif defined(SDIO)
@@ -101,15 +106,11 @@
101106
#define SD_BUS_WIDE SD_BUS_WIDE_4B
102107
#endif
103108

104-
#if defined(SDMMC_TRANSCEIVER_ENABLE) && !defined(SD_TRANSCEIVER_MODE)
105-
#define SD_TRANSCEIVER_MODE SD_TRANSCEIVER_DISABLE
106-
#endif
107-
108109
/* BSP SD Private Variables */
109110
static SD_HandleTypeDef uSdHandle;
110111
static uint32_t SD_detect_ll_gpio_pin = LL_GPIO_PIN_ALL;
111112
static GPIO_TypeDef *SD_detect_gpio_port = GPIOA;
112-
#ifdef SDMMC_TRANSCEIVER_ENABLE
113+
#if defined(USE_SD_TRANSCEIVER) && (USE_SD_TRANSCEIVER != 0U)
113114
static uint32_t SD_trans_en_ll_gpio_pin = LL_GPIO_PIN_ALL;
114115
static GPIO_TypeDef *SD_trans_en_gpio_port = GPIOA;
115116
static uint32_t SD_trans_sel_ll_gpio_pin = LL_GPIO_PIN_ALL;
@@ -143,12 +144,13 @@ uint8_t BSP_SD_Init(void)
143144
uSdHandle.Init.BusWide = SD_BUS_WIDE_1B;
144145
uSdHandle.Init.HardwareFlowControl = SD_HW_FLOW_CTRL;
145146
uSdHandle.Init.ClockDiv = SD_CLK_DIV;
146-
#ifdef SDMMC_TRANSCEIVER_ENABLE
147-
uSdHandle.Init.Transceiver = SD_TRANSCEIVER_MODE;
148-
if (SD_TRANSCEIVER_MODE == SD_TRANSCEIVER_ENABLE) {
149-
150-
BSP_SD_Transceiver_MspInit(&uSdHandle, NULL);
151-
}
147+
#if defined(USE_SD_TRANSCEIVER) && (USE_SD_TRANSCEIVER != 0U)
148+
#if defined(SDMMC_TRANSCEIVER_ENABLE)
149+
uSdHandle.Init.Transceiver = SD_TRANSCEIVER_ENABLE;
150+
#else
151+
uSdHandle.Init.TranceiverPresent = SD_TRANSCEIVER_ENABLE;
152+
#endif
153+
BSP_SD_Transceiver_MspInit(&uSdHandle, NULL);
152154
#endif
153155

154156
if (SD_detect_ll_gpio_pin != LL_GPIO_PIN_ALL) {
@@ -205,11 +207,13 @@ uint8_t BSP_SD_DeInit(void)
205207
return sd_state;
206208
}
207209

208-
#ifdef SDMMC_TRANSCEIVER_ENABLE
210+
#if defined(USE_SD_TRANSCEIVER) && (USE_SD_TRANSCEIVER != 0U)
209211
/**
210-
* @brief Set the SD card device detect pin and port.
211-
* @param port one of the gpio port
212-
* @param pin one of the gpio pin
212+
* @brief Set the transceiver pin and port.
213+
* @param enport enable gpio port
214+
* @param enpin enable gpio pin
215+
* @param selport select gpio port
216+
* @param selpin select gpio pin
213217
* @retval SD status
214218
*/
215219
uint8_t BSP_SD_TransceiverPin(GPIO_TypeDef *enport, uint32_t enpin, GPIO_TypeDef *selport, uint32_t selpin)
@@ -483,7 +487,7 @@ __weak void BSP_SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params)
483487
#endif
484488
}
485489

486-
#ifdef SDMMC_TRANSCEIVER_ENABLE
490+
#if defined(USE_SD_TRANSCEIVER) && (USE_SD_TRANSCEIVER != 0U)
487491
/**
488492
* @brief Initializes the SD Transceiver pin MSP.
489493
* @param hsd: SD handle
@@ -514,15 +518,19 @@ __weak void BSP_SD_Transceiver_MspInit(SD_HandleTypeDef *hsd, void *Params)
514518
* @param status: Voltage Switch State
515519
* @retval None
516520
*/
517-
void HAL_SDEx_DriveTransceiver_1_8V_Callback(FlagStatus status)
521+
#if defined(SDMMC_TRANSCEIVER_ENABLE)
522+
void HAL_SDEx_DriveTransceiver_1_8V_Callback(FlagStatus status)
523+
#else
524+
void HAL_SD_DriveTransceiver_1_8V_Callback(FlagStatus status)
525+
#endif
518526
{
519527
if (status == SET) {
520528
LL_GPIO_SetOutputPin(SD_trans_sel_gpio_port, SD_trans_sel_ll_gpio_pin);
521529
} else {
522530
LL_GPIO_ResetOutputPin(SD_trans_sel_gpio_port, SD_trans_sel_ll_gpio_pin);
523531
}
524532
}
525-
#endif /* SDMMC_TRANSCEIVER_ENABLE */
533+
#endif /* USE_SD_TRANSCEIVER && (USE_SD_TRANSCEIVER != 0U) */
526534

527535
#ifndef STM32L1xx
528536
/**

src/bsp_sd.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ extern "C" {
5353
Please update the core or install previous library version."
5454
#endif
5555

56+
/* For backward compatibility */
57+
#if defined(SD_TRANSCEIVER_MODE) && !defined(USE_SD_TRANSCEIVER)
58+
#define USE_SD_TRANSCEIVER 1
59+
#endif
60+
5661
/*SD Card information structure */
5762
#ifndef STM32L1xx
5863
#define HAL_SD_CardInfoTypedef HAL_SD_CardInfoTypeDef
@@ -72,22 +77,19 @@ Please update the core or install previous library version."
7277
#define SD_PRESENT ((uint8_t)0x01)
7378
#define SD_NOT_PRESENT ((uint8_t)0x00)
7479
#define SD_DETECT_NONE NUM_DIGITAL_PINS
75-
#ifdef SDMMC_TRANSCEIVER_ENABLE
76-
#define SD_TRANSCEIVER_NONE NUM_DIGITAL_PINS
77-
#endif
7880

7981
/* Could be redefined in variant.h or using build_opt.h */
8082
#ifndef SD_DATATIMEOUT
8183
#define SD_DATATIMEOUT 100000000U
8284
#endif
8385

84-
#ifdef SDMMC_TRANSCEIVER_ENABLE
86+
#if defined(USE_SD_TRANSCEIVER) && (USE_SD_TRANSCEIVER != 0U)
8587
#ifndef SD_TRANSCEIVER_EN
86-
#define SD_TRANSCEIVER_EN SD_TRANSCEIVER_NONE
88+
#define SD_TRANSCEIVER_EN NUM_DIGITAL_PINS
8789
#endif
8890

8991
#ifndef SD_TRANSCEIVER_SEL
90-
#define SD_TRANSCEIVER_SEL SD_TRANSCEIVER_NONE
92+
#define SD_TRANSCEIVER_SEL NUM_DIGITAL_PINS
9193
#endif
9294
#endif
9395

@@ -98,7 +100,7 @@ Please update the core or install previous library version."
98100
/* SD Exported Functions */
99101
uint8_t BSP_SD_Init(void);
100102
uint8_t BSP_SD_DeInit(void);
101-
#ifdef SDMMC_TRANSCEIVER_ENABLE
103+
#if defined(USE_SD_TRANSCEIVER) && (USE_SD_TRANSCEIVER != 0U)
102104
uint8_t BSP_SD_TransceiverPin(GPIO_TypeDef *enport, uint32_t enpin, GPIO_TypeDef *selport, uint32_t selpin);
103105
#endif
104106
uint8_t BSP_SD_DetectPin(GPIO_TypeDef *port, uint32_t pin);
@@ -124,7 +126,7 @@ uint8_t BSP_SD_IsDetected(void);
124126
void BSP_SD_MspInit(SD_HandleTypeDef *hsd, void *Params);
125127
void BSP_SD_Detect_MspInit(SD_HandleTypeDef *hsd, void *Params);
126128
void BSP_SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params);
127-
#ifdef SDMMC_TRANSCEIVER_ENABLE
129+
#if defined(USE_SD_TRANSCEIVER) && (USE_SD_TRANSCEIVER != 0U)
128130
void BSP_SD_Transceiver_MspInit(SD_HandleTypeDef *hsd, void *Params);
129131
#endif
130132

0 commit comments

Comments
 (0)