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

Reply via email to