From 85bdab00decc665a608c49153065557434f0a82b Mon Sep 17 00:00:00 2001 From: Mahesh Mahadevan Date: Mon, 2 Dec 2024 12:13:26 -0600 Subject: [PATCH] soc: mimxrt1180: Add USB support This was tested on the MIMXRT1180 EVK board Signed-off-by: Mahesh Mahadevan --- boards/nxp/mimxrt1180_evk/doc/index.rst | 2 + .../mimxrt1180_evk_mimxrt1189_cm33.dts | 12 +++++ .../mimxrt1180_evk_mimxrt1189_cm33.yaml | 1 + .../mimxrt1180_evk_mimxrt1189_cm7.dts | 12 +++++ drivers/usb/device/usb_dc_mcux.c | 1 + dts/arm/nxp/nxp_rt118x.dtsi | 51 ++++++++++++++++--- samples/subsys/usb/dfu/sample.yaml | 1 + soc/nxp/imxrt/imxrt118x/soc.c | 7 +++ 8 files changed, 81 insertions(+), 6 deletions(-) diff --git a/boards/nxp/mimxrt1180_evk/doc/index.rst b/boards/nxp/mimxrt1180_evk/doc/index.rst index f2857af049c..9a71dc07eee 100644 --- a/boards/nxp/mimxrt1180_evk/doc/index.rst +++ b/boards/nxp/mimxrt1180_evk/doc/index.rst @@ -128,6 +128,8 @@ configuration supports the following hardware features: +-----------+------------+-------------------------------------+ | HWINFO | on-chip | Unique device serial number | +-----------+------------+-------------------------------------+ +| USB | on-chip | USB device | ++-----------+------------+-------------------------------------+ The default configuration can be found in the defconfig file: :zephyr_file:`boards/nxp/mimxrt1180_evk/mimxrt1180_evk_mimxrt1189_cm33_defconfig` diff --git a/boards/nxp/mimxrt1180_evk/mimxrt1180_evk_mimxrt1189_cm33.dts b/boards/nxp/mimxrt1180_evk/mimxrt1180_evk_mimxrt1189_cm33.dts index 1666800227e..c5a26217a26 100644 --- a/boards/nxp/mimxrt1180_evk/mimxrt1180_evk_mimxrt1189_cm33.dts +++ b/boards/nxp/mimxrt1180_evk/mimxrt1180_evk_mimxrt1189_cm33.dts @@ -93,3 +93,15 @@ &edma4 { status = "okay"; }; + +zephyr_udc0: &usb1 { + status = "okay"; + phy-handle = <&usbphy1>; +}; + +&usbphy1 { + status = "okay"; + tx-d-cal = <7>; + tx-cal-45-dp-ohms = <6>; + tx-cal-45-dm-ohms = <6>; +}; diff --git a/boards/nxp/mimxrt1180_evk/mimxrt1180_evk_mimxrt1189_cm33.yaml b/boards/nxp/mimxrt1180_evk/mimxrt1180_evk_mimxrt1189_cm33.yaml index 928289c277e..50e7ae40e45 100644 --- a/boards/nxp/mimxrt1180_evk/mimxrt1180_evk_mimxrt1189_cm33.yaml +++ b/boards/nxp/mimxrt1180_evk/mimxrt1180_evk_mimxrt1189_cm33.yaml @@ -27,4 +27,5 @@ supported: - dma - spi - watchdog + - usb_device vendor: nxp diff --git a/boards/nxp/mimxrt1180_evk/mimxrt1180_evk_mimxrt1189_cm7.dts b/boards/nxp/mimxrt1180_evk/mimxrt1180_evk_mimxrt1189_cm7.dts index 1ecb2a35ac9..24df3d024e8 100644 --- a/boards/nxp/mimxrt1180_evk/mimxrt1180_evk_mimxrt1189_cm7.dts +++ b/boards/nxp/mimxrt1180_evk/mimxrt1180_evk_mimxrt1189_cm7.dts @@ -63,3 +63,15 @@ &edma4 { status = "okay"; }; + +zephyr_udc0: &usb1 { + status = "okay"; + phy-handle = <&usbphy1>; +}; + +&usbphy1 { + status = "okay"; + tx-d-cal = <7>; + tx-cal-45-dp-ohms = <6>; + tx-cal-45-dm-ohms = <6>; +}; diff --git a/drivers/usb/device/usb_dc_mcux.c b/drivers/usb/device/usb_dc_mcux.c index 14a8918d106..75b0f8061fa 100644 --- a/drivers/usb/device/usb_dc_mcux.c +++ b/drivers/usb/device/usb_dc_mcux.c @@ -90,6 +90,7 @@ BUILD_ASSERT(NUM_INSTS <= 1, "Only one USB device supported"); #define CONTROLLER_ID kUSB_ControllerLpcIp3511Fs0 #endif /* LPC55s69 */ #elif defined(CONFIG_SOC_SERIES_IMXRT11XX) || \ + defined(CONFIG_SOC_SERIES_IMXRT118X) || \ defined(CONFIG_SOC_SERIES_IMXRT10XX) || \ defined(CONFIG_SOC_SERIES_MCXN) #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(usb1)) diff --git a/dts/arm/nxp/nxp_rt118x.dtsi b/dts/arm/nxp/nxp_rt118x.dtsi index a9123929b69..9126e04cb99 100644 --- a/dts/arm/nxp/nxp_rt118x.dtsi +++ b/dts/arm/nxp/nxp_rt118x.dtsi @@ -48,6 +48,13 @@ }; }; }; + + /* USB PLL */ + usbclk: usbpll-clock { + compatible = "fixed-clock"; + clock-frequency = <24000000>; + #clock-cells = <0>; + }; }; &peripheral { @@ -1130,15 +1137,47 @@ clk-source = <1>; clk-divider = <1>; }; + + usb1: usbd@2c80000 { + compatible = "nxp,ehci"; + reg = <0x2c80000 0x1000>; + interrupts = <215 0>; + interrupt-names = "usb_otg"; + clocks = <&usbclk>; + num-bidir-endpoints = <8>; + status = "disabled"; + }; + + usb2: usbd@2c90000 { + compatible = "nxp,ehci"; + reg = <0x2c90000 0x1000>; + interrupts = <214 0>; + interrupt-names = "usb_otg"; + clocks = <&usbclk>; + num-bidir-endpoints = <8>; + status = "disabled"; + }; + + usbphy1: usbphy@2ca0000 { + compatible = "nxp,usbphy"; + reg = <0x2ca0000 0x1000>; + status = "disabled"; + }; + + usbphy2: usbphy@2cb0000 { + compatible = "nxp,usbphy"; + reg = <0x2cb0000 0x1000>; + status = "disabled"; + }; }; &flexspi { - compatible = "nxp,imx-flexspi"; - interrupts = <55 0>; - #address-cells = <1>; - #size-cells = <0>; - status = "disabled"; - clocks = <&ccm IMX_CCM_FLEXSPI_CLK 0x0 0>; + compatible = "nxp,imx-flexspi"; + interrupts = <55 0>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + clocks = <&ccm IMX_CCM_FLEXSPI_CLK 0x0 0>; }; &flexspi2 { diff --git a/samples/subsys/usb/dfu/sample.yaml b/samples/subsys/usb/dfu/sample.yaml index c39a501ddf0..dea42901cc7 100644 --- a/samples/subsys/usb/dfu/sample.yaml +++ b/samples/subsys/usb/dfu/sample.yaml @@ -17,6 +17,7 @@ common: - mimxrt1050_evk/mimxrt1052/hyperflash - mimxrt1050_evk/mimxrt1052/qspi - mimxrt1060_evk/mimxrt1062/hyperflash + - mimxrt1180_evk/mimxrt1189/cm7 - nucleo_f207zg - teensy40 - teensy41 diff --git a/soc/nxp/imxrt/imxrt118x/soc.c b/soc/nxp/imxrt/imxrt118x/soc.c index df277164807..32a76a579e7 100644 --- a/soc/nxp/imxrt/imxrt118x/soc.c +++ b/soc/nxp/imxrt/imxrt118x/soc.c @@ -494,6 +494,13 @@ static ALWAYS_INLINE void clock_init(void) #endif /* CONFIG_DT_HAS_NXP_MCUX_I3C_ENABLED */ +#if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(usb1)) && CONFIG_UDC_NXP_EHCI + CLOCK_EnableUsbhs0PhyPllClock(kCLOCK_Usb480M, + DT_PROP_BY_PHANDLE(DT_NODELABEL(usb1), clocks, clock_frequency)); + CLOCK_EnableUsbhs0Clock(kCLOCK_Usb480M, + DT_PROP_BY_PHANDLE(DT_NODELABEL(usb1), clocks, clock_frequency)); +#endif + /* Keep core clock ungated during WFI */ CCM->LPCG[1].LPM0 = 0x33333333; CCM->LPCG[1].LPM1 = 0x33333333;