mxrt685: Add USDHC support for RT685

Add USDHC support for RT685

Signed-off-by: Mahesh Mahadevan <mahesh.mahadevan@nxp.com>
This commit is contained in:
Mahesh Mahadevan 2021-08-11 15:51:37 -05:00 committed by Christopher Friedt
commit cc170c8158
9 changed files with 287 additions and 0 deletions

View file

@ -38,4 +38,7 @@ config HEAP_MEM_POOL_SIZE
endif # DMA_MCUX_LPC endif # DMA_MCUX_LPC
config DISK_DRIVER_SDMMC
default y if DISK_DRIVERS
endif # BOARD_MIMXRT685_EVK endif # BOARD_MIMXRT685_EVK

View file

@ -91,6 +91,8 @@ features:
+-----------+------------+-------------------------------------+ +-----------+------------+-------------------------------------+
| WDT | on-chip | watchdog | | WDT | on-chip | watchdog |
+-----------+------------+-------------------------------------+ +-----------+------------+-------------------------------------+
| SDHC | on-chip | disk access |
+-----------+------------+-------------------------------------+
The default configuration can be found in the defconfig file: The default configuration can be found in the defconfig file:
@ -165,6 +167,24 @@ functionality of a pin.
+---------+-----------------+----------------------------+ +---------+-----------------+----------------------------+
| PIO0_27 | SCT0_OUT7 | PWM | | PIO0_27 | SCT0_OUT7 | PWM |
+---------+-----------------+----------------------------+ +---------+-----------------+----------------------------+
| PIO1_30 | SD0_CLK | SD card |
+---------+-----------------+----------------------------+
| PIO1_31 | SD0_CMD | SD card |
+---------+-----------------+----------------------------+
| PIO2_0 | SD0_D0 | SD card |
+---------+-----------------+----------------------------+
| PIO2_1 | SD0_D1 | SD card |
+---------+-----------------+----------------------------+
| PIO2_2 | SD0_D2 | SD card |
+---------+-----------------+----------------------------+
| PIO2_3 | SD0_D3 | SD card |
+---------+-----------------+----------------------------+
| PIO2_4 | SD0_WR_PRT | SD card |
+---------+-----------------+----------------------------+
| PIO2_9 | SD0_CD | SD card |
+---------+-----------------+----------------------------+
| PIO2_10 | SD0_RST | SD card |
+---------+-----------------+----------------------------+
System Clock System Clock
============ ============

View file

