From 2c2e70fb17b8a1ccc72da2137be8cebe8a4abbd9 Mon Sep 17 00:00:00 2001 From: Gunar Schorcht Date: Wed, 10 May 2023 13:43:36 +0200 Subject: [PATCH] boards/stm32l496g-disco: add SDMMC support --- boards/stm32l496g-disco/Kconfig | 2 + boards/stm32l496g-disco/Makefile.dep | 11 ++++ boards/stm32l496g-disco/Makefile.features | 1 + boards/stm32l496g-disco/doc.txt | 2 +- boards/stm32l496g-disco/include/periph_conf.h | 61 +++++++++++++++---- 5 files changed, 63 insertions(+), 14 deletions(-) diff --git a/boards/stm32l496g-disco/Kconfig b/boards/stm32l496g-disco/Kconfig index e8db1dc024..118af8730b 100644 --- a/boards/stm32l496g-disco/Kconfig +++ b/boards/stm32l496g-disco/Kconfig @@ -25,6 +25,7 @@ config BOARD_STM32L496G_DISCO select HAS_PERIPH_RTC select HAS_PERIPH_RTT select HAS_PERIPH_PWM + select HAS_PERIPH_SDMMC select HAS_PERIPH_SPI select HAS_PERIPH_SPI_STMOD select HAS_PERIPH_TIMER @@ -43,6 +44,7 @@ config BOARD_STM32L496G_DISCO select HAVE_SAUL_GPIO select HAVE_FT5X06 + select HAVE_MTD_SDMMC_DEFAULT select HAVE_ST7789 select HAVE_LCD_PARALLEL_16BIT if MODULE_ST7789 select HAVE_LCD_PARALLEL_LL_MCU if MODULE_ST7789 diff --git a/boards/stm32l496g-disco/Makefile.dep b/boards/stm32l496g-disco/Makefile.dep index f231d8bf46..dde15b3432 100644 --- a/boards/stm32l496g-disco/Makefile.dep +++ b/boards/stm32l496g-disco/Makefile.dep @@ -31,3 +31,14 @@ ifneq (,$(filter st7789,$(USEMODULE))) USEMODULE += lcd_parallel_ll_mcu FEATURES_REQUIRED += periph_fmc_nor_sram endif + +# default to using fatfs on SD card +ifneq (,$(filter vfs_default,$(USEMODULE))) + USEMODULE += fatfs_vfs + USEMODULE += mtd +endif + +ifneq (,$(filter mtd,$(USEMODULE))) + USEMODULE += mtd_sdmmc_default + USEMODULE += periph_sdmmc +endif diff --git a/boards/stm32l496g-disco/Makefile.features b/boards/stm32l496g-disco/Makefile.features index c284ab673f..be265f41dc 100644 --- a/boards/stm32l496g-disco/Makefile.features +++ b/boards/stm32l496g-disco/Makefile.features @@ -13,6 +13,7 @@ FEATURES_PROVIDED += periph_lpuart FEATURES_PROVIDED += periph_rtc FEATURES_PROVIDED += periph_rtt FEATURES_PROVIDED += periph_pwm +FEATURES_PROVIDED += periph_sdmmc FEATURES_PROVIDED += periph_spi FEATURES_PROVIDED += periph_spi_stmod FEATURES_PROVIDED += periph_timer diff --git a/boards/stm32l496g-disco/doc.txt b/boards/stm32l496g-disco/doc.txt index 1449687af6..d4530b96d9 100644 --- a/boards/stm32l496g-disco/doc.txt +++ b/boards/stm32l496g-disco/doc.txt @@ -38,7 +38,7 @@ The main features of this board are: | SAI audio codec | - | | | External PSRAM | x | Connected to FMC peripheral | | External Quad-SPI Flash | - | QSPI peripheral is not yet supported | -| SD Card Interface | - | | +| SD Card Interface | - | SDMMC1 on PC8..PC13/PD2 | ## Board Configuration (sorted by peripheral): diff --git a/boards/stm32l496g-disco/include/periph_conf.h b/boards/stm32l496g-disco/include/periph_conf.h index 0e6d5a5e6f..d7acd91958 100644 --- a/boards/stm32l496g-disco/include/periph_conf.h +++ b/boards/stm32l496g-disco/include/periph_conf.h @@ -106,7 +106,7 @@ static const adc_conf_t adc_config[] = { { .pin = GPIO_PIN(PORT_C, 0), .dev = 1, .chan = 13 }, /* A5, ADC12_IN13, SB28 closed */ { .pin = GPIO_UNDEF, .dev = 0, .chan = 0 }, /* V_REFINT, ADC1_IN0 */ { .pin = GPIO_UNDEF, .dev = 0, .chan = 18 }, /* V_BAT, ADC1_IN18 */ -#ifndef MODULE_PERIPH_DAC +#if !MODULE_PERIPH_DAC { .pin = GPIO_PIN(PORT_A, 4), .dev = 0, .chan = 9 }, /* STMOD+_ADC, ADC12_IN9 */ #else { .pin = GPIO_UNDEF, .dev = 1, .chan = 17 }, /* DAC1, ADC2_IN17 */ @@ -153,7 +153,7 @@ static const adc_conf_t adc_config[] = { */ static const dac_conf_t dac_config[] = { { GPIO_PIN(PORT_A, 4), .chan = 0 }, /* STMod+_ADC pin */ -#ifndef MODULE_PERIPH_SPI +#if !MODULE_PERIPH_SPI { GPIO_PIN(PORT_A, 5), .chan = 1 }, /* Arduino D13, conflicts with SPI_DEV(0) */ #endif }; @@ -397,6 +397,41 @@ static const pwm_conf_t pwm_config[] = { #define PWM_NUMOF ARRAY_SIZE(pwm_config) /** @} */ +/** + * @name SDIO/SDMMC configuration + * @{ + */ + +/** + * @brief SDIO/SDMMC static configuration struct + */ +static const sdmmc_conf_t sdmmc_config[] = { + { + .dev = SDMMC1, + .bus = APB2, + .rcc_mask = RCC_APB2ENR_SDMMC1EN, + .cd = GPIO_UNDEF, /* CD is connected to MFX GPIO8 */ + .clk = { GPIO_PIN(PORT_C, 12), GPIO_AF12 }, + .cmd = { GPIO_PIN(PORT_D, 2), GPIO_AF12 }, + .dat0 = { GPIO_PIN(PORT_C, 8), GPIO_AF12 }, + .dat1 = { GPIO_PIN(PORT_C, 9), GPIO_AF12 }, + .dat2 = { GPIO_PIN(PORT_C, 10), GPIO_AF12 }, + .dat3 = { GPIO_PIN(PORT_C, 11), GPIO_AF12 }, +#if MODULE_PERIPH_DMA + .dma = 6, + .dma_chan = 7, +#endif + .irqn = SDMMC1_IRQn + }, +}; + +/** + * @brief Number of configured SDIO/SDMMC peripherals + */ +#define SDMMC_CONFIG_NUMOF 1 + +/** @} */ + /** * @name SPI configuration * @@ -422,14 +457,14 @@ static const spi_conf_t spi_config[] = { .cs_af = GPIO_AF5, .rccmask = RCC_APB2ENR_SPI1EN, .apbbus = APB2, -#if IS_USED(MODULE_PERIPH_DMA) +#if MODULE_PERIPH_DMA .rx_dma = 0, /* DMA1 Channel 2 */ .rx_dma_chan = 1, /* CxS = 1 */ .tx_dma = 1, /* DMA1 Channel 3 */ .tx_dma_chan = 1, /* CxS = 1 */ #endif }, -#if IS_USED(MODULE_PERIPH_SPI_STMOD) +#if MODULE_PERIPH_SPI_STMOD { /* Pmod/STMod+ connector if solder bridges SB4, SB5, SB9 are closed */ .dev = SPI2, .mosi_pin = GPIO_PIN(PORT_B, 15), @@ -442,7 +477,7 @@ static const spi_conf_t spi_config[] = { .cs_af = GPIO_AF5, .rccmask = RCC_APB1ENR1_SPI2EN, .apbbus = APB1, -#if IS_USED(MODULE_PERIPH_DMA) +#if MODULE_PERIPH_DMA .rx_dma = 2, /* DMA1 Channel 4 */ .rx_dma_chan = 1, /* CxS = 1 */ .tx_dma = 3, /* DMA1 Channel 5 */ @@ -503,13 +538,13 @@ static const uart_conf_t uart_config[] = { .tx_af = GPIO_AF7, .bus = APB1, .irqn = USART2_IRQn, -#if IS_USED(MODULE_PERIPH_UART_HW_FC) +#if MODULE_PERIPH_UART_HW_FC .cts_pin = GPIO_UNDEF, /* CTS is not connected */ .rts_pin = GPIO_UNDEF, /* RTS is not connected */ #endif .type = STM32_USART, .clk_src = 0, /* Use APB clock */ -#if IS_USED(MODULE_PERIPH_DMA) +#if MODULE_PERIPH_DMA .dma = 4, /* DMA1 Channel 7 */ .dma_chan = 2, /* CxS = 2 */ #endif @@ -523,19 +558,19 @@ static const uart_conf_t uart_config[] = { .tx_af = GPIO_AF8, .bus = APB12, .irqn = LPUART1_IRQn, -#if IS_USED(MODULE_PERIPH_UART_HW_FC) +#if MODULE_PERIPH_UART_HW_FC .cts_pin = GPIO_UNDEF, /* CTS is not connected */ .rts_pin = GPIO_UNDEF, /* RTS is not connected */ #endif .type = STM32_LPUART, .clk_src = 0, /* Use APB clock */ -#if IS_USED(MODULE_PERIPH_DMA) +#if MODULE_PERIPH_DMA .dma = 5, /* DMA2 Channel 6 */ .dma_chan = 4, /* CxS = 4 */ #endif }, -#if !IS_USED(MODULE_PERIPH_SPI_STMOD) +#if !MODULE_PERIPH_SPI_STMOD { /* Pmod/STMod+ connector if solder bridges SB6, SB7, SB8 are closed (default) */ .dev = USART1, .rcc_mask = RCC_APB2ENR_USART1EN, @@ -545,7 +580,7 @@ static const uart_conf_t uart_config[] = { .tx_af = GPIO_AF7, .bus = APB2, .irqn = USART1_IRQn, -#if IS_USED(MODULE_PERIPH_UART_HW_FC) +#if MODULE_PERIPH_UART_HW_FC .cts_pin = GPIO_PIN(PORT_G, 11), .rts_pin = GPIO_PIN(PORT_G, 12), .cts_af = GPIO_AF7, @@ -553,12 +588,12 @@ static const uart_conf_t uart_config[] = { #endif .type = STM32_USART, .clk_src = 0, /* Use APB clock */ -#if IS_USED(MODULE_PERIPH_DMA) +#if MODULE_PERIPH_DMA .dma = 2, /* DMA1 Channel 4 */ .dma_chan = 2, /* CxS = 2 */ #endif }, -#endif /* !IS_USED(MODULE_PERIPH_SPI_STMOD) */ +#endif /* !MODULE_PERIPH_SPI_STMOD */ }; #define UART_0_ISR (isr_usart2)