stm32/sdcard: Allow configuring the SDMMC periph used for SD/MMC card.
This can now be selected by setting MICROPY_HW_SDCARD_SDMMC, which defaults to 1, ie SDMMC1. This commit also renames the SD pin configuration macros from MICROPY_HW_SDMMC2_xxx to MICROPY_HW_SDCARD_xxx, as well as renaming MICROPY_HW_SDMMC_BUS_WIDTH to MICROPY_HW_SDCARD_BUS_WIDTH. Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
parent
37494b8c8a
commit
cf7e71fa43
@ -165,12 +165,13 @@ extern struct _spi_bdev_t spi_bdev2;
|
|||||||
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
|
||||||
|
|
||||||
// SD card
|
// SD card
|
||||||
#define MICROPY_HW_SDMMC2_CK (pyb_pin_SD_CK)
|
#define MICROPY_HW_SDCARD_SDMMC (2)
|
||||||
#define MICROPY_HW_SDMMC2_CMD (pyb_pin_SD_CMD)
|
#define MICROPY_HW_SDCARD_CK (pyb_pin_SD_CK)
|
||||||
#define MICROPY_HW_SDMMC2_D0 (pyb_pin_SD_D0)
|
#define MICROPY_HW_SDCARD_CMD (pyb_pin_SD_CMD)
|
||||||
#define MICROPY_HW_SDMMC2_D1 (pyb_pin_SD_D1)
|
#define MICROPY_HW_SDCARD_D0 (pyb_pin_SD_D0)
|
||||||
#define MICROPY_HW_SDMMC2_D2 (pyb_pin_SD_D2)
|
#define MICROPY_HW_SDCARD_D1 (pyb_pin_SD_D1)
|
||||||
#define MICROPY_HW_SDMMC2_D3 (pyb_pin_SD_D3)
|
#define MICROPY_HW_SDCARD_D2 (pyb_pin_SD_D2)
|
||||||
|
#define MICROPY_HW_SDCARD_D3 (pyb_pin_SD_D3)
|
||||||
#define MICROPY_HW_SDCARD_DETECT_PIN (pyb_pin_SD_SW)
|
#define MICROPY_HW_SDCARD_DETECT_PIN (pyb_pin_SD_SW)
|
||||||
#define MICROPY_HW_SDCARD_DETECT_PULL (GPIO_PULLUP)
|
#define MICROPY_HW_SDCARD_DETECT_PULL (GPIO_PULLUP)
|
||||||
#define MICROPY_HW_SDCARD_DETECT_PRESENT (GPIO_PIN_RESET)
|
#define MICROPY_HW_SDCARD_DETECT_PRESENT (GPIO_PIN_RESET)
|
||||||
|
@ -90,13 +90,14 @@ extern struct _spi_bdev_t spi_bdev;
|
|||||||
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
|
||||||
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
|
||||||
|
|
||||||
// SD card detect switch
|
// SD card
|
||||||
#define MICROPY_HW_SDMMC2_CK (pin_D6)
|
#define MICROPY_HW_SDCARD_SDMMC (2)
|
||||||
#define MICROPY_HW_SDMMC2_CMD (pin_D7)
|
#define MICROPY_HW_SDCARD_CK (pin_D6)
|
||||||
#define MICROPY_HW_SDMMC2_D0 (pin_G9)
|
#define MICROPY_HW_SDCARD_CMD (pin_D7)
|
||||||
#define MICROPY_HW_SDMMC2_D1 (pin_G10)
|
#define MICROPY_HW_SDCARD_D0 (pin_G9)
|
||||||
#define MICROPY_HW_SDMMC2_D2 (pin_B3)
|
#define MICROPY_HW_SDCARD_D1 (pin_G10)
|
||||||
#define MICROPY_HW_SDMMC2_D3 (pin_B4)
|
#define MICROPY_HW_SDCARD_D2 (pin_B3)
|
||||||
|
#define MICROPY_HW_SDCARD_D3 (pin_B4)
|
||||||
#define MICROPY_HW_SDCARD_DETECT_PIN (pin_I15)
|
#define MICROPY_HW_SDCARD_DETECT_PIN (pin_I15)
|
||||||
#define MICROPY_HW_SDCARD_DETECT_PULL (GPIO_PULLUP)
|
#define MICROPY_HW_SDCARD_DETECT_PULL (GPIO_PULLUP)
|
||||||
#define MICROPY_HW_SDCARD_DETECT_PRESENT (GPIO_PIN_RESET)
|
#define MICROPY_HW_SDCARD_DETECT_PRESENT (GPIO_PIN_RESET)
|
||||||
|
@ -107,9 +107,14 @@
|
|||||||
#define MICROPY_HW_ENABLE_MMCARD (0)
|
#define MICROPY_HW_ENABLE_MMCARD (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// SD/MMC interface bus width (defaults to 4 bits)
|
// Which SDMMC peripheral to use for the SD/MMC card driver (1 or 2)
|
||||||
#ifndef MICROPY_HW_SDMMC_BUS_WIDTH
|
#ifndef MICROPY_HW_SDCARD_SDMMC
|
||||||
#define MICROPY_HW_SDMMC_BUS_WIDTH (4)
|
#define MICROPY_HW_SDCARD_SDMMC (1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// SD/MMC card driver interface bus width (defaults to 4 bits)
|
||||||
|
#ifndef MICROPY_HW_SDCARD_BUS_WIDTH
|
||||||
|
#define MICROPY_HW_SDCARD_BUS_WIDTH (4)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Whether to automatically mount (and boot from) the SD card if it's present
|
// Whether to automatically mount (and boot from) the SD card if it's present
|
||||||
@ -383,6 +388,15 @@
|
|||||||
#define MICROPY_HW_MAX_CAN (1)
|
#define MICROPY_HW_MAX_CAN (1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Define MICROPY_HW_SDMMCx_CK values if that peripheral is used, so that make-pins.py
|
||||||
|
// generates the relevant AF constants.
|
||||||
|
#if MICROPY_HW_SDCARD_SDMMC == 1
|
||||||
|
#define MICROPY_HW_SDMMC1_CK (1)
|
||||||
|
#endif
|
||||||
|
#if MICROPY_HW_SDCARD_SDMMC == 2
|
||||||
|
#define MICROPY_HW_SDMMC2_CK (1)
|
||||||
|
#endif
|
||||||
|
|
||||||
// Whether the USB peripheral is device-only, or multiple OTG
|
// Whether the USB peripheral is device-only, or multiple OTG
|
||||||
#if defined(STM32L0) || defined(STM32L432xx) || defined(STM32WB)
|
#if defined(STM32L0) || defined(STM32L432xx) || defined(STM32WB)
|
||||||
#define MICROPY_HW_USB_IS_MULTI_OTG (0)
|
#define MICROPY_HW_USB_IS_MULTI_OTG (0)
|
||||||
|
@ -42,30 +42,39 @@
|
|||||||
|
|
||||||
#if defined(STM32F7) || defined(STM32H7) || defined(STM32L4)
|
#if defined(STM32F7) || defined(STM32H7) || defined(STM32L4)
|
||||||
|
|
||||||
// The F7 has 2 SDMMC units but at the moment we only support using one of them in
|
// The H7/F7/L4 have 2 SDMMC peripherals, but at the moment this driver only supports
|
||||||
// a given build. If a boards config file defines MICROPY_HW_SDMMC2_CK then SDMMC2
|
// using one of them in a given build, selected by MICROPY_HW_SDCARD_SDMMC.
|
||||||
// is used, otherwise SDMMC1 is used.
|
|
||||||
|
|
||||||
#if defined(MICROPY_HW_SDMMC2_CK)
|
#if MICROPY_HW_SDCARD_SDMMC == 2
|
||||||
#define SDIO SDMMC2
|
#define SDIO SDMMC2
|
||||||
#define SDMMC_IRQHandler SDMMC2_IRQHandler
|
#define SDMMC_IRQHandler SDMMC2_IRQHandler
|
||||||
#define SDMMC_CLK_ENABLE() __HAL_RCC_SDMMC2_CLK_ENABLE()
|
#define SDMMC_CLK_ENABLE() __HAL_RCC_SDMMC2_CLK_ENABLE()
|
||||||
#define SDMMC_CLK_DISABLE() __HAL_RCC_SDMMC2_CLK_DISABLE()
|
#define SDMMC_CLK_DISABLE() __HAL_RCC_SDMMC2_CLK_DISABLE()
|
||||||
|
#define SDMMC_FORCE_RESET() __HAL_RCC_SDMMC2_FORCE_RESET()
|
||||||
|
#define SDMMC_RELEASE_RESET() __HAL_RCC_SDMMC2_RELEASE_RESET()
|
||||||
#define SDMMC_IRQn SDMMC2_IRQn
|
#define SDMMC_IRQn SDMMC2_IRQn
|
||||||
#define SDMMC_DMA dma_SDMMC_2
|
#define SDMMC_DMA dma_SDMMC_2
|
||||||
|
#define STATIC_AF_SDCARD_CK STATIC_AF_SDMMC2_CK
|
||||||
|
#define STATIC_AF_SDCARD_CMD STATIC_AF_SDMMC2_CMD
|
||||||
|
#define STATIC_AF_SDCARD_D0 STATIC_AF_SDMMC2_D0
|
||||||
|
#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
|
||||||
#else
|
#else
|
||||||
#define SDIO SDMMC1
|
#define SDIO SDMMC1
|
||||||
#define SDMMC_IRQHandler SDMMC1_IRQHandler
|
#define SDMMC_IRQHandler SDMMC1_IRQHandler
|
||||||
#define SDMMC_CLK_ENABLE() __HAL_RCC_SDMMC1_CLK_ENABLE()
|
#define SDMMC_CLK_ENABLE() __HAL_RCC_SDMMC1_CLK_ENABLE()
|
||||||
#define SDMMC_CLK_DISABLE() __HAL_RCC_SDMMC1_CLK_DISABLE()
|
#define SDMMC_CLK_DISABLE() __HAL_RCC_SDMMC1_CLK_DISABLE()
|
||||||
|
#define SDMMC_FORCE_RESET() __HAL_RCC_SDMMC1_FORCE_RESET()
|
||||||
|
#define SDMMC_RELEASE_RESET() __HAL_RCC_SDMMC1_RELEASE_RESET()
|
||||||
#define SDMMC_IRQn SDMMC1_IRQn
|
#define SDMMC_IRQn SDMMC1_IRQn
|
||||||
#define SDMMC_DMA dma_SDIO_0
|
#define SDMMC_DMA dma_SDIO_0
|
||||||
#define STATIC_AF_SDMMC_CK STATIC_AF_SDMMC1_CK
|
#define STATIC_AF_SDCARD_CK STATIC_AF_SDMMC1_CK
|
||||||
#define STATIC_AF_SDMMC_CMD STATIC_AF_SDMMC1_CMD
|
#define STATIC_AF_SDCARD_CMD STATIC_AF_SDMMC1_CMD
|
||||||
#define STATIC_AF_SDMMC_D0 STATIC_AF_SDMMC1_D0
|
#define STATIC_AF_SDCARD_D0 STATIC_AF_SDMMC1_D0
|
||||||
#define STATIC_AF_SDMMC_D1 STATIC_AF_SDMMC1_D1
|
#define STATIC_AF_SDCARD_D1 STATIC_AF_SDMMC1_D1
|
||||||
#define STATIC_AF_SDMMC_D2 STATIC_AF_SDMMC1_D2
|
#define STATIC_AF_SDCARD_D2 STATIC_AF_SDMMC1_D2
|
||||||
#define STATIC_AF_SDMMC_D3 STATIC_AF_SDMMC1_D3
|
#define STATIC_AF_SDCARD_D3 STATIC_AF_SDMMC1_D3
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// The F7 & L4 series calls the peripheral SDMMC rather than SDIO, so provide some
|
// The F7 & L4 series calls the peripheral SDMMC rather than SDIO, so provide some
|
||||||
@ -105,25 +114,23 @@
|
|||||||
#define SDMMC_IRQHandler SDIO_IRQHandler
|
#define SDMMC_IRQHandler SDIO_IRQHandler
|
||||||
#define SDMMC_DMA dma_SDIO_0
|
#define SDMMC_DMA dma_SDIO_0
|
||||||
#define SDIO_USE_GPDMA 1
|
#define SDIO_USE_GPDMA 1
|
||||||
#define STATIC_AF_SDMMC_CK STATIC_AF_SDIO_CK
|
#define STATIC_AF_SDCARD_CK STATIC_AF_SDIO_CK
|
||||||
#define STATIC_AF_SDMMC_CMD STATIC_AF_SDIO_CMD
|
#define STATIC_AF_SDCARD_CMD STATIC_AF_SDIO_CMD
|
||||||
#define STATIC_AF_SDMMC_D0 STATIC_AF_SDIO_D0
|
#define STATIC_AF_SDCARD_D0 STATIC_AF_SDIO_D0
|
||||||
#define STATIC_AF_SDMMC_D1 STATIC_AF_SDIO_D1
|
#define STATIC_AF_SDCARD_D1 STATIC_AF_SDIO_D1
|
||||||
#define STATIC_AF_SDMMC_D2 STATIC_AF_SDIO_D2
|
#define STATIC_AF_SDCARD_D2 STATIC_AF_SDIO_D2
|
||||||
#define STATIC_AF_SDMMC_D3 STATIC_AF_SDIO_D3
|
#define STATIC_AF_SDCARD_D3 STATIC_AF_SDIO_D3
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// If no custom SDIO pins defined, use the default ones
|
// If no custom SDIO pins defined, use the default ones
|
||||||
#ifndef MICROPY_HW_SDMMC_CK
|
#ifndef MICROPY_HW_SDCARD_CK
|
||||||
|
#define MICROPY_HW_SDCARD_D0 (pin_C8)
|
||||||
#define MICROPY_HW_SDMMC_D0 (pin_C8)
|
#define MICROPY_HW_SDCARD_D1 (pin_C9)
|
||||||
#define MICROPY_HW_SDMMC_D1 (pin_C9)
|
#define MICROPY_HW_SDCARD_D2 (pin_C10)
|
||||||
#define MICROPY_HW_SDMMC_D2 (pin_C10)
|
#define MICROPY_HW_SDCARD_D3 (pin_C11)
|
||||||
#define MICROPY_HW_SDMMC_D3 (pin_C11)
|
#define MICROPY_HW_SDCARD_CK (pin_C12)
|
||||||
#define MICROPY_HW_SDMMC_CK (pin_C12)
|
#define MICROPY_HW_SDCARD_CMD (pin_D2)
|
||||||
#define MICROPY_HW_SDMMC_CMD (pin_D2)
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PYB_SDMMC_FLAG_SD (0x01)
|
#define PYB_SDMMC_FLAG_SD (0x01)
|
||||||
@ -152,26 +159,13 @@ void sdcard_init(void) {
|
|||||||
// Note: the mp_hal_pin_config function will configure the GPIO in
|
// Note: the mp_hal_pin_config function will configure the GPIO in
|
||||||
// fast mode which can do up to 50MHz. This should be plenty for SDIO
|
// fast mode which can do up to 50MHz. This should be plenty for SDIO
|
||||||
// which clocks up to 25MHz maximum.
|
// which clocks up to 25MHz maximum.
|
||||||
#if defined(MICROPY_HW_SDMMC2_CK)
|
mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_CK, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_CK);
|
||||||
// Use SDMMC2 peripheral with pins provided by the board's config
|
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_SDMMC2_CK, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDMMC2_CK);
|
mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_D0, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_D0);
|
||||||
mp_hal_pin_config_alt_static(MICROPY_HW_SDMMC2_CMD, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDMMC2_CMD);
|
#if MICROPY_HW_SDCARD_BUS_WIDTH == 4
|
||||||
mp_hal_pin_config_alt_static(MICROPY_HW_SDMMC2_D0, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDMMC2_D0);
|
mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_D1, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_D1);
|
||||||
#if MICROPY_HW_SDMMC_BUS_WIDTH == 4
|
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_SDMMC2_D1, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDMMC2_D1);
|
mp_hal_pin_config_alt_static(MICROPY_HW_SDCARD_D3, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDCARD_D3);
|
||||||
mp_hal_pin_config_alt_static(MICROPY_HW_SDMMC2_D2, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDMMC2_D2);
|
|
||||||
mp_hal_pin_config_alt_static(MICROPY_HW_SDMMC2_D3, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDMMC2_D3);
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
// Default SDIO/SDMMC1 config
|
|
||||||
mp_hal_pin_config_alt_static(MICROPY_HW_SDMMC_CK, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDMMC_CK);
|
|
||||||
mp_hal_pin_config_alt_static(MICROPY_HW_SDMMC_CMD, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDMMC_CMD);
|
|
||||||
mp_hal_pin_config_alt_static(MICROPY_HW_SDMMC_D0, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDMMC_D0);
|
|
||||||
#if MICROPY_HW_SDMMC_BUS_WIDTH == 4
|
|
||||||
mp_hal_pin_config_alt_static(MICROPY_HW_SDMMC_D1, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDMMC_D1);
|
|
||||||
mp_hal_pin_config_alt_static(MICROPY_HW_SDMMC_D2, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDMMC_D2);
|
|
||||||
mp_hal_pin_config_alt_static(MICROPY_HW_SDMMC_D3, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_UP, STATIC_AF_SDMMC_D3);
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// configure the SD card detect pin
|
// configure the SD card detect pin
|
||||||
@ -187,13 +181,8 @@ STATIC void sdmmc_msp_init(void) {
|
|||||||
|
|
||||||
#if defined(STM32H7)
|
#if defined(STM32H7)
|
||||||
// Reset SDMMC
|
// Reset SDMMC
|
||||||
#if defined(MICROPY_HW_SDMMC2_CK)
|
SDMMC_FORCE_RESET();
|
||||||
__HAL_RCC_SDMMC2_FORCE_RESET();
|
SDMMC_RELEASE_RESET();
|
||||||
__HAL_RCC_SDMMC2_RELEASE_RESET();
|
|
||||||
#else
|
|
||||||
__HAL_RCC_SDMMC1_FORCE_RESET();
|
|
||||||
__HAL_RCC_SDMMC1_RELEASE_RESET();
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// NVIC configuration for SDIO interrupts
|
// NVIC configuration for SDIO interrupts
|
||||||
@ -263,7 +252,7 @@ STATIC HAL_StatusTypeDef sdmmc_init_sd(void) {
|
|||||||
mp_hal_delay_ms(50);
|
mp_hal_delay_ms(50);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MICROPY_HW_SDMMC_BUS_WIDTH == 4
|
#if MICROPY_HW_SDCARD_BUS_WIDTH == 4
|
||||||
// configure the SD bus width for 4-bit wide operation
|
// configure the SD bus width for 4-bit wide operation
|
||||||
status = HAL_SD_ConfigWideBusOperation(&sdmmc_handle.sd, SDIO_BUS_WIDE_4B);
|
status = HAL_SD_ConfigWideBusOperation(&sdmmc_handle.sd, SDIO_BUS_WIDE_4B);
|
||||||
if (status != HAL_OK) {
|
if (status != HAL_OK) {
|
||||||
@ -298,7 +287,7 @@ STATIC HAL_StatusTypeDef sdmmc_init_mmc(void) {
|
|||||||
// As this is an eMMC card, overwrite LogBlockNbr with actual value
|
// As this is an eMMC card, overwrite LogBlockNbr with actual value
|
||||||
sdmmc_handle.mmc.MmcCard.LogBlockNbr = 7469056 + 2048;
|
sdmmc_handle.mmc.MmcCard.LogBlockNbr = 7469056 + 2048;
|
||||||
|
|
||||||
#if MICROPY_HW_SDMMC_BUS_WIDTH == 4
|
#if MICROPY_HW_SDCARD_BUS_WIDTH == 4
|
||||||
// Configure the SDIO bus width for 4-bit wide operation
|
// Configure the SDIO bus width for 4-bit wide operation
|
||||||
#ifdef STM32F7
|
#ifdef STM32F7
|
||||||
sdmmc_handle.mmc.Init.ClockBypass = SDIO_CLOCK_BYPASS_ENABLE;
|
sdmmc_handle.mmc.Init.ClockBypass = SDIO_CLOCK_BYPASS_ENABLE;
|
||||||
|
Loading…
Reference in New Issue
Block a user