@ -253,6 +253,10 @@ i2s1: &flexcomm3 {
status = "okay"; status = "okay";
}; };
&gpio2 {
status = "okay";
};
&dma0 { &dma0 {
/* /*
* The total number of dma channels available is defined by * The total number of dma channels available is defined by
@ -293,3 +297,8 @@ i2s1: &flexcomm3 {
&sc_timer { &sc_timer {
status = "okay"; status = "okay";
}; };
&usdhc1 {
status = "okay";
pwr-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>;
};

View file

@ -25,5 +25,6 @@ supported:
- hwinfo - hwinfo
- i2c - i2c
- i2s - i2s
- sdhc
- spi - spi
- watchdog - watchdog

View file

@ -768,6 +768,197 @@ static int mimxrt685_evk_pinmux_init(const struct device *dev)
IOPCTL_PinMuxSet(IOPCTL, 0U, 31U, port0_pin31_config); IOPCTL_PinMuxSet(IOPCTL, 0U, 31U, port0_pin31_config);
#endif #endif
#endif
#if DT_NODE_HAS_STATUS(DT_NODELABEL(usdhc1), okay) && CONFIG_DISK_DRIVER_SDMMC
uint32_t port1_pin30_config = (/* Pin is configured as SD0_CLK */
IOPCTL_PIO_FUNC1 |
/* Disable pull-up / pull-down function */
IOPCTL_PIO_PUPD_DI |
/* Enable pull-down function */
IOPCTL_PIO_PULLDOWN_EN |
/* Enables input buffer function */
IOPCTL_PIO_INBUF_EN |
/* Normal mode */
IOPCTL_PIO_SLEW_RATE_NORMAL |
/* Normal drive */
IOPCTL_PIO_FULLDRIVE_DI |
/* Analog mux is disabled */
IOPCTL_PIO_ANAMUX_DI |
/* Pseudo Output Drain is disabled */
IOPCTL_PIO_PSEDRAIN_DI |
/* Input function is not inverted */
IOPCTL_PIO_INV_DI);
/* PORT1 PIN30 (coords: P10) is configured as SD0_CLK */
IOPCTL_PinMuxSet(IOPCTL, 1U, 30U, port1_pin30_config);
uint32_t port1_pin31_config = (/* Pin is configured as SD0_CMD */
IOPCTL_PIO_FUNC1 |
/* Enable pull-up / pull-down function */
IOPCTL_PIO_PUPD_EN |
/* Enable pull-up function */
IOPCTL_PIO_PULLUP_EN |
/* Enables input buffer function */
IOPCTL_PIO_INBUF_EN |
/* Normal mode */
IOPCTL_PIO_SLEW_RATE_NORMAL |
/* Normal drive */
IOPCTL_PIO_FULLDRIVE_DI |
/* Analog mux is disabled */
IOPCTL_PIO_ANAMUX_DI |
/* Pseudo Output Drain is disabled */
IOPCTL_PIO_PSEDRAIN_DI |
/* Input function is not inverted */
IOPCTL_PIO_INV_DI);
/* PORT1 PIN31 (coords: R9) is configured as SD0_CMD */
IOPCTL_PinMuxSet(IOPCTL, 1U, 31U, port1_pin31_config);
uint32_t port2_pin0_config = (/* Pin is configured as SD0_D0 */
IOPCTL_PIO_FUNC1 |
/* Enable pull-up / pull-down function */
IOPCTL_PIO_PUPD_EN |
/* Enable pull-up function */
IOPCTL_PIO_PULLUP_EN |
/* Enables input buffer function */
IOPCTL_PIO_INBUF_EN |
/* Normal mode */
IOPCTL_PIO_SLEW_RATE_NORMAL |
/* Normal drive */
IOPCTL_PIO_FULLDRIVE_DI |
/* Analog mux is disabled */
IOPCTL_PIO_ANAMUX_DI |
/* Pseudo Output Drain is disabled */
IOPCTL_PIO_PSEDRAIN_DI |
/* Input function is not inverted */
IOPCTL_PIO_INV_DI);
/* PORT2 PIN0 (coords: R11) is configured as SD0_D0 */
IOPCTL_PinMuxSet(IOPCTL, 2U, 0U, port2_pin0_config);
uint32_t port2_pin1_config = (/* Pin is configured as SD0_D1 */
IOPCTL_PIO_FUNC1 |
/* Enable pull-up / pull-down function */
IOPCTL_PIO_PUPD_EN |
/* Enable pull-up function */
IOPCTL_PIO_PULLUP_EN |
/* Enables input buffer function */
IOPCTL_PIO_INBUF_EN |
/* Normal mode */
IOPCTL_PIO_SLEW_RATE_NORMAL |
/* Normal drive */
IOPCTL_PIO_FULLDRIVE_DI |
/* Analog mux is disabled */
IOPCTL_PIO_ANAMUX_DI |
/* Pseudo Output Drain is disabled */
IOPCTL_PIO_PSEDRAIN_DI |
/* Input function is not inverted */
IOPCTL_PIO_INV_DI);
/* PORT2 PIN1 (coords: T11) is configured as SD0_D1 */
IOPCTL_PinMuxSet(IOPCTL, 2U, 1U, port2_pin1_config);
uint32_t port2_pin10_config = (/* Pin is configured as PIO2_10 */
IOPCTL_PIO_FUNC0 |
/* Disable pull-up / pull-down function */
IOPCTL_PIO_PUPD_DI |
/* Enable pull-down function */
IOPCTL_PIO_PULLDOWN_EN |
/* Disable input buffer function */
IOPCTL_PIO_INBUF_DI |
/* Normal mode */
IOPCTL_PIO_SLEW_RATE_NORMAL |
/* Normal drive */
IOPCTL_PIO_FULLDRIVE_DI |
/* Analog mux is disabled */
IOPCTL_PIO_ANAMUX_DI |
/* Pseudo Output Drain is disabled */
IOPCTL_PIO_PSEDRAIN_DI |
/* Input function is not inverted */
IOPCTL_PIO_INV_DI);
/* PORT2 PIN10 (coords: T15) is configured as PIO2_10 */
IOPCTL_PinMuxSet(IOPCTL, 2U, 10U, port2_pin10_config);
uint32_t port2_pin2_config = (/* Pin is configured as SD0_D2 */
IOPCTL_PIO_FUNC1 |
/* Enable pull-up / pull-down function */
IOPCTL_PIO_PUPD_EN |
/* Enable pull-up function */
IOPCTL_PIO_PULLUP_EN |
/* Enables input buffer function */
IOPCTL_PIO_INBUF_EN |
/* Normal mode */
IOPCTL_PIO_SLEW_RATE_NORMAL |
/* Normal drive */
IOPCTL_PIO_FULLDRIVE_DI |
/* Analog mux is disabled */
IOPCTL_PIO_ANAMUX_DI |
/* Pseudo Output Drain is disabled */
IOPCTL_PIO_PSEDRAIN_DI |
/* Input function is not inverted */
IOPCTL_PIO_INV_DI);
/* PORT2 PIN2 (coords: U11) is configured as SD0_D2 */
IOPCTL_PinMuxSet(IOPCTL, 2U, 2U, port2_pin2_config);
uint32_t port2_pin3_config = (/* Pin is configured as SD0_D3 */
IOPCTL_PIO_FUNC1 |
/* Enable pull-up / pull-down function */
IOPCTL_PIO_PUPD_EN |
/* Enable pull-up function */
IOPCTL_PIO_PULLUP_EN |
/* Enables input buffer function */
IOPCTL_PIO_INBUF_EN |
/* Normal mode */
IOPCTL_PIO_SLEW_RATE_NORMAL |
/* Normal drive */
IOPCTL_PIO_FULLDRIVE_DI |
/* Analog mux is disabled */
IOPCTL_PIO_ANAMUX_DI |
/* Pseudo Output Drain is disabled */
IOPCTL_PIO_PSEDRAIN_DI |
/* Input function is not inverted */
IOPCTL_PIO_INV_DI);
/* PORT2 PIN3 (coords: T12) is configured as SD0_D3 */
IOPCTL_PinMuxSet(IOPCTL, 2U, 3U, port2_pin3_config);
uint32_t port2_pin4_config = (/* Pin is configured as PIO2_4 */
IOPCTL_PIO_FUNC0 |
/* Disable pull-up / pull-down function */
IOPCTL_PIO_PUPD_DI |
/* Enable pull-down function */
IOPCTL_PIO_PULLDOWN_EN |
/* Disable input buffer function */
IOPCTL_PIO_INBUF_DI |
/* Normal mode */
IOPCTL_PIO_SLEW_RATE_NORMAL |
/* Normal drive */
IOPCTL_PIO_FULLDRIVE_DI |
/* Analog mux is disabled */
IOPCTL_PIO_ANAMUX_DI |
/* Pseudo Output Drain is disabled */
IOPCTL_PIO_PSEDRAIN_DI |
/* Input function is not inverted */
IOPCTL_PIO_INV_DI);
/* PORT2 PIN4 (coords: T13) is configured as PIO2_4 */
IOPCTL_PinMuxSet(IOPCTL, 2U, 4U, port2_pin4_config);
uint32_t port2_pin9_config = (/* Pin is configured as SD0_CARD_DET_N */
IOPCTL_PIO_FUNC1 |
/* Enable pull-up / pull-down function */
IOPCTL_PIO_PUPD_EN |
/* Enable pull-up function */
IOPCTL_PIO_PULLUP_EN |
/* Enables input buffer function */
IOPCTL_PIO_INBUF_EN |
/* Normal mode */
IOPCTL_PIO_SLEW_RATE_NORMAL |
/* Normal drive */
IOPCTL_PIO_FULLDRIVE_DI |
/* Analog mux is disabled */
IOPCTL_PIO_ANAMUX_DI |
/* Pseudo Output Drain is disabled */
IOPCTL_PIO_PSEDRAIN_DI |
/* Input function is not inverted */
IOPCTL_PIO_INV_DI);
/* PORT2 PIN9 (coords: R13) is configured as SD0_CARD_DET_N */
IOPCTL_PinMuxSet(IOPCTL, 2U, 9U, port2_pin9_config);
#endif #endif
return 0; return 0;

View file

@ -277,6 +277,24 @@
clk-divider = <1>; clk-divider = <1>;
label = "WWDT_1"; label = "WWDT_1";
}; };
usdhc1: usdhc@136000 {
compatible = "nxp,imx-usdhc";
reg = <0x136000 0x4000>;
status = "disabled";
interrupts = <45 0>;
clocks = <&clkctl1 MCUX_USDHC1_CLK>;
label = "USDHC_1";
};
usdhc2: usdhc@137000 {
compatible = "nxp,imx-usdhc";
reg = <0x137000 0x4000>;
status = "disabled";
interrupts = <46 0>;
clocks = <&clkctl1 MCUX_USDHC2_CLK>;
label = "USDHC_2";
};
}; };
&nvic { &nvic {

View file

@ -25,6 +25,8 @@ config SOC_MIMXRT685S_CM33
select HAS_MCUX_LPC_RTC select HAS_MCUX_LPC_RTC
select HAS_MCUX_TRNG select HAS_MCUX_TRNG
select HAS_MCUX_SCTIMER select HAS_MCUX_SCTIMER
select HAS_MCUX_USDHC1
select HAS_MCUX_USDHC2
select INIT_SYS_PLL select INIT_SYS_PLL
endchoice endchoice

View file

@ -171,6 +171,7 @@ static ALWAYS_INLINE void clock_init(void)
/* attach AUDIO PLL clock to FLEXCOMM3 (I2S3) */ /* attach AUDIO PLL clock to FLEXCOMM3 (I2S3) */
CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM3); CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM3);
#endif #endif
#if (DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(wwdt0), nxp_lpc_wwdt, okay)) #if (DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(wwdt0), nxp_lpc_wwdt, okay))
CLOCK_AttachClk(kLPOSC_to_WDT0_CLK); CLOCK_AttachClk(kLPOSC_to_WDT0_CLK);
#else #else
@ -179,9 +180,34 @@ static ALWAYS_INLINE void clock_init(void)
*/ */
CLOCK_AttachClk(kNONE_to_WDT0_CLK); CLOCK_AttachClk(kNONE_to_WDT0_CLK);
#endif #endif
#if DT_NODE_HAS_STATUS(DT_NODELABEL(usdhc1), okay) && CONFIG_DISK_DRIVER_SDMMC
/* Make sure USDHC ram buffer has been power up*/
POWER_DisablePD(kPDRUNCFG_APD_USDHC0_SRAM);
POWER_DisablePD(kPDRUNCFG_PPD_USDHC0_SRAM);
POWER_DisablePD(kPDRUNCFG_PD_LPOSC);
POWER_ApplyPD();
/* usdhc depend on 32K clock also */
CLOCK_AttachClk(kLPOSC_DIV32_to_32KHZWAKE_CLK);
CLOCK_AttachClk(kAUX0_PLL_to_SDIO0_CLK);
CLOCK_SetClkDiv(kCLOCK_DivSdio0Clk, 1);
CLOCK_EnableClock(kCLOCK_Sdio0);
RESET_PeripheralReset(kSDIO0_RST_SHIFT_RSTn);
#endif
#endif /* CONFIG_SOC_MIMXRT685S_CM33 */ #endif /* CONFIG_SOC_MIMXRT685S_CM33 */
} }
#if (DT_NODE_HAS_STATUS(DT_NODELABEL(usdhc1), okay) && CONFIG_DISK_DRIVER_SDMMC)
void imxrt_usdhc_pinmux(uint16_t nusdhc, bool init,
uint32_t speed, uint32_t strength)
{
}
#endif
/** /**
* *
* @brief Perform basic hardware initialization * @brief Perform basic hardware initialization

View file

@ -75,4 +75,21 @@
/*!<@brief Slow mode */ /*!<@brief Slow mode */
#define IOPCTL_PIO_SLEW_RATE_SLOW 0x80u #define IOPCTL_PIO_SLEW_RATE_SLOW 0x80u
#ifdef __cplusplus
extern "C" {
#endif
#if CONFIG_DISK_DRIVER_SDMMC && \
(DT_NODE_HAS_STATUS(DT_NODELABEL(usdhc1), okay) || \
DT_NODE_HAS_STATUS(DT_NODELABEL(usdhc2), okay))
void imxrt_usdhc_pinmux(uint16_t nusdhc,
bool init, uint32_t speed, uint32_t strength);
#endif
#ifdef __cplusplus
}
#endif
#endif /* _SOC__H_ */ #endif /* _SOC__H_ */