From 109d91aaf83556efc7959ff6bdf419aea093ef31 Mon Sep 17 00:00:00 2001 From: Benjamin Perseghetti Date: Sun, 6 Aug 2023 17:09:05 -0400 Subject: [PATCH] board: Add NXP VMU RT1170 board support package Adds support for the NXP VMU RT1170 board. This Vehicle Management Unit based on the i.MX RT1176 brings a fantastic combination of sensors and IO all on one board for development of various systems. It is also the featured board for CogniPilot's Cerebri - VMU autopilot software based on Zephyr. Co-authored-by: Peter van der Perk Signed-off-by: Benjamin Perseghetti --- boards/arm/vmu_rt1170/CMakeLists.txt | 26 + boards/arm/vmu_rt1170/Kconfig.board | 7 + boards/arm/vmu_rt1170/Kconfig.defconfig | 45 ++ boards/arm/vmu_rt1170/board.cmake | 17 + boards/arm/vmu_rt1170/doc/index.rst | 289 +++++++++++ boards/arm/vmu_rt1170/doc/vmu_rt1170.jpg | Bin 0 -> 80618 bytes boards/arm/vmu_rt1170/flexspi_nor_config.c | 149 ++++++ boards/arm/vmu_rt1170/vmu_rt1170-pinctrl.dtsi | 373 ++++++++++++++ boards/arm/vmu_rt1170/vmu_rt1170.dts | 455 ++++++++++++++++++ boards/arm/vmu_rt1170/vmu_rt1170.dtsi | 215 +++++++++ boards/arm/vmu_rt1170/vmu_rt1170.yaml | 29 ++ boards/arm/vmu_rt1170/vmu_rt1170_defconfig | 23 + soc/arm/nxp_imx/rt/flexspi_nor_config.h | 3 +- .../adc/adc_api/boards/vmu_rt1170.overlay | 34 ++ 14 files changed, 1664 insertions(+), 1 deletion(-) create mode 100644 boards/arm/vmu_rt1170/CMakeLists.txt create mode 100644 boards/arm/vmu_rt1170/Kconfig.board create mode 100644 boards/arm/vmu_rt1170/Kconfig.defconfig create mode 100644 boards/arm/vmu_rt1170/board.cmake create mode 100644 boards/arm/vmu_rt1170/doc/index.rst create mode 100644 boards/arm/vmu_rt1170/doc/vmu_rt1170.jpg create mode 100644 boards/arm/vmu_rt1170/flexspi_nor_config.c create mode 100644 boards/arm/vmu_rt1170/vmu_rt1170-pinctrl.dtsi create mode 100644 boards/arm/vmu_rt1170/vmu_rt1170.dts create mode 100644 boards/arm/vmu_rt1170/vmu_rt1170.dtsi create mode 100644 boards/arm/vmu_rt1170/vmu_rt1170.yaml create mode 100644 boards/arm/vmu_rt1170/vmu_rt1170_defconfig create mode 100644 tests/drivers/adc/adc_api/boards/vmu_rt1170.overlay diff --git a/boards/arm/vmu_rt1170/CMakeLists.txt b/boards/arm/vmu_rt1170/CMakeLists.txt new file mode 100644 index 00000000000..9e03e6cb024 --- /dev/null +++ b/boards/arm/vmu_rt1170/CMakeLists.txt @@ -0,0 +1,26 @@ +# +# Copyright 2023 NXP +# +# SPDX-License-Identifier: Apache-2.0 +# + +if(CONFIG_NXP_IMX_RT_BOOT_HEADER) + zephyr_library() + set(RT1170_BOARD_DIR + "${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/boards/evkmimxrt1170") + if(CONFIG_BOOT_FLEXSPI_NOR) + # Include flash configuration block for RT1170 EVK from NXP's HAL. + # This configuration block may need modification if another flash chip is + # used on your custom board. See NXP AN12238 for more information. + zephyr_compile_definitions(XIP_BOOT_HEADER_ENABLE=1) + zephyr_compile_definitions(BOARD_FLASH_SIZE=CONFIG_FLASH_SIZE*1024) + zephyr_library_sources(flexspi_nor_config.c) + zephyr_library_include_directories(${RT1170_BOARD_DIR}/xip) + endif() +endif() + +if(CONFIG_MCUX_GPT_TIMER) + message(WARNING "You appear to be using the GPT hardware timer. " + "This timer will enable lower power modes, but at the cost of reduced " + "hardware timer resolution") +endif() diff --git a/boards/arm/vmu_rt1170/Kconfig.board b/boards/arm/vmu_rt1170/Kconfig.board new file mode 100644 index 00000000000..53aa20f6800 --- /dev/null +++ b/boards/arm/vmu_rt1170/Kconfig.board @@ -0,0 +1,7 @@ +# Copyright 2023 NXP +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_VMU_RT1170 + bool "NXP VMU_RT1170" + depends on SOC_MIMXRT1176_CM7 + select SOC_PART_NUMBER_MIMXRT1176DVMAA diff --git a/boards/arm/vmu_rt1170/Kconfig.defconfig b/boards/arm/vmu_rt1170/Kconfig.defconfig new file mode 100644 index 00000000000..1c27b74b23e --- /dev/null +++ b/boards/arm/vmu_rt1170/Kconfig.defconfig @@ -0,0 +1,45 @@ +# VMU_RT1170 board + +# Copyright 2023 NXP +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_VMU_RT1170 + +config BOARD + default "vmu_rt1170" if BOARD_VMU_RT1170 + +choice CODE_LOCATION + default CODE_FLEXSPI if BOARD_VMU_RT1170 +endchoice + +if DISK_DRIVERS + +config IMX_USDHC_DAT3_PWR_TOGGLE + default y + +endif # DISK_DRIVERS + +if FLASH + +choice FLASH_MCUX_FLEXSPI_XIP_MEM_TARGET + default FLASH_MCUX_FLEXSPI_XIP_MEM_ITCM if CPU_CORTEX_M7 + default FLASH_MCUX_FLEXSPI_XIP_MEM_SRAM if CPU_CORTEX_M4 +endchoice + +endif #FLASH + +if NETWORKING + +config NET_L2_ETHERNET + default y if CPU_CORTEX_M7 # No cache memory support is required for driver + +config ETH_MCUX_PHY_RESET + default n + +config ETH_MCUX_RMII_EXT_CLK + default y + +endif # NETWORKING + + +endif # BOARD_VMU_RT1170 diff --git a/boards/arm/vmu_rt1170/board.cmake b/boards/arm/vmu_rt1170/board.cmake new file mode 100644 index 00000000000..0db7f44c768 --- /dev/null +++ b/boards/arm/vmu_rt1170/board.cmake @@ -0,0 +1,17 @@ +# +# Copyright 2023 NXP +# +# SPDX-License-Identifier: Apache-2.0 +# + +if(CONFIG_SOC_MIMXRT1176_CM7 OR CONFIG_SECOND_CORE_MCUX) +board_runner_args(pyocd "--target=mimxrt1170_cm7") +board_runner_args(jlink "--device=MIMXRT1176xxxA_M7" "--reset-after-load") +elseif(CONFIG_SOC_MIMXRT1176_CM4) +board_runner_args(pyocd "--target=mimxrt1170_cm4") +# Note: Please use JLINK above V7.50 (Only support run cm4 image when debugging due to default boot core on board is cm7 core) +board_runner_args(jlink "--device=MIMXRT1176xxxA_M4") +endif() + +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) +include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) diff --git a/boards/arm/vmu_rt1170/doc/index.rst b/boards/arm/vmu_rt1170/doc/index.rst new file mode 100644 index 00000000000..3514bf15893 --- /dev/null +++ b/boards/arm/vmu_rt1170/doc/index.rst @@ -0,0 +1,289 @@ +.. _VMU RT1170: + +NXP VMU RT1170 +################## + +Overview +******** + +The VMU RT1170 features an i.MX RT1176 dual core MCU with the +Cortex-M7 core at 1 GHz and a Cortex-M4 at 400 MHz. +The i.MX RT1176 MCU offers support over a wide temperature range +and is qualified for consumer, industrial and automotive markets. +The VMU RT1170 is the default VMU for CogniPilot's Cerebri, a +Zephyr RTOS based Autopilot. + +.. image:: vmu_rt1170.jpg + :align: center + :alt: VMU RT1170 + +Hardware +******** + +- MIMXRT1176DVMAA MCU + + - 1GHz Cortex-M7 & 400Mhz Cortex-M4 + - 2MB SRAM with 512KB of TCM for Cortex-M7 and 256KB of TCM for Cortex-M4 + +- Memory + + - 512 Mbit Octal Flash + - TF socket for SD card + +- Ethernet + + - 2 wire 100BASE-T1 + +- USB + + - USB 2.0 connector + +- Power + + - Redundant dual picoflex power ports + +- Debug + + - 10 pin debug and shell adapter board to 20 Pin JTAG debugger and USB-C shell + +- Sensor + + - BMI088 6-axis IMU + - BMM150 Magnetometer + - Dual BMP388 Barometer + - Dual ICM-42688 6-axis IMU + - IST8310 3-axis Magnetometer + - U-blox NEO-M8N GNSS module + +- UART JST-GH connectors + +- I2C JST-GH connectors + +- CAN bus JST-GH connectors + +For more information about the MIMXRT1176 SoC and VMU RT1170 board, see +these references: + +- `VMU RT1170 Website`_ +- `VMU RT1170 User Guide`_ +- `VMU RT1170 Schematics`_ +- `i.MX RT1170 Datasheet`_ +- `i.MX RT1170 Reference Manual`_ + +Supported Features +================== + +VMU-RT1170 is a "Vehicle Management Unit" based on the general i.MX RT1170 +family of processors. The VMU RT1170 board configuration supports the +following hardware features: + ++-----------+------------+-------------------------------------+ +| Interface | Controller | Driver/Component | ++===========+============+=====================================+ +| NVIC | on-chip | nested vector interrupt controller | ++-----------+------------+-------------------------------------+ +| SYSTICK | on-chip | systick | ++-----------+------------+-------------------------------------+ +| GPIO | on-chip | gpio | ++-----------+------------+-------------------------------------+ +| COUNTER | on-chip | counter | ++-----------+------------+-------------------------------------+ +| CAN | on-chip | flexcan | ++-----------+------------+-------------------------------------+ +| SPI | on-chip | spi | ++-----------+------------+-------------------------------------+ +| I2C | on-chip | i2c | ++-----------+------------+-------------------------------------+ +| PWM | on-chip | pwm | ++-----------+------------+-------------------------------------+ +| ADC | on-chip | adc | ++-----------+------------+-------------------------------------+ +| UART | on-chip | serial port-polling; | +| | | serial port-interrupt | ++-----------+------------+-------------------------------------+ +| DMA | on-chip | dma | ++-----------+------------+-------------------------------------+ +| GPT | on-chip | gpt | ++-----------+------------+-------------------------------------+ +| WATCHDOG | on-chip | watchdog | ++-----------+------------+-------------------------------------+ +| ENET | on-chip | ethernet | ++-----------+------------+-------------------------------------+ +| SAI | on-chip | i2s | ++-----------+------------+-------------------------------------+ +| USB | on-chip | USB Device | ++-----------+------------+-------------------------------------+ +| HWINFO | on-chip | Unique device serial number | ++-----------+------------+-------------------------------------+ +| DISPLAY | on-chip | display | ++-----------+------------+-------------------------------------+ +| ACMP | on-chip | analog comparator | ++-----------+------------+-------------------------------------+ +| CAAM RNG | on-chip | entropy | ++-----------+------------+-------------------------------------+ +| FLEXSPI | on-chip | flash programming | ++-----------+------------+-------------------------------------+ + +The default configuration can be found in the defconfig file: +``boards/arm/vmu_rt1170/vmu_rt1170_defconfig`` + +Other hardware features are not currently supported by the port. + +Connections and I/Os +==================== + +The MIMXRT1170 SoC has six pairs of pinmux/gpio controllers. + ++---------------------------+----------------+------------------+ +| Name | Function | Usage | ++---------------------------+----------------+------------------+ +| WAKEUP | GPIO | SW7 | ++---------------------------+----------------+------------------+ +| GPIO_AD_04 | GPIO | LED | ++---------------------------+----------------+------------------+ +| GPIO_AD_24 | LPUART1_TX | UART Console | ++---------------------------+----------------+------------------+ +| GPIO_AD_25 | LPUART1_RX | UART Console | ++---------------------------+----------------+------------------+ +| GPIO_LPSR_00 | CAN3_TX | flexcan | ++---------------------------+----------------+------------------+ +| GPIO_LPSR_01 | CAN3_RX | flexcan | ++---------------------------+----------------+------------------+ +| GPIO_AD_29 | SPI1_CS0 | spi | ++---------------------------+----------------+------------------+ +| GPIO_AD_28 | SPI1_CLK | spi | ++---------------------------+----------------+------------------+ +| GPIO_AD_30 | SPI1_SDO | spi | ++---------------------------+----------------+------------------+ +| GPIO_AD_31 | SPI1_SDI | spi | ++---------------------------+----------------+------------------+ +| GPIO_AD_08 | LPI2C1_SCL | i2c | ++---------------------------+----------------+------------------+ +| GPIO_AD_09 | LPI2C1_SDA | i2c | ++---------------------------+----------------+------------------+ +| GPIO_LPSR_05 | LPI2C5_SCL | i2c | ++---------------------------+----------------+------------------+ +| GPIO_LPSR_04 | LPI2C5_SDA | i2c | ++---------------------------+----------------+------------------+ +| GPIO_AD_04 | FLEXPWM1_PWM2 | pwm | ++---------------------------+----------------+------------------+ +| GPIO_AD_32 | ENET_MDC | Ethernet | ++---------------------------+----------------+------------------+ +| GPIO_AD_33 | ENET_MDIO | Ethernet | ++---------------------------+----------------+------------------+ +| GPIO_DISP_B2_02 | ENET_TX_DATA00 | Ethernet | ++---------------------------+----------------+------------------+ +| GPIO_DISP_B2_03 | ENET_TX_DATA01 | Ethernet | ++---------------------------+----------------+------------------+ +| GPIO_DISP_B2_04 | ENET_TX_EN | Ethernet | ++---------------------------+----------------+------------------+ +| GPIO_DISP_B2_05 | ENET_REF_CLK | Ethernet | ++---------------------------+----------------+------------------+ +| GPIO_DISP_B2_06 | ENET_RX_DATA00 | Ethernet | ++---------------------------+----------------+------------------+ +| GPIO_DISP_B2_07 | ENET_RX_DATA01 | Ethernet | ++---------------------------+----------------+------------------+ +| GPIO_DISP_B2_08 | ENET_RX_EN | Ethernet | ++---------------------------+----------------+------------------+ +| GPIO_DISP_B2_09 | ENET_RX_ER | Ethernet | ++---------------------------+----------------+------------------+ +| GPIO_AD_17_SAI1_MCLK | SAI_MCLK | SAI | ++---------------------------+----------------+------------------+ +| GPIO_AD_21_SAI1_TX_DATA00 | SAI1_TX_DATA | SAI | ++---------------------------+----------------+------------------+ +| GPIO_AD_22_SAI1_TX_BCLK | SAI1_TX_BCLK | SAI | ++---------------------------+----------------+------------------+ +| GPIO_AD_23_SAI1_TX_SYNC | SAI1_TX_SYNC | SAI | ++---------------------------+----------------+------------------+ +| GPIO_AD_17_SAI1_MCLK | SAI1_MCLK | SAI | ++---------------------------+----------------+------------------+ +| GPIO_AD_20_SAI1_RX_DATA00 | SAI1_RX_DATA00 | SAI | ++---------------------------+----------------+------------------+ + +Serial Port +=========== + +The MIMXRT1170 SoC has 12 UARTs. + +Programming and Debugging +************************* + +Build and flash applications as usual (see :ref:`build_an_application` and +:ref:`application_run` for more details). + +Configuring a Debug Probe +========================= + +A debug probe is used for both flashing and debugging the board. + +.. _Using J-Link RT1170: + +Using J-Link +--------------------------------- + +Install the :ref:`jlink-debug-host-tools` and make sure they are in your search +path. + +Connect the J-Link debugger through the debug adapter board. + +Configuring a Console +===================== + +Use the USB-C from the debug adapter board to access the console with +the following settings for your serial terminal of choice (screen, minicom, putty, +etc.): + +- Speed: 115200 +- Data: 8 bits +- Parity: None +- Stop bits: 1 + +Flashing +======== + +Here is an example for the :ref:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: vmu_rt1170 + :goals: flash + +You should see the following message in the terminal: + +.. code-block:: console + + ***** Booting Zephyr OS v3.4.0-xxxx-xxxxxxxxxxxxx ***** + Hello World! vmu_rt1170 + +Debugging +========= + +Here is an example for the :ref:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: vmu_rt1170 + :goals: debug + +Open a serial terminal, step through the application in your debugger, and you +should see the following message in the terminal: + +.. code-block:: console + + ***** Booting Zephyr OS v3.4.0-xxxx-xxxxxxxxxxxxx ***** + Hello World! vmu_rt1170 + +.. _VMU RT1170 Website: + https://www.nxp.com/part/VMU-RT1170 + +.. _VMU RT1170 User Guide: + https://cognipilot.org/cerebri/boards/nxp_vmu_rt1170/ + +.. _VMU RT1170 Schematics: + https://github.com/CogniPilot/NXP-VMU_RT117x-HW + +.. _i.MX RT1170 Datasheet: + https://www.nxp.com/docs/en/data-sheet/IMXRT1170CEC.pdf + +.. _i.MX RT1170 Reference Manual: + https://www.nxp.com/webapp/Download?colCode=IMXRT1170RM diff --git a/boards/arm/vmu_rt1170/doc/vmu_rt1170.jpg b/boards/arm/vmu_rt1170/doc/vmu_rt1170.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d2bd84e542d82de5b81a40cf3d8d116c1dce95e GIT binary patch literal 80618 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 xVN%UeE#bC#@ literal 0 HcmV?d00001 diff --git a/boards/arm/vmu_rt1170/flexspi_nor_config.c b/boards/arm/vmu_rt1170/flexspi_nor_config.c new file mode 100644 index 00000000000..21523fc29d0 --- /dev/null +++ b/boards/arm/vmu_rt1170/flexspi_nor_config.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2019, MADMACHINE LIMITED + * + * refer to hal_nxp board file + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +/*! + * @brief ROM API init + * + * Get the bootloader api entry address. + */ +void ROM_API_Init(void); + +/*! + * @brief Initialize Serial NOR devices via FLEXSPI + * + * This function checks and initializes the FLEXSPI module for the other FLEXSPI APIs. + * + * @param instance storage the instance of FLEXSPI. + * @param config A pointer to the storage for the driver runtime state. + * + * @retval kStatus_Success Api was executed successfully. + * @retval kStatus_InvalidArgument A invalid argument is provided. + * @retval kStatus_ROM_FLEXSPI_InvalidSequence A invalid Sequence is provided. + * @retval kStatus_ROM_FLEXSPI_SequenceExecutionTimeout Sequence Execution timeout. + * @retval kStatus_ROM_FLEXSPI_DeviceTimeout the device timeout + */ +status_t ROM_FLEXSPI_NorFlash_Init(uint32_t instance, struct flexspi_nor_config_t *config); + + + +#ifdef CONFIG_NXP_IMX_RT_BOOT_HEADER +#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__) +__attribute__((section(".boot_hdr.conf"))) +#elif defined(__ICCARM__) +#pragma location = ".boot_hdr.conf" +#endif + +/* Config used for booting */ + +const struct flexspi_nor_config_t Qspiflash_config = { + .memConfig = { + .tag = FLEXSPI_CFG_BLK_TAG, + .version = FLEXSPI_CFG_BLK_VERSION, + .readSampleClkSrc = + kFlexSPIReadSampleClk_LoopbackInternally, + .csHoldTime = 1u, + .csSetupTime = 1u, + .sflashPadType = kSerialFlash_1Pad, + .serialClkFreq = kFlexSpiSerialClk_80MHz, + .sflashA1Size = 64u * 1024u * 1024u, + .lookupTable = { + FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, + 0x03, RADDR_SDR, + FLEXSPI_1PAD, 0x18), + FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, + 0x04, STOP, + FLEXSPI_1PAD, 0), + }, + }, + .pageSize = 256u, + .sectorSize = 4u * 1024u, + .blockSize = 64u * 1024u, + .isUniformBlockSize = false, +}; +#endif /* CONFIG_NXP_IMX_RT_BOOT_HEADER */ + +/* Config used for code execution */ +const struct flexspi_nor_config_t g_flash_fast_config = { + .memConfig = { + .tag = FLEXSPI_CFG_BLK_TAG, + .version = FLEXSPI_CFG_BLK_VERSION, + .readSampleClkSrc = kFlexSPIReadSampleClk_ExternalInputFromDqsPad, + .csHoldTime = 1, + .csSetupTime = 1, + .deviceModeCfgEnable = 1, + .deviceModeType = kDeviceConfigCmdType_Spi2Xpi, + .waitTimeCfgCommands = 1, + .deviceModeSeq = { + .seqNum = 1, + .seqId = 6, /* See Lookup table for more details */ + .reserved = 0, + }, + .deviceModeArg = 2, /* Enable OPI DDR mode */ + .controllerMiscOption = + (1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) + | (1u << kFlexSpiMiscOffset_DdrModeEnable), + .deviceType = kFlexSpiDeviceType_SerialNOR, + .sflashPadType = kSerialFlash_8Pads, + .serialClkFreq = kFlexSpiSerialClk_200MHz, + .sflashA1Size = 64ul * 1024u * 1024u, + .busyOffset = 0u, + .busyBitPolarity = 0u, + .lookupTable = { + /* Read */ + [0 + 0] = FLEXSPI_LUT_SEQ(CMD_DDR, FLEXSPI_8PAD, + 0xEE, CMD_DDR, FLEXSPI_8PAD, 0x11), + [0 + 1] = FLEXSPI_LUT_SEQ(RADDR_DDR, FLEXSPI_8PAD, + 0x20, DUMMY_DDR, FLEXSPI_8PAD, 0x04), + [0 + 2] = FLEXSPI_LUT_SEQ(READ_DDR, FLEXSPI_8PAD, + 0x04, STOP, FLEXSPI_1PAD, 0x00), + + /* Write enable SPI */ + [4 * 3 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, + 0x06, STOP, FLEXSPI_1PAD, 0x00), + + /*Write Configuration Register 2 =01, Enable OPI DDR mode*/ + [4 * 6 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, + 0x72, CMD_SDR, FLEXSPI_1PAD, 0x00), + [4 * 6 + 1] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, + 0x00, CMD_SDR, FLEXSPI_1PAD, 0x00), + [4 * 6 + 2] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, + 0x00, WRITE_SDR, FLEXSPI_1PAD, 0x01), + + }, + }, + .pageSize = 256u, + .sectorSize = 4u * 1024u, + .blockSize = 64u * 1024u, + .isUniformBlockSize = false, + .ipcmdSerialClkFreq = 1, + .serialNorType = 2, + .reserve2[0] = 0x7008200, +}; + + +__ramfunc int imxrt_reclock_initialize(void) +{ + const uint32_t instance = 1; + + volatile struct flexspi_nor_config_t bootConfig; + + memcpy((struct flexspi_nor_config_t *)&bootConfig, &g_flash_fast_config, + sizeof(struct flexspi_nor_config_t)); + bootConfig.memConfig.tag = FLEXSPI_CFG_BLK_TAG; + + ROM_API_Init(); + + ROM_FLEXSPI_NorFlash_Init(instance, (struct flexspi_nor_config_t *)&bootConfig); + + return 0; +} + +SYS_INIT(imxrt_reclock_initialize, PRE_KERNEL_1, 0); diff --git a/boards/arm/vmu_rt1170/vmu_rt1170-pinctrl.dtsi b/boards/arm/vmu_rt1170/vmu_rt1170-pinctrl.dtsi new file mode 100644 index 00000000000..4f9cdf77857 --- /dev/null +++ b/boards/arm/vmu_rt1170/vmu_rt1170-pinctrl.dtsi @@ -0,0 +1,373 @@ +/* + * Copyright 2023 NXP + * SPDX-License-Identifier: Apache-2.0 + * + * Note: File generated by rt_cfg_utils.py + * from vmu_rt1170.mex + */ + +#include + +&pinctrl { + + + pinmux_regulator: pinmux_regulator { + group0 { + pinmux = <&iomuxc_gpio_emc_b1_34_gpio_mux2_io02>, + <&iomuxc_gpio_emc_b1_37_gpio_mux2_io05>, + <&iomuxc_gpio_emc_b1_33_gpio_mux2_io01>, + <&iomuxc_gpio_emc_b1_22_gpio_mux1_io22>, + <&iomuxc_gpio_emc_b1_14_gpio_mux1_io14>, + <&iomuxc_gpio_emc_b1_36_gpio_mux2_io04>, + <&iomuxc_gpio_emc_b1_38_gpio_mux2_io06>, + <&iomuxc_gpio_emc_b1_01_gpio_mux1_io01>, + <&iomuxc_gpio_disp_b2_08_gpio_mux5_io09>; + bias-pull-up; + slew-rate = "fast"; + }; + }; + + pinmux_enet: pinmux_enet { + group0 { + pinmux = <&iomuxc_gpio_disp_b2_09_gpio_mux5_io10>, + <&iomuxc_gpio_disp_b1_00_enet_1g_rx_en>, + <&iomuxc_gpio_disp_b1_01_enet_1g_rx_er>; + drive-strength = "high"; + bias-pull-down; + slew-rate = "fast"; + }; + group1 { + pinmux = <&iomuxc_gpio_emc_b2_15_enet_1g_rdata00>, + <&iomuxc_gpio_emc_b2_16_enet_1g_rdata01>; + drive-strength = "high"; + bias-pull-down; + slew-rate = "fast"; + input-enable; + }; + group2 { + pinmux = <&iomuxc_gpio_emc_b2_19_enet_1g_mdc>, + <&iomuxc_gpio_emc_b2_20_enet_1g_mdio>, + <&iomuxc_gpio_disp_b1_09_enet_1g_tdata00>, + <&iomuxc_gpio_disp_b1_08_enet_1g_tdata01>, + <&iomuxc_gpio_disp_b1_10_enet_1g_tx_en>; + drive-strength = "high"; + slew-rate = "fast"; + }; + group3 { + pinmux = <&iomuxc_gpio_disp_b1_11_enet_1g_ref_clk1>; + drive-strength = "high"; + slew-rate = "slow"; + input-enable; + }; + }; + + pinmux_flexcan1: pinmux_flexcan1 { + group0 { + pinmux = <&iomuxc_gpio_ad_07_can1_rx>, + <&iomuxc_gpio_ad_06_can1_tx>; + drive-strength = "high"; + slew-rate = "fast"; + }; + }; + + pinmux_flexcan2: pinmux_flexcan2 { + group0 { + pinmux = <&iomuxc_gpio_ad_01_can2_rx>, + <&iomuxc_gpio_ad_00_can2_tx>; + drive-strength = "high"; + slew-rate = "fast"; + }; + }; + + pinmux_flexcan3: pinmux_flexcan3 { + group0 { + pinmux = <&iomuxc_lpsr_gpio_lpsr_01_can3_rx>, + <&iomuxc_lpsr_gpio_lpsr_00_can3_tx>; + drive-strength = "high"; + slew-rate = "fast"; + }; + }; + + /* pwm pins for vmu and io ports */ + pinmux_flexpwm_vmu_ch1: pinmux_flexpwm_vmu_ch1 { + group0 { + pinmux = <&iomuxc_gpio_emc_b1_23_flexpwm1_pwm0_a>; + slew-rate = "fast"; + }; + }; + + pinmux_flexpwm_vmu_ch2: pinmux_flexpwm_vmu_ch2 { + group0 { + pinmux = <&iomuxc_gpio_emc_b1_25_flexpwm1_pwm1_a>; + slew-rate = "fast"; + }; + }; + + pinmux_flexpwm_vmu_ch3: pinmux_flexpwm_vmu_ch3 { + group0 { + pinmux = <&iomuxc_gpio_emc_b1_27_flexpwm1_pwm2_a>; + slew-rate = "fast"; + }; + }; + + pinmux_flexpwm_vmu_ch4: pinmux_flexpwm_vmu_ch4 { + group0 { + pinmux = <&iomuxc_gpio_emc_b1_06_flexpwm2_pwm0_a>; + slew-rate = "fast"; + }; + }; + + pinmux_flexpwm_vmu_ch5: pinmux_flexpwm_vmu_ch5 { + group0 { + pinmux = <&iomuxc_gpio_emc_b1_08_flexpwm2_pwm1_a>; + slew-rate = "fast"; + }; + }; + + pinmux_flexpwm_vmu_ch6: pinmux_flexpwm_vmu_ch6 { + group0 { + pinmux = <&iomuxc_gpio_emc_b1_10_flexpwm2_pwm2_a>; + slew-rate = "fast"; + }; + }; + + pinmux_flexpwm_vmu_ch7: pinmux_flexpwm_vmu_ch7 { + group0 { + pinmux = <&iomuxc_gpio_emc_b1_19_flexpwm2_pwm3_a>; + slew-rate = "fast"; + }; + }; + + pinmux_flexpwm_vmu_ch8: pinmux_flexpwm_vmu_ch8 { + group0 { + pinmux = <&iomuxc_gpio_emc_b1_29_flexpwm3_pwm0_a>; + slew-rate = "fast"; + }; + }; + + + pinmux_flexspi1: pinmux_flexspi1 { + group0 { + pinmux = <&iomuxc_gpio_sd_b2_05_flexspi1_a_dqs>, + <&iomuxc_gpio_sd_b2_06_flexspi1_a_ss0_b>, + <&iomuxc_gpio_sd_b2_07_flexspi1_a_sclk>, + <&iomuxc_gpio_sd_b2_08_flexspi1_a_data00>, + <&iomuxc_gpio_sd_b2_09_flexspi1_a_data01>, + <&iomuxc_gpio_sd_b2_10_flexspi1_a_data02>, + <&iomuxc_gpio_sd_b2_11_flexspi1_a_data03>; + bias-pull-down; + input-enable; + }; + }; + + pinmux_gpt_ppm: pinmux_gpt_ppm { + group0 { + pinmux = <&iomuxc_gpio_emc_b1_09_gpt5_capture1>; + drive-strength = "high"; + slew-rate = "fast"; + }; + }; + + pinmux_lpadc1: pinmux_lpadc1 { + group0 { + pinmux = <&iomuxc_gpio_ad_10_adc1_ch2a>; + drive-strength = "normal"; + slew-rate = "slow"; + }; + }; + + pinmux_lpi2c1: pinmux_lpi2c1 { + group0 { + pinmux = <&iomuxc_gpio_ad_08_lpi2c1_scl>, + <&iomuxc_gpio_ad_09_lpi2c1_sda>; + drive-strength = "normal"; + drive-open-drain; + slew-rate = "fast"; + input-enable; + }; + }; + + pinmux_lpi2c2: pinmux_lpi2c2 { + group0 { + pinmux = <&iomuxc_gpio_ad_18_lpi2c2_scl>, + <&iomuxc_gpio_ad_19_lpi2c2_sda>, + <&iomuxc_gpio_emc_b1_35_gpio_mux2_io03>; + drive-strength = "normal"; + drive-open-drain; + slew-rate = "fast"; + input-enable; + }; + }; + + pinmux_lpi2c3: pinmux_lpi2c3 { + group0 { + pinmux = <&iomuxc_gpio_disp_b2_10_lpi2c3_scl>, + <&iomuxc_gpio_disp_b2_11_lpi2c3_sda>; + drive-strength = "normal"; + drive-open-drain; + slew-rate = "fast"; + input-enable; + }; + }; + + pinmux_lpi2c6: pinmux_lpi2c6 { + group0 { + pinmux = <&iomuxc_lpsr_gpio_lpsr_07_lpi2c6_scl>, + <&iomuxc_lpsr_gpio_lpsr_06_lpi2c6_sda>; + drive-strength = "normal"; + drive-open-drain; + slew-rate = "fast"; + input-enable; + }; + }; + + pinmux_lpspi1: pinmux_lpspi1 { + group0 { + pinmux = <&iomuxc_gpio_emc_b2_01_gpio_mux2_io11>, + <&iomuxc_gpio_emc_b2_00_lpspi1_sck>, + <&iomuxc_gpio_emc_b2_03_lpspi1_sdi>, + <&iomuxc_gpio_emc_b2_02_lpspi1_sdo>, + <&iomuxc_gpio_ad_20_gpio_mux3_io19>; + drive-strength = "high"; + slew-rate = "fast"; + }; + }; + + pinmux_lpspi2: pinmux_lpspi2 { + group0 { + pinmux = <&iomuxc_gpio_ad_25_gpio_mux3_io24>, + <&iomuxc_gpio_ad_24_lpspi2_sck>, + <&iomuxc_gpio_ad_27_lpspi2_sdi>, + <&iomuxc_gpio_ad_26_lpspi2_sdo>, + <&iomuxc_gpio_emc_b1_39_gpio_mux2_io07>; + drive-strength = "high"; + slew-rate = "fast"; + }; + }; + + pinmux_lpspi3: pinmux_lpspi3 { + group0 { + pinmux = <&iomuxc_gpio_emc_b2_04_lpspi3_sck>, + <&iomuxc_gpio_emc_b2_07_lpspi3_sdi>, + <&iomuxc_gpio_emc_b2_06_lpspi3_sdo>, + <&iomuxc_gpio_emc_b2_05_gpio_mux2_io15>, + <&iomuxc_gpio_emc_b2_08_gpio_mux2_io18>, + <&iomuxc_gpio_ad_21_gpio_mux3_io20>, + <&iomuxc_gpio_emc_b2_18_gpio_mux2_io28>; + drive-strength = "high"; + slew-rate = "fast"; + }; + }; + + pinmux_lpspi6: pinmux_lpspi6 { + group0 { + pinmux = <&iomuxc_lpsr_gpio_lpsr_09_lpspi6_pcs0>, + <&iomuxc_lpsr_gpio_lpsr_10_lpspi6_sck>, + <&iomuxc_lpsr_gpio_lpsr_12_lpspi6_sdi>, + <&iomuxc_lpsr_gpio_lpsr_11_lpspi6_sdo>; + drive-strength = "high"; + slew-rate = "fast"; + }; + }; + + pinmux_lpuart1: pinmux_lpuart1 { + group0 { + pinmux = <&iomuxc_gpio_disp_b1_03_lpuart1_rx>, + <&iomuxc_gpio_disp_b1_02_lpuart1_tx>; + drive-strength = "high"; + bias-pull-up; + slew-rate = "fast"; + }; + }; + + pinmux_lpuart3: pinmux_lpuart3 { + group0 { + pinmux = <&iomuxc_gpio_ad_31_lpuart3_rx>, + <&iomuxc_gpio_ad_30_lpuart3_tx>; + drive-strength = "high"; + bias-pull-up; + slew-rate = "fast"; + }; + }; + + pinmux_lpuart4: pinmux_lpuart4 { + group0 { + pinmux = <&iomuxc_gpio_disp_b1_04_lpuart4_rx>, + <&iomuxc_gpio_disp_b1_06_lpuart4_tx>; + drive-strength = "high"; + bias-pull-up; + slew-rate = "fast"; + }; + }; + + pinmux_lpuart5: pinmux_lpuart5 { + group0 { + pinmux = <&iomuxc_gpio_ad_29_lpuart5_rx>, + <&iomuxc_gpio_ad_28_lpuart5_tx>; + drive-strength = "high"; + bias-pull-up; + slew-rate = "fast"; + }; + }; + + pinmux_lpuart6: pinmux_lpuart6 { + group0 { + pinmux = <&iomuxc_gpio_emc_b1_41_lpuart6_rx>, + <&iomuxc_gpio_emc_b1_40_lpuart6_tx>; + drive-strength = "high"; + bias-pull-up; + slew-rate = "fast"; + }; + }; + + pinmux_lpuart8: pinmux_lpuart8 { + group0 { + pinmux = <&iomuxc_gpio_ad_03_lpuart8_rx>, + <&iomuxc_gpio_ad_02_lpuart8_tx>; + drive-strength = "high"; + bias-pull-up; + slew-rate = "fast"; + }; + }; + + pinmux_lpuart10: pinmux_lpuart10 { + group0 { + pinmux = <&iomuxc_gpio_ad_33_lpuart10_rx>, + <&iomuxc_gpio_ad_15_lpuart10_tx>; + drive-strength = "high"; + bias-pull-up; + slew-rate = "fast"; + }; + }; + + pinmux_lpuart11: pinmux_lpuart11 { + group0 { + pinmux = <&iomuxc_lpsr_gpio_lpsr_05_lpuart11_rx>, + <&iomuxc_lpsr_gpio_lpsr_04_lpuart11_tx>; + drive-strength = "high"; + bias-pull-up; + slew-rate = "fast"; + }; + }; + + pinmux_usdhc1: pinmux_usdhc1 { + group0 { + pinmux = <&iomuxc_gpio_sd_b1_00_usdhc1_cmd>, + <&iomuxc_gpio_sd_b1_02_usdhc1_data0>, + <&iomuxc_gpio_sd_b1_03_usdhc1_data1>, + <&iomuxc_gpio_sd_b1_04_usdhc1_data2>, + <&iomuxc_gpio_sd_b1_05_usdhc1_data3>; + bias-pull-up; + drive-strength = "high"; + slew-rate = "fast"; + input-enable; + }; + group1 { + pinmux = <&iomuxc_gpio_sd_b1_01_usdhc1_clk>, + <&iomuxc_gpio_ad_32_usdhc1_cd_b>; + drive-strength = "high"; + slew-rate = "fast"; + }; + }; + +}; diff --git a/boards/arm/vmu_rt1170/vmu_rt1170.dts b/boards/arm/vmu_rt1170/vmu_rt1170.dts new file mode 100644 index 00000000000..acdf8c6b921 --- /dev/null +++ b/boards/arm/vmu_rt1170/vmu_rt1170.dts @@ -0,0 +1,455 @@ +/* + * Copyright 2023 NXP + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include +#include +#include "vmu_rt1170.dtsi" + +/ { + model = "NXP VMU RT1170"; + compatible = "nxp,mimxrt1176"; + + aliases { + led0 = &green_led; + led1 = &red_led; + watchdog0 = &wdog1; + sdhc0 = &usdhc1; + }; + + chosen { + zephyr,sram = &ocram1; /* TODO Merge with other OCRAM */ + zephyr,sram1 = &ocram2; /* TODO Merge with other OCRAM */ + zephyr,dtcm = &dtcm; + zephyr,itcm = &itcm; + zephyr,console = &lpuart1; + zephyr,shell-uart = &lpuart1; + zephyr,canbus = &flexcan1; + zephyr,flash-controller = &mx25um51345g; + zephyr,flash = &mx25um51345g; + zephyr,code-partition = &slot0_partition; + }; + + /* This regulator controls VDD_3V3_SD_CARD onboard supply */ + reg-3v3-sdcard { + pinctrl-0 = <&pinmux_regulator>; + pinctrl-names = "default"; + compatible = "regulator-fixed"; + regulator-name = "reg-3v3-sdcard"; + enable-gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>; + regulator-always-on; + status = "okay"; + }; + + /* This regulator controls VDD_5V_PERIPH onboard supply */ + reg-5v-periph { + pinctrl-0 = <&pinmux_regulator>; + pinctrl-names = "default"; + compatible = "regulator-fixed"; + regulator-name = "reg-5v-periph"; + enable-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>; + regulator-always-on; + status = "okay"; + }; + + /* This regulator controls VDD_5V_HIPOWER onboard supply */ + reg-5v-hipower { + pinctrl-0 = <&pinmux_regulator>; + pinctrl-names = "default"; + compatible = "regulator-fixed"; + regulator-name = "reg-5v-hipower"; + enable-gpios = <&gpio2 5 GPIO_ACTIVE_LOW>; + regulator-always-on; + status = "okay"; + }; + + /* This regulator controls the VDD_3V3_SENSORS1 onboard supply. */ + reg-3v3-sensors-1 { + pinctrl-0 = <&pinmux_regulator>; + pinctrl-names = "default"; + compatible = "regulator-fixed"; + regulator-name = "reg-3v3-sensors-1"; + enable-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>; + startup-delay-us = <2000>; + regulator-always-on; + status = "okay"; + }; + + /* This regulator controls the VDD_3V3_SENSORS2 onboard supply. */ + reg-3v3-sensors-2 { + pinctrl-0 = <&pinmux_regulator>; + pinctrl-names = "default"; + compatible = "regulator-fixed"; + regulator-name = "reg-3v3-sensors-2"; + enable-gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>; + startup-delay-us = <2000>; + regulator-always-on; + status = "okay"; + }; + + /* This regulator controls the VDD_3V3_SENSORS3 onboard supply. */ + reg-3v3-sensors-3 { + pinctrl-0 = <&pinmux_regulator>; + pinctrl-names = "default"; + compatible = "regulator-fixed"; + regulator-name = "reg-3v3-sensors-3"; + enable-gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>; + startup-delay-us = <2000>; + regulator-always-on; + status = "okay"; + }; + + /* This regulator controls the VDD_3V3_SENSORS4 onboard supply. */ + reg-3v3-sensors-4 { + pinctrl-0 = <&pinmux_regulator>; + pinctrl-names = "default"; + compatible = "regulator-fixed"; + regulator-name = "reg-3v3-sensors-4"; + enable-gpios = <&gpio2 4 GPIO_ACTIVE_HIGH>; + startup-delay-us = <2000>; + regulator-always-on; + status = "okay"; + }; + + /* This regulator controls VDD_3V3_SPEKTRUM onboard supply */ + reg-3v3-spektrum { + pinctrl-0 = <&pinmux_regulator>; + pinctrl-names = "default"; + compatible = "regulator-fixed"; + regulator-name = "reg-3v3-spektrum"; + enable-gpios = <&gpio2 6 GPIO_ACTIVE_HIGH>; + regulator-always-on; + status = "okay"; + }; + + /* This regulator controls ETH_VDD_3V3 supply to power up the TJA1103 PHY */ + reg-eth-power { + pinctrl-0 = <&pinmux_regulator>; + pinctrl-names = "default"; + compatible = "regulator-fixed"; + regulator-name = "reg-eth-power"; + enable-gpios = <&gpio5 9 GPIO_ACTIVE_HIGH>; + regulator-always-on; + status = "okay"; + }; +}; + + +&gpio1 { + status = "okay"; +}; + +&gpio2 { + status = "okay"; +}; + +&gpio3 { + status = "okay"; +}; + +&gpio4 { + status = "okay"; +}; + +&gpio5 { + status = "okay"; +}; + +&gpio6 { + status = "okay"; +}; + +&gpio7 { + status = "okay"; +}; + +&gpio8 { + status = "okay"; +}; + +&gpio9 { + status = "okay"; +}; + +&lpuart1 { + status = "okay"; + current-speed = <115200>; +}; + +&lpuart4 { + status = "okay"; + current-speed = <115200>; +}; + + +&flexcan1 { + status = "okay"; + pinctrl-0 = <&pinmux_flexcan1>; + pinctrl-names = "default"; + bus-speed = <125000>; + bus-speed-data = <1000000>; + can-transceiver { + max-bitrate = <5000000>; + }; +}; + +&flexcan2 { + status = "okay"; + pinctrl-0 = <&pinmux_flexcan2>; + pinctrl-names = "default"; + bus-speed = <125000>; + bus-speed-data = <1000000>; + can-transceiver { + max-bitrate = <5000000>; + }; +}; + +&flexcan3 { + status = "okay"; + pinctrl-0 = <&pinmux_flexcan3>; + pinctrl-names = "default"; + bus-speed = <125000>; + bus-speed-data = <1000000>; + can-transceiver { + max-bitrate = <5000000>; + }; +}; + +&lpspi1 { + status = "okay"; + cs-gpios =<&gpio2 11 GPIO_ACTIVE_LOW>; + + icm42688_0: icm42688p0@0 { + compatible = "invensense,icm42688"; + reg = <0>; + int-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>; + spi-max-frequency = <24000000>; + accel-hz = <1000>; + accel-fs = <16>; + gyro-hz = <1000>; + gyro-fs = <2000>; + }; +}; + +&lpspi2 { + status = "okay"; + cs-gpios =<&gpio3 24 GPIO_ACTIVE_LOW>; + + icm42688_1: icm42688p1@0 { + compatible = "invensense,icm42688"; + reg = <0>; + int-gpios = <&gpio2 7 GPIO_ACTIVE_HIGH>; + spi-max-frequency = <24000000>; + accel-hz = <1000>; + accel-fs = <16>; + gyro-hz = <1000>; + gyro-fs = <2000>; + }; +}; + +&lpspi3 { + status = "okay"; + cs-gpios = <&gpio2 15 GPIO_ACTIVE_LOW>, + <&gpio2 18 GPIO_ACTIVE_LOW>; + + + bmi08x_accel: bmi08x@0 { + compatible = "bosch,bmi08x-accel"; + reg = <0>; + int-gpios = <&gpio3 20 GPIO_ACTIVE_HIGH>; + spi-max-frequency = <24000000>; + int1-map-io = <0x01>; + int2-map-io = <0x00>; + int1-conf-io = <0x04>; + int2-conf-io = <0x00>; + accel-hz = "800"; + accel-fs = <24>; + }; + + bmi08x_gyro: bmi08x@1 { + compatible = "bosch,bmi08x-gyro"; + reg = <1>; + int-gpios = <&gpio2 28 GPIO_ACTIVE_HIGH>; + spi-max-frequency = <24000000>; + int3-4-map-io = <0x01>; + int3-4-conf-io = <0x02>; + gyro-hz = "1000_116"; + gyro-fs = <1000>; + }; +}; + +&lpspi6 { + status = "okay"; +}; + +&lpi2c1 { + status = "okay"; + + ist8310: ist8310@e { + compatible = "isentek,ist8310"; + reg = <0xe>; + + }; + + ncp5623c: ncp5623c@39 { + compatible = "onnn,ncp5623c"; + reg = <0x39>; + + led_0 { + label = "GNSS LED"; + index = <0>; + color-mapping = + , + , + ; + }; + }; +}; + +&lpi2c2 { + status = "okay"; + clock-frequency = ; + + bmp388_0: bmp388@76 { + compatible = "bosch,bmp388"; + int-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>; + reg = <0x76>; + status = "okay"; + odr = "50"; + osr-press = <4>; + osr-temp = <2>; + }; +}; + +&lpi2c3 { + status = "okay"; + clock-frequency = ; + + bmm150: bmm150@10 { + compatible = "bosch,bmm150"; + status = "okay"; + reg = <0x10>; + }; + + bmp388_1: bmp388@77 { + compatible = "bosch,bmp388"; + reg = <0x77>; + status = "okay"; + odr = "50"; + osr-press = <4>; + osr-temp = <2>; + }; +}; + +&lpi2c6 { + status = "okay"; +}; + +&flexpwm1_pwm0 { + status = "okay"; + pinctrl-0 = <&pinmux_flexpwm_vmu_ch1>; + pinctrl-names = "default"; + nxp,prescaler = <64>; +}; + +&flexpwm1_pwm1 { + status = "okay"; + pinctrl-0 = <&pinmux_flexpwm_vmu_ch2>; + pinctrl-names = "default"; + nxp,prescaler = <64>; +}; + +&flexpwm1_pwm2 { + status = "okay"; + pinctrl-0 = <&pinmux_flexpwm_vmu_ch3>; + pinctrl-names = "default"; + nxp,prescaler = <64>; +}; + +&flexpwm2_pwm0 { + status = "okay"; + pinctrl-0 = <&pinmux_flexpwm_vmu_ch4>; + pinctrl-names = "default"; + nxp,prescaler = <64>; +}; + +&flexpwm2_pwm1 { + status = "okay"; + pinctrl-0 = <&pinmux_flexpwm_vmu_ch5>; + pinctrl-names = "default"; + nxp,prescaler = <64>; +}; + +&flexpwm2_pwm2 { + status = "okay"; + pinctrl-0 = <&pinmux_flexpwm_vmu_ch6>; + pinctrl-names = "default"; + nxp,prescaler = <64>; +}; + +&flexpwm2_pwm3 { + status = "okay"; + pinctrl-0 = <&pinmux_flexpwm_vmu_ch7>; + pinctrl-names = "default"; + nxp,prescaler = <64>; +}; + +&flexpwm3_pwm0 { + status = "okay"; + pinctrl-0 = <&pinmux_flexpwm_vmu_ch8>; + pinctrl-names = "default"; + nxp,prescaler = <64>; +}; + + +&gpt5 { + compatible = "nxp,gpt-ppm-input"; + pinctrl-0 = <&pinmux_gpt_ppm>; + pinctrl-names = "default"; + capture-channel = <1>; +}; + +&usdhc1 { + status = "okay"; + sdmmc { + compatible = "zephyr,sdmmc-disk"; + status = "okay"; + }; +}; + +&edma0 { + status = "okay"; +}; + +&lpadc1 { + status = "okay"; +}; + +/* GPT and Systick are enabled. If power management is enabled, the GPT + * timer will be used instead of systick, as allows the core clock to + * be gated. + */ +&gpt_hw_timer { + status = "disabled"; +}; + +&systick { + status = "okay"; +}; + +&wdog1 { + status = "okay"; +}; + +&enet1g { + status = "okay"; + int-gpios = <&gpio5 10 GPIO_ACTIVE_HIGH>; +}; + +zephyr_udc0: &usb1 { + status = "okay"; +}; diff --git a/boards/arm/vmu_rt1170/vmu_rt1170.dtsi b/boards/arm/vmu_rt1170/vmu_rt1170.dtsi new file mode 100644 index 00000000000..075dc1860dc --- /dev/null +++ b/boards/arm/vmu_rt1170/vmu_rt1170.dtsi @@ -0,0 +1,215 @@ +/* + * Copyright 2023 NXP + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "vmu_rt1170-pinctrl.dtsi" + +/ { + aliases { + led0 = &green_led; + led1 = &red_led; + led2 = &blue_led; + sdhc0 = &usdhc1; + }; + + leds { + compatible = "gpio-leds"; + green_led: led-1 { + gpios = <&gpio5 2 GPIO_ACTIVE_HIGH>; + label = "Green LED"; + }; + + red_led: led-2 { + gpios = <&gpio5 1 GPIO_ACTIVE_LOW>; + label = "Red LED"; + }; + + blue_led: led-3 { + gpios = <&gpio1 13 GPIO_ACTIVE_LOW>; + label = "Blue LED"; + }; + }; +}; + +&semc { + status = "disabled"; +}; + +&lpuart1 { + status = "okay"; + pinctrl-0 = <&pinmux_lpuart1>; + pinctrl-names = "default"; + current-speed = <115200>; +}; + +&lpuart3 { + status = "okay"; + pinctrl-0 = <&pinmux_lpuart3>; + pinctrl-names = "default"; + current-speed = <115200>; +}; + +&lpuart4 { + status = "okay"; + pinctrl-0 = <&pinmux_lpuart4>; + pinctrl-names = "default"; + current-speed = <115200>; +}; + +&lpuart5 { + status = "okay"; + pinctrl-0 = <&pinmux_lpuart5>; + pinctrl-names = "default"; + current-speed = <115200>; +}; + +&lpuart6 { + status = "okay"; + pinctrl-0 = <&pinmux_lpuart6>; + pinctrl-names = "default"; + current-speed = <115200>; +}; + +&lpuart8 { + status = "okay"; + pinctrl-0 = <&pinmux_lpuart8>; + pinctrl-names = "default"; + current-speed = <115200>; +}; + +&lpuart10 { + status = "okay"; + pinctrl-0 = <&pinmux_lpuart10>; + pinctrl-names = "default"; + current-speed = <115200>; +}; + +&lpuart11 { + status = "okay"; + pinctrl-0 = <&pinmux_lpuart11>; + pinctrl-names = "default"; + current-speed = <115200>; +}; + +&green_led { + status = "okay"; +}; + +&enet1g { + pinctrl-0 = <&pinmux_enet>; + pinctrl-names = "default"; +}; + +&flexcan1 { + pinctrl-0 = <&pinmux_flexcan1>; + pinctrl-names = "default"; +}; + +&flexcan2 { + pinctrl-0 = <&pinmux_flexcan2>; + pinctrl-names = "default"; +}; + +&flexcan3 { + pinctrl-0 = <&pinmux_flexcan3>; + pinctrl-names = "default"; +}; + +&lpi2c1 { + pinctrl-0 =<&pinmux_lpi2c1>; + pinctrl-names = "default"; +}; + +&lpi2c2 { + pinctrl-0 =<&pinmux_lpi2c2>; + pinctrl-names = "default"; +}; + +&lpi2c3 { + pinctrl-0 =<&pinmux_lpi2c3>; + pinctrl-names = "default"; +}; + +&lpi2c6 { + pinctrl-0 =<&pinmux_lpi2c6>; + pinctrl-names = "default"; +}; + +&lpspi1 { + pinctrl-0 = <&pinmux_lpspi1>; + pinctrl-names = "default"; +}; + +&lpspi2 { + pinctrl-0 = <&pinmux_lpspi2>; + pinctrl-names = "default"; +}; + +&lpspi3 { + pinctrl-0 = <&pinmux_lpspi3>; + pinctrl-names = "default"; +}; + +&lpspi6 { + pinctrl-0 = <&pinmux_lpspi6>; + pinctrl-names = "default"; +}; + +&lpadc1 { + pinctrl-0 = <&pinmux_lpadc1>; + pinctrl-names = "default"; +}; + +&flexspi { + pinctrl-0 = <&pinmux_flexspi1>; + pinctrl-names = "default"; +}; + +&usdhc1 { + pinctrl-0 = <&pinmux_usdhc1>; + pinctrl-names = "default"; +}; + +&flexspi { + status = "okay"; + ahb-prefetch; + ahb-read-addr-opt; + rx-clock-source = <1>; + reg = <0x400cc000 0x4000>, <0x30000000 DT_SIZE_M(16)>; + mx25um51345g: mx25um51345g@0 { + compatible = "nxp,imx-flexspi-mx25um51345g"; + /* MX25UM51245G is 64MB, 512MBit flash part */ + size = ; + reg = <0>; + spi-max-frequency = <200000000>; + status = "okay"; + jedec-id = [c2 81 3a]; + erase-block-size = <4096>; + write-block-size = <16>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 DT_SIZE_K(128)>; + }; + slot0_partition: partition@20000 { + label = "image-0"; + reg = <0x00020000 DT_SIZE_K(3076)>; + }; + slot1_partition: partition@321000 { + label = "image-1"; + reg = <0x00321000 DT_SIZE_K(3072)>; + }; + storage_partition: partition@621000 { + label = "storage"; + reg = <0x00621000 DT_SIZE_M(57)>; + }; + }; + }; +}; diff --git a/boards/arm/vmu_rt1170/vmu_rt1170.yaml b/boards/arm/vmu_rt1170/vmu_rt1170.yaml new file mode 100644 index 00000000000..0b60cd42e75 --- /dev/null +++ b/boards/arm/vmu_rt1170/vmu_rt1170.yaml @@ -0,0 +1,29 @@ +# +# Copyright (c) 2021, NXP +# +# SPDX-License-Identifier: Apache-2.0 +# + +identifier: vmu_rt1170 +name: NXP VMU RT1170 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +ram: 256 +flash: 65536 +supported: + - adc + - counter + - can + - dma + - gpio + - hwinfo + - i2c + - netif:eth + - pwm + - spi + - usb_device + - watchdog diff --git a/boards/arm/vmu_rt1170/vmu_rt1170_defconfig b/boards/arm/vmu_rt1170/vmu_rt1170_defconfig new file mode 100644 index 00000000000..875d84e7b64 --- /dev/null +++ b/boards/arm/vmu_rt1170/vmu_rt1170_defconfig @@ -0,0 +1,23 @@ +# +# Copyright (c) 2021, NXP +# +# SPDX-License-Identifier: Apache-2.0 +# + +CONFIG_SOC_MIMXRT1176_CM7=y +CONFIG_SOC_SERIES_IMX_RT=y +CONFIG_CONSOLE=y +CONFIG_SHELL=y +CONFIG_UART_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_GPIO=y +CONFIG_ARM_MPU=y +CONFIG_HW_STACK_PROTECTION=y +CONFIG_FLEXSPI_CONFIG_BLOCK_OFFSET=0x400 +CONFIG_PINCTRL=y + +# Enable Regulators +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_INIT_PRIORITY=75 + +CONFIG_TICKLESS_KERNEL=n diff --git a/soc/arm/nxp_imx/rt/flexspi_nor_config.h b/soc/arm/nxp_imx/rt/flexspi_nor_config.h index b00e90b4baa..3eac1ce548c 100644 --- a/soc/arm/nxp_imx/rt/flexspi_nor_config.h +++ b/soc/arm/nxp_imx/rt/flexspi_nor_config.h @@ -90,7 +90,8 @@ enum { kFlexSpiSerialClk_100MHz = 6, kFlexSpiSerialClk_133MHz = 7, }; -#elif defined(CONFIG_SOC_MIMXRT1051) || defined(CONFIG_SOC_MIMXRT1052) +#elif defined(CONFIG_SOC_MIMXRT1051) || defined(CONFIG_SOC_MIMXRT1052) || \ + defined(CONFIG_SOC_SERIES_IMX_RT11XX) enum { kFlexSpiSerialClk_30MHz = 1, kFlexSpiSerialClk_50MHz = 2, diff --git a/tests/drivers/adc/adc_api/boards/vmu_rt1170.overlay b/tests/drivers/adc/adc_api/boards/vmu_rt1170.overlay new file mode 100644 index 00000000000..2b310ca6f3f --- /dev/null +++ b/tests/drivers/adc/adc_api/boards/vmu_rt1170.overlay @@ -0,0 +1,34 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright 2023 CogniPilot Foundation + */ + +#include + +/ { + zephyr,user { + io-channels = <&lpadc1 0>, <&lpadc1 1>; + }; +}; + +&lpadc1 { + #address-cells = <1>; + #size-cells = <0>; + + channel@0 { + reg = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; + + channel@1 { + reg = <1>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; +};