This is an automated email from the ASF dual-hosted git repository. xiaoxiang781216 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 78abd2d7bf84ad49468a89812d03d5c5d5e7b4c0 Author: Jukka Laitinen <[email protected]> AuthorDate: Tue Oct 6 15:05:00 2026 +0300 arch/arm/imxrt: Add SDCARD support for imxrt1180-evk:nsh board Add uSD card driver configuration for 4-bit, HS mode 50MHz - Add root clock configuration for the uSDHC - Add pin muxing for the uSD card - Add fat_dma_alloc and fat_dma_free functions - Initialize the usdhc driver in board's init Signed-off-by: Jukka Laitinen <[email protected]> --- .../arm/imxrt/imxrt1180-evk/configs/nsh/defconfig | 14 +++++ boards/arm/imxrt/imxrt1180-evk/include/board.h | 69 ++++++++++++++++++++++ boards/arm/imxrt/imxrt1180-evk/src/Makefile | 2 +- boards/arm/imxrt/imxrt1180-evk/src/imxrt1180-evk.h | 2 +- boards/arm/imxrt/imxrt1180-evk/src/imxrt_bringup.c | 49 ++++++++++++++- .../imxrt/imxrt1180-evk/src/imxrt_clockconfig_m7.c | 7 ++- .../arm/imxrt/imxrt1180-evk/src/imxrt_dma_alloc.c | 26 ++++++++ 7 files changed, 165 insertions(+), 4 deletions(-) diff --git a/boards/arm/imxrt/imxrt1180-evk/configs/nsh/defconfig b/boards/arm/imxrt/imxrt1180-evk/configs/nsh/defconfig index 2306538993b..b1edc074312 100644 --- a/boards/arm/imxrt/imxrt1180-evk/configs/nsh/defconfig +++ b/boards/arm/imxrt/imxrt1180-evk/configs/nsh/defconfig @@ -17,6 +17,7 @@ CONFIG_ARCH_IRQBUTTONS=y CONFIG_ARCH_STACKDUMP=y CONFIG_ARMV7M_DCACHE=y CONFIG_ARMV7M_ICACHE=y +CONFIG_BCH_BUFFER_ALIGNMENT=64 CONFIG_BINFMT_DISABLE=y CONFIG_BOARD_LOOPSPERMSEC=159610 CONFIG_BUILTIN=y @@ -39,6 +40,12 @@ CONFIG_EXAMPLES_BUTTONS=y CONFIG_EXAMPLES_BUTTONS_NAME0="SW8" CONFIG_EXAMPLES_BUTTONS_NAMES=y CONFIG_EXAMPLES_BUTTONS_QTD=1 +CONFIG_FAT_DMAMEMORY=y +CONFIG_FAT_FORCE_INDIRECT=y +CONFIG_FAT_LCNAMES=y +CONFIG_FAT_LFN=y +CONFIG_FS_FAT=y +CONFIG_FS_FATTIME=y CONFIG_FS_NAMED_SEMAPHORES=y CONFIG_FS_PROCFS=y CONFIG_GRAN=y @@ -49,6 +56,9 @@ CONFIG_IMXRT_LPUART1=y CONFIG_IMXRT_OCRAM_HEAP=y CONFIG_IMXRT_TCM_PRIMARY=y CONFIG_IMXRT_USBDEV=y +CONFIG_IMXRT_USDHC1=y +CONFIG_IMXRT_USDHC1_SD_HS_MODE=y +CONFIG_IMXRT_USDHC1_WIDTH_D1_D4=y CONFIG_INIT_ENTRYPOINT="nsh_main" CONFIG_INIT_STACKSIZE=8192 CONFIG_INPUT=y @@ -60,6 +70,9 @@ CONFIG_LINE_MAX=64 CONFIG_LPUART1_RXDMA=y CONFIG_LPUART1_SERIAL_CONSOLE=y CONFIG_LPUART1_TXDMA=y +CONFIG_MKFATFS_BUFFER_ALIGNMENT=64 +CONFIG_MMCSD=y +CONFIG_MMCSD_SDIO=y CONFIG_MM_REGIONS=2 CONFIG_NSH_BUILTIN_APPS=y CONFIG_NSH_DISABLE_IFUPDOWN=y @@ -77,6 +90,7 @@ CONFIG_SCHED_HPWORK=y CONFIG_SCHED_SPORADIC=y CONFIG_SCHED_THREAD_LOCAL=y CONFIG_SCHED_WAITPID=y +CONFIG_SDIO_BLOCKSETUP=y CONFIG_SIG_EVTHREAD=y CONFIG_START_MONTH=9 CONFIG_SYSTEM_CDCACM=y diff --git a/boards/arm/imxrt/imxrt1180-evk/include/board.h b/boards/arm/imxrt/imxrt1180-evk/include/board.h index 1ef648dc8c9..0d647ae3dc9 100644 --- a/boards/arm/imxrt/imxrt1180-evk/include/board.h +++ b/boards/arm/imxrt/imxrt1180-evk/include/board.h @@ -127,6 +127,75 @@ #define GPIO_LPSPI1_MISO IOMUX_PIN(IOMUXC_PAD_GPIO_AON_07_LPSPI1_SDI, \ IOMUX_LPSPI_DEFAULT, IOMUXC_MUX_SION_ON) +/* USDHC1: microSD card slot. + * GPIO_SD_B1_00 -> USDHC1_CMD + * GPIO_SD_B1_01 -> USDHC1_CLK + * GPIO_SD_B1_02 -> USDHC1_DATA0 + * GPIO_SD_B1_03 -> USDHC1_DATA1 + * GPIO_SD_B1_04 -> USDHC1_DATA2 + * GPIO_SD_B1_05 -> USDHC1_DATA3 + * GPIO_AD_15 -> card detect (plain GPIO, active low) + * GPIO_AD_14 -> card power enable (active low) + * GPIO_AD_34 -> I/O voltage select (low keeps 3.3 V signalling) + */ + +#define IOMUX_USDHC1_CLK_DEFAULT (IOMUXC_PAD_PDRV_HIGH | IOMUXC_PAD_PULL_NONE) +#define IOMUX_USDHC1_CMD_DEFAULT (IOMUXC_PAD_PDRV_HIGH | IOMUXC_PAD_PULL_UP) +#define IOMUX_USDHC1_DATA_DEFAULT (IOMUXC_PAD_PDRV_HIGH | IOMUXC_PAD_PULL_UP) +#define IOMUX_USDHC1_CD_DEFAULT (IOMUXC_PAD_DSE | IOMUXC_PAD_PUE | \ + IOMUXC_PAD_PUS) + +#define PIN_USDHC1_CMD IOMUX_PIN(IOMUXC_PAD_GPIO_SD_B1_00_USDHC1_CMD, \ + IOMUX_USDHC1_CMD_DEFAULT, 0) +#define PIN_USDHC1_DCLK IOMUX_PIN(IOMUXC_PAD_GPIO_SD_B1_01_USDHC1_CLK, \ + IOMUX_USDHC1_CLK_DEFAULT, 0) +#define PIN_USDHC1_D0 IOMUX_PIN(IOMUXC_PAD_GPIO_SD_B1_02_USDHC1_DATA0, \ + IOMUX_USDHC1_DATA_DEFAULT, 0) +#define PIN_USDHC1_D1 IOMUX_PIN(IOMUXC_PAD_GPIO_SD_B1_03_USDHC1_DATA1, \ + IOMUX_USDHC1_DATA_DEFAULT, 0) +#define PIN_USDHC1_D2 IOMUX_PIN(IOMUXC_PAD_GPIO_SD_B1_04_USDHC1_DATA2, \ + IOMUX_USDHC1_DATA_DEFAULT, 0) +#define PIN_USDHC1_D3 IOMUX_PIN(IOMUXC_PAD_GPIO_SD_B1_05_USDHC1_DATA3, \ + IOMUX_USDHC1_DATA_DEFAULT, 0) + +#define PIN_USDHC1_CD_GPIO IOMUX_GPIO(IOMUXC_PAD_GPIO_AD_15_GPIO4_IO15, \ + IOMUX_USDHC1_CD_DEFAULT, \ + GPIO_INPUT | GPIO_PORT4 | GPIO_PIN15) + +#define IOMUX_SDCARD_DEFAULT (IOMUXC_PAD_DSE) + +#define GPIO_SD_PWREN IOMUX_GPIO(IOMUXC_PAD_GPIO_AD_14_GPIO4_IO14, \ + IOMUX_SDCARD_DEFAULT, \ + GPIO_OUTPUT | GPIO_OUTPUT_ZERO | \ + GPIO_PORT4 | GPIO_PIN14) + +#define GPIO_SD1_VSELECT IOMUX_GPIO(IOMUXC_PAD_GPIO_AD_34_GPIO5_IO02, \ + IOMUX_SDCARD_DEFAULT, \ + GPIO_OUTPUT | GPIO_OUTPUT_ZERO | \ + GPIO_PORT5 | GPIO_PIN2) + +/* USDHC clock dividers used by arch/arm/src/imxrt/imxrt_usdhc.c. The + * uSDHC1 root clock is configured to 198 MHz (SYS_PLL2_PFD2 / 2); see + * the usdhc1_clk_root entry in imxrt_clockconfig_m7.c. + */ + +#define BOARD_USDHC_IDMODE_PRESCALER USDHC_SYSCTL_SDCLKFS_DIV256 +#define BOARD_USDHC_IDMODE_DIVISOR USDHC_SYSCTL_DVS_DIV(2) + +#define BOARD_USDHC_MMCMODE_PRESCALER USDHC_SYSCTL_SDCLKFS_DIV8 +#define BOARD_USDHC_MMCMODE_DIVISOR USDHC_SYSCTL_DVS_DIV(1) + +#define BOARD_USDHC_SD1MODE_PRESCALER USDHC_SYSCTL_SDCLKFS_DIV8 +#define BOARD_USDHC_SD1MODE_DIVISOR USDHC_SYSCTL_DVS_DIV(1) + +#define BOARD_USDHC_SD4MODE_PRESCALER USDHC_SYSCTL_SDCLKFS_DIV8 +#define BOARD_USDHC_SD4MODE_DIVISOR USDHC_SYSCTL_DVS_DIV(1) + +/* SD high speed mode (wide 4-bit, up to 50 MHz): 198 MHz / 4 = 49.5 MHz. */ + +#define BOARD_USDHC_SD4MODE_HS_PRESCALER USDHC_SYSCTL_SDCLKFS_DIV4 +#define BOARD_USDHC_SD4MODE_HS_DIVISOR USDHC_SYSCTL_DVS_DIV(1) + /* Buttons ******************************************************************/ /* The MIMXRT1180-EVK has one general purpose user button, SW8 ("GPIO INT diff --git a/boards/arm/imxrt/imxrt1180-evk/src/Makefile b/boards/arm/imxrt/imxrt1180-evk/src/Makefile index b0a5d88de7e..1edecdcaa63 100644 --- a/boards/arm/imxrt/imxrt1180-evk/src/Makefile +++ b/boards/arm/imxrt/imxrt1180-evk/src/Makefile @@ -46,7 +46,7 @@ ifeq ($(CONFIG_ARCH_BUTTONS),y) CSRCS += imxrt_buttons.c endif -ifeq ($(CONFIG_USBDEV_DMAMEMORY),y) +ifneq ($(CONFIG_USBDEV_DMAMEMORY)$(CONFIG_FAT_DMAMEMORY),) CSRCS += imxrt_dma_alloc.c endif diff --git a/boards/arm/imxrt/imxrt1180-evk/src/imxrt1180-evk.h b/boards/arm/imxrt/imxrt1180-evk/src/imxrt1180-evk.h index 648878bb219..13229d8d6fd 100644 --- a/boards/arm/imxrt/imxrt1180-evk/src/imxrt1180-evk.h +++ b/boards/arm/imxrt/imxrt1180-evk/src/imxrt1180-evk.h @@ -38,7 +38,7 @@ int imxrt_bringup(void); -#ifdef CONFIG_USBDEV_DMAMEMORY +#if defined(CONFIG_USBDEV_DMAMEMORY) || defined(CONFIG_FAT_DMAMEMORY) int imxrt_dma_alloc_init(void); #endif diff --git a/boards/arm/imxrt/imxrt1180-evk/src/imxrt_bringup.c b/boards/arm/imxrt/imxrt1180-evk/src/imxrt_bringup.c index 34b24c59512..910b03537f5 100644 --- a/boards/arm/imxrt/imxrt1180-evk/src/imxrt_bringup.c +++ b/boards/arm/imxrt/imxrt1180-evk/src/imxrt_bringup.c @@ -28,14 +28,53 @@ #include <sys/mount.h> #include <syslog.h> +#include <errno.h> #include <nuttx/fs/fs.h> +#include <nuttx/sdio.h> +#include <nuttx/mmcsd.h> #ifdef CONFIG_INPUT_BUTTONS # include <nuttx/input/buttons.h> #endif +#include "imxrt_gpio.h" +#include "imxrt_usdhc.h" #include "imxrt1180-evk.h" +#include <arch/board/board.h> /* Must always be included last */ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +#ifdef CONFIG_IMXRT_USDHC +static int imxrt_sdmmc_initialize(void) +{ + struct sdio_dev_s *sdmmc; + int ret; + + /* Power the slot and select 3.3 V I/O signalling. */ + + imxrt_config_gpio(GPIO_SD_PWREN); + imxrt_config_gpio(GPIO_SD1_VSELECT); + + sdmmc = imxrt_usdhc_initialize(0); + if (sdmmc == NULL) + { + syslog(LOG_ERR, "ERROR: Failed to initialize USDHC1\n"); + return -ENODEV; + } + + ret = mmcsd_slotinitialize(0, sdmmc); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to bind USDHC1 to the MMC/SD " + "driver: %d\n", ret); + } + + return ret; +} +#endif /**************************************************************************** * Public Functions @@ -54,7 +93,7 @@ int imxrt_bringup(void) { int ret = OK; -#ifdef CONFIG_USBDEV_DMAMEMORY +#if defined(CONFIG_USBDEV_DMAMEMORY) || defined(CONFIG_FAT_DMAMEMORY) ret = imxrt_dma_alloc_init(); if (ret < 0) { @@ -79,5 +118,13 @@ int imxrt_bringup(void) } #endif +#ifdef CONFIG_IMXRT_USDHC + ret = imxrt_sdmmc_initialize(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: imxrt_sdmmc_initialize() failed: %d\n", ret); + } +#endif + return ret; } diff --git a/boards/arm/imxrt/imxrt1180-evk/src/imxrt_clockconfig_m7.c b/boards/arm/imxrt/imxrt1180-evk/src/imxrt_clockconfig_m7.c index 28ee4be5b31..c7a446cc358 100644 --- a/boards/arm/imxrt/imxrt1180-evk/src/imxrt_clockconfig_m7.c +++ b/boards/arm/imxrt/imxrt1180-evk/src/imxrt_clockconfig_m7.c @@ -147,7 +147,12 @@ const struct clock_configuration_s g_initial_clkconfig = }, .i3c1_clk_root = CCM_CLOCK_ROOT_DISABLE, .i3c2_clk_root = CCM_CLOCK_ROOT_DISABLE, - .usdhc1_clk_root = CCM_CLOCK_ROOT_DISABLE, + .usdhc1_clk_root = + { + .action = CCM_CLOCK_ROOT_CONFIGURE, + .div = 2, + .mux = SYS_PLL2_PFD2, + }, .usdhc2_clk_root = CCM_CLOCK_ROOT_DISABLE, .semc_clk_root = CCM_CLOCK_ROOT_IGNORE, .adc1_clk_root = CCM_CLOCK_ROOT_DISABLE, diff --git a/boards/arm/imxrt/imxrt1180-evk/src/imxrt_dma_alloc.c b/boards/arm/imxrt/imxrt1180-evk/src/imxrt_dma_alloc.c index 63f6a0e2ec5..95fb7eced73 100644 --- a/boards/arm/imxrt/imxrt1180-evk/src/imxrt_dma_alloc.c +++ b/boards/arm/imxrt/imxrt1180-evk/src/imxrt_dma_alloc.c @@ -32,7 +32,9 @@ #include <nuttx/mm/gran.h> #include <nuttx/compiler.h> +#include <nuttx/kmalloc.h> +#include "chip.h" #include "imxrt1180-evk.h" #if defined(CONFIG_GRAN) @@ -160,3 +162,27 @@ void usbdev_dma_free(void *mem) } #endif /* CONFIG_GRAN */ + +/**************************************************************************** + * Name: fat_dma_alloc and fat_dma_free + * + * Description: + * Allocate/free a cache-line-aligned buffer for the FAT filesystem's + * sector buffers (see CONFIG_FAT_DMAMEMORY). DTCM addresses are + * DMA-reachable via imxrt_usdhc.c's address translation, so a plain, + * suitably-aligned heap allocation is all that is needed here -- no + * special memory region required. + * + ****************************************************************************/ + +#ifdef CONFIG_FAT_DMAMEMORY +void *fat_dma_alloc(size_t size) +{ + return kmm_memalign(ARMV7M_DCACHE_LINESIZE, size); +} + +void fat_dma_free(void *memory, size_t size) +{ + kmm_free(memory); +} +#endif
