Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions boards/nxp/frdm_imx93/Kconfig.defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,11 @@ endif # NETWORKING

endif # BOARD_FRDM_IMX93_MIMX9352_A55

if IMX_USDHC

config GPIO
default y

endif # IMX_USDHC

endif # BOARD_FRDM_IMX93
31 changes: 31 additions & 0 deletions boards/nxp/frdm_imx93/doc/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,37 @@ Serial Port
This board configuration uses a single serial communication channel with the
CPU's UART2 for A55 core and M33 core.

uSDHC (SD or eMMC Interface on A55)
-----------------------------------

i.MX 93 processor has three Ultra Secure Digital Host Controller (uSDHC) modules
for SD/eMMC interface support. On the FRDM-IMX93 board, the uSDHC2 interface of
the processor connects to the MicroSD card slot (P13), and uSDHC1 interface connects
to the eMMC memory (located at the SOM board). DTS overlay file "usdhc1.overlay" and
"usdhc2.overlay" are provided to enable specified the uSDHC controller.

Currently it relies on U-boot or Linux to boot Zephyr on Cortex-A Core, so Zephyr needs
to use a different uSDHC controller from U-boot or Linux to avoid resource conflict.
For example, if FRDM-IMX93 board boots from SD Card which uses uSDHC2, Zephyr can use MMC
which uses uSDHC1 for testing:

.. zephyr-app-commands::
:zephyr-app: tests/subsys/sd/mmc
:host-os: unix
:board: frdm_imx93/mimx9352/a55
:goals: build
:gen-args: -DEXTRA_DTC_OVERLAY_FILE=usdhc1.overlay

And if FRDM-IMX93 board boots from MMC which uses uSDHC1, Zephyr can use SD Card which uses
uSDHC2 for testing:

.. zephyr-app-commands::
:zephyr-app: tests/subsys/sd/sdmmc
:host-os: unix
:board: frdm_imx93/mimx9352/a55
:goals: build
:gen-args: -DEXTRA_DTC_OVERLAY_FILE=usdhc2.overlay

User Button GPIO Option
--------------------------

Expand Down
19 changes: 19 additions & 0 deletions boards/nxp/frdm_imx93/dts/usdhc1.overlay
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Copyright 2025 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/

/ {
aliases {
sdhc0 = &usdhc1;
};
};

&usdhc1 {
status = "okay";

sdmmc {
status = "okay";
};
};
19 changes: 19 additions & 0 deletions boards/nxp/frdm_imx93/dts/usdhc2.overlay
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Copyright 2025 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/

/ {
aliases {
sdhc0 = &usdhc2;
};
};

&usdhc2 {
status = "okay";

sdmmc {
status = "okay";
};
};
195 changes: 195 additions & 0 deletions boards/nxp/frdm_imx93/frdm_imx93-pinctrl.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -127,4 +127,199 @@
drive-strength = "x6";
};
};

pinmux_usdhc1: pinmux_usdhc1 {
group0 {
pinmux = <&iomuxc1_sd1_clk_usdhc_clk_usdhc1_clk>,
<&iomuxc1_sd1_strobe_usdhc_strobe_usdhc1_strobe>;
drive-strength = "x1";
bias-pull-down;
slew-rate = "fast";
input-schmitt-enable;
};

group1 {
pinmux = <&iomuxc1_sd1_cmd_usdhc_cmd_usdhc1_cmd>,
<&iomuxc1_sd1_data0_usdhc_data_usdhc1_data0>,
<&iomuxc1_sd1_data1_usdhc_data_usdhc1_data1>,
<&iomuxc1_sd1_data2_usdhc_data_usdhc1_data2>,
<&iomuxc1_sd1_data3_usdhc_data_usdhc1_data3>,
<&iomuxc1_sd1_data4_usdhc_data_usdhc1_data4>,
<&iomuxc1_sd1_data5_usdhc_data_usdhc1_data5>,
<&iomuxc1_sd1_data6_usdhc_data_usdhc1_data6>,
<&iomuxc1_sd1_data7_usdhc_data_usdhc1_data7>;
drive-strength = "x1";
slew-rate = "fast";
input-schmitt-enable;
bias-pull-up;
input-enable;
};
};

pinmux_usdhc1_100mhz: pinmux_usdhc1_100mhz {
group0 {
pinmux = <&iomuxc1_sd1_clk_usdhc_clk_usdhc1_clk>,
<&iomuxc1_sd1_strobe_usdhc_strobe_usdhc1_strobe>;
drive-strength = "x3";
bias-pull-down;
slew-rate = "fast";
input-schmitt-enable;
};

group1 {
pinmux = <&iomuxc1_sd1_cmd_usdhc_cmd_usdhc1_cmd>,
<&iomuxc1_sd1_data0_usdhc_data_usdhc1_data0>,
<&iomuxc1_sd1_data1_usdhc_data_usdhc1_data1>,
<&iomuxc1_sd1_data2_usdhc_data_usdhc1_data2>,
<&iomuxc1_sd1_data3_usdhc_data_usdhc1_data3>,
<&iomuxc1_sd1_data4_usdhc_data_usdhc1_data4>,
<&iomuxc1_sd1_data5_usdhc_data_usdhc1_data5>,
<&iomuxc1_sd1_data6_usdhc_data_usdhc1_data6>,
<&iomuxc1_sd1_data7_usdhc_data_usdhc1_data7>;
drive-strength = "x3";
slew-rate = "fast";
input-schmitt-enable;
bias-pull-up;
input-enable;
};
};

pinmux_usdhc1_200mhz: pinmux_usdhc1_200mhz {
group0 {
pinmux = <&iomuxc1_sd1_clk_usdhc_clk_usdhc1_clk>,
<&iomuxc1_sd1_strobe_usdhc_strobe_usdhc1_strobe>;
drive-strength = "x6";
bias-pull-down;
slew-rate = "fast";
input-schmitt-enable;
};

group1 {
pinmux = <&iomuxc1_sd1_cmd_usdhc_cmd_usdhc1_cmd>,
<&iomuxc1_sd1_data0_usdhc_data_usdhc1_data0>,
<&iomuxc1_sd1_data1_usdhc_data_usdhc1_data1>,
<&iomuxc1_sd1_data2_usdhc_data_usdhc1_data2>,
<&iomuxc1_sd1_data3_usdhc_data_usdhc1_data3>,
<&iomuxc1_sd1_data4_usdhc_data_usdhc1_data4>,
<&iomuxc1_sd1_data5_usdhc_data_usdhc1_data5>,
<&iomuxc1_sd1_data6_usdhc_data_usdhc1_data6>,
<&iomuxc1_sd1_data7_usdhc_data_usdhc1_data7>;
drive-strength = "x6";
slew-rate = "fast";
input-schmitt-enable;
bias-pull-up;
input-enable;
};
};

pinmux_usdhc2: pinmux_usdhc2 {
group0 {
pinmux = <&iomuxc1_sd2_clk_usdhc_clk_usdhc2_clk>;
drive-strength = "x1";
bias-pull-down;
slew-rate = "fast";
input-schmitt-enable;
};

group1 {
pinmux = <&iomuxc1_sd2_cmd_usdhc_cmd_usdhc2_cmd>,
<&iomuxc1_sd2_data0_usdhc_data_usdhc2_data0>,
<&iomuxc1_sd2_data1_usdhc_data_usdhc2_data1>,
<&iomuxc1_sd2_data2_usdhc_data_usdhc2_data2>,
<&iomuxc1_sd2_data3_usdhc_data_usdhc2_data3>;
drive-strength = "x1";
slew-rate = "fast";
input-schmitt-enable;
bias-pull-up;
input-enable;
};

group2 {
pinmux = <&iomuxc1_sd2_vselect_usdhc_vselect_usdhc2_vselect>;
drive-strength = "x4";
slew-rate = "slightly_fast";
};

group3 {
pinmux = <&iomuxc1_sd2_cd_b_gpio_io_gpio3_io00>,
<&iomuxc1_sd2_reset_b_gpio_io_gpio3_io07>;
drive-strength = "x4";
slew-rate = "slightly_fast";
bias-pull-up;
};
};

pinmux_usdhc2_100mhz: pinmux_usdhc2_100mhz {
group0 {
pinmux = <&iomuxc1_sd2_clk_usdhc_clk_usdhc2_clk>;
drive-strength = "x3";
bias-pull-down;
slew-rate = "fast";
input-schmitt-enable;
};

group1 {
pinmux = <&iomuxc1_sd2_cmd_usdhc_cmd_usdhc2_cmd>,
<&iomuxc1_sd2_data0_usdhc_data_usdhc2_data0>,
<&iomuxc1_sd2_data1_usdhc_data_usdhc2_data1>,
<&iomuxc1_sd2_data2_usdhc_data_usdhc2_data2>,
<&iomuxc1_sd2_data3_usdhc_data_usdhc2_data3>;
drive-strength = "x3";
slew-rate = "fast";
input-schmitt-enable;
bias-pull-up;
input-enable;
};

group2 {
pinmux = <&iomuxc1_sd2_vselect_usdhc_vselect_usdhc2_vselect>;
drive-strength = "x4";
slew-rate = "slightly_fast";
};

group3 {
pinmux = <&iomuxc1_sd2_cd_b_gpio_io_gpio3_io00>,
<&iomuxc1_sd2_reset_b_gpio_io_gpio3_io07>;
drive-strength = "x4";
slew-rate = "slightly_fast";
bias-pull-up;
};
};

pinmux_usdhc2_200mhz: pinmux_usdhc2_200mhz {
group0 {
pinmux = <&iomuxc1_sd2_clk_usdhc_clk_usdhc2_clk>;
drive-strength = "x6";
bias-pull-down;
slew-rate = "fast";
input-schmitt-enable;
};

group1 {
pinmux = <&iomuxc1_sd2_cmd_usdhc_cmd_usdhc2_cmd>,
<&iomuxc1_sd2_data0_usdhc_data_usdhc2_data0>,
<&iomuxc1_sd2_data1_usdhc_data_usdhc2_data1>,
<&iomuxc1_sd2_data2_usdhc_data_usdhc2_data2>,
<&iomuxc1_sd2_data3_usdhc_data_usdhc2_data3>;
drive-strength = "x6";
slew-rate = "fast";
input-schmitt-enable;
bias-pull-up;
input-enable;
};

group2 {
pinmux = <&iomuxc1_sd2_vselect_usdhc_vselect_usdhc2_vselect>;
drive-strength = "x4";
slew-rate = "slightly_fast";
};

group3 {
pinmux = <&iomuxc1_sd2_cd_b_gpio_io_gpio3_io00>,
<&iomuxc1_sd2_reset_b_gpio_io_gpio3_io07>;
drive-strength = "x4";
slew-rate = "slightly_fast";
bias-pull-up;
};
};
};
39 changes: 39 additions & 0 deletions boards/nxp/frdm_imx93/frdm_imx93_mimx9352_a55.dts
Original file line number Diff line number Diff line change
Expand Up @@ -149,3 +149,42 @@
&wdog4 {
status = "okay";
};

&usdhc1 {
pinctrl-0 = <&pinmux_usdhc1>;
pinctrl-1 = <&pinmux_usdhc1_100mhz>;
pinctrl-2 = <&pinmux_usdhc1_200mhz>;
pinctrl-names = "default", "med", "fast";
mmc-hs200-1_8v;
mmc-hs400-1_8v;
read-watermark = <0x10>;
write-watermark = <0x80>;
status = "disabled";

sdmmc {
compatible = "zephyr,mmc-disk";
disk-name = "SD2";
status = "disabled";
};
};

&usdhc2 {
pinctrl-0 = <&pinmux_usdhc2>;
pinctrl-1 = <&pinmux_usdhc2_100mhz>;
pinctrl-2 = <&pinmux_usdhc2_200mhz>;
pinctrl-names = "default", "med", "fast";
pwr-gpios = <&gpio3 7 GPIO_ACTIVE_HIGH>;
cd-gpios = <&gpio3 0 GPIO_ACTIVE_LOW>;
power-delay-ms = <20>;
mmc-hs200-1_8v;
mmc-hs400-1_8v;
read-watermark = <0x10>;
write-watermark = <0x80>;
status = "disabled";

sdmmc {
compatible = "zephyr,sdmmc-disk";
disk-name = "SD";
status = "disabled";
};
};
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CONFIG_MAIN_STACK_SIZE=8192
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CONFIG_MAIN_STACK_SIZE=8192