You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by bt...@apache.org on 2020/12/04 18:18:53 UTC
[incubator-nuttx] 01/04: board/arm/imxrt: Added Teensy-4 BSP based
on imxrt1060-evk
This is an automated email from the ASF dual-hosted git repository.
btashton pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 11be65db8bd29a3a518b9025cc52b5a31201cbf9
Author: Michal Lenc <le...@fel.cvut.cz>
AuthorDate: Wed Dec 2 23:54:34 2020 +0100
board/arm/imxrt: Added Teensy-4 BSP based on imxrt1060-evk
Signed-off-by: Michal Lenc <le...@fel.cvut.cz>
---
boards/arm/imxrt/teensy-4.x/Kconfig | 36 ++
boards/arm/imxrt/teensy-4.x/README.txt | 177 ++++++++++
.../arm/imxrt/teensy-4.x/configs/can-4.1/defconfig | 80 +++++
.../imxrt/teensy-4.x/configs/netnsh-4.1/defconfig | 77 +++++
.../arm/imxrt/teensy-4.x/configs/nsh-4.0/defconfig | 40 +++
.../arm/imxrt/teensy-4.x/configs/nsh-4.1/defconfig | 40 +++
.../arm/imxrt/teensy-4.x/configs/sd-4.1/defconfig | 65 ++++
boards/arm/imxrt/teensy-4.x/include/board.h | 311 ++++++++++++++++++
boards/arm/imxrt/teensy-4.x/kernel/Makefile | 103 ++++++
.../arm/imxrt/teensy-4.x/kernel/imxrt_userspace.c | 116 +++++++
boards/arm/imxrt/teensy-4.x/scripts/Make.defs | 96 ++++++
boards/arm/imxrt/teensy-4.x/scripts/flash-ocram.ld | 186 +++++++++++
boards/arm/imxrt/teensy-4.x/scripts/flash.ld | 139 ++++++++
.../arm/imxrt/teensy-4.x/scripts/kernel-space.ld | 104 ++++++
boards/arm/imxrt/teensy-4.x/scripts/memory.ld | 67 ++++
boards/arm/imxrt/teensy-4.x/scripts/user-space.ld | 120 +++++++
boards/arm/imxrt/teensy-4.x/src/Makefile | 57 ++++
boards/arm/imxrt/teensy-4.x/src/imxrt_adc.c | 112 +++++++
boards/arm/imxrt/teensy-4.x/src/imxrt_appinit.c | 99 ++++++
boards/arm/imxrt/teensy-4.x/src/imxrt_autoleds.c | 165 ++++++++++
boards/arm/imxrt/teensy-4.x/src/imxrt_boot.c | 118 +++++++
boards/arm/imxrt/teensy-4.x/src/imxrt_bringup.c | 182 +++++++++++
boards/arm/imxrt/teensy-4.x/src/imxrt_ethernet.c | 275 ++++++++++++++++
boards/arm/imxrt/teensy-4.x/src/imxrt_flexcan.c | 83 +++++
.../imxrt/teensy-4.x/src/imxrt_flexspi_nor_boot.c | 58 ++++
.../imxrt/teensy-4.x/src/imxrt_flexspi_nor_boot.h | 157 +++++++++
.../imxrt/teensy-4.x/src/imxrt_flexspi_nor_flash.c | 137 ++++++++
.../imxrt/teensy-4.x/src/imxrt_flexspi_nor_flash.h | 364 +++++++++++++++++++++
boards/arm/imxrt/teensy-4.x/src/imxrt_i2c.c | 114 +++++++
boards/arm/imxrt/teensy-4.x/src/imxrt_spi.c | 212 ++++++++++++
boards/arm/imxrt/teensy-4.x/src/imxrt_userleds.c | 82 +++++
boards/arm/imxrt/teensy-4.x/src/teensy-4.h | 195 +++++++++++
32 files changed, 4167 insertions(+)
diff --git a/boards/arm/imxrt/teensy-4.x/Kconfig b/boards/arm/imxrt/teensy-4.x/Kconfig
new file mode 100644
index 0000000..4fb15fc
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/Kconfig
@@ -0,0 +1,36 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+if ARCH_BOARD_TEENSY_4X
+choice
+ prompt "Boot Flash"
+ default TEENSY4_QSPI_FLASH
+
+config TEENSY4_QSPI_FLASH
+ bool "QSPI Flash"
+
+endchoice # Boot Flash
+
+choice
+ prompt "Board configuration"
+
+config TEENSY_40
+ bool "Teensy 4.0"
+
+config TEENSY_41
+ bool "Teensy 4.1"
+
+endchoice # Board configuration
+
+menu "Sensors interfaces"
+
+config BMP280_LPI2C
+ int "LPI2C interface for BMP280 sensor"
+ depends on SENSORS_BMP280
+ default 4
+
+endmenu # Sensors interfaces
+
+endif
diff --git a/boards/arm/imxrt/teensy-4.x/README.txt b/boards/arm/imxrt/teensy-4.x/README.txt
new file mode 100644
index 0000000..dd72284
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/README.txt
@@ -0,0 +1,177 @@
+README
+======
+
+ This README file provides information about the port of NuttX to the Teensy 4.x board. This board features the
+ MIMXRT1062DVL6A MCU. Some of the features of this board include:
+
+ o Processor
+
+ - MIMXRT1062DVL6A processor
+
+ o Memory
+
+ - 1 Mb RAM memory
+ - 2 Mb QSPI Flash
+ - 1 SDIO (4 bit) native SD
+
+ o Connectivity
+
+ - Micro USB host
+ - CAN transceivers
+ - 41 digital pins
+ - 14 analog pins, 2 ADCs on chip
+
+Contents
+========
+
+ o LEDs
+ o Configurations
+ - Configuration sub-directories
+
+LEDs and buttons
+================
+
+ LEDs
+ ----
+
+ There are two LED status indicators located on the Teensy-4.x board.
+ The functions of these LEDs include:
+
+ - RED LED (loading status)
+ - dim: ready
+ - bright: writing
+ - blink: no USB
+ - USER LED(D8)
+
+ Only a single LED, D8, is under software control.
+
+ This LED is not used by the board port unless CONFIG_ARCH_LEDS is
+ defined. In that case, the usage by the board port is defined in
+ include/board.h and src/imxrt_autoleds.c. The LED is used to encode
+ OS-related events as follows:
+
+ ------------------- ----------------------- ------
+ SYMBOL Meaning LED
+ ------------------- ----------------------- ------
+ LED_STARTED NuttX has been started OFF
+ LED_HEAPALLOCATE Heap has been allocated OFF
+ LED_IRQSENABLED Interrupts enabled OFF
+ LED_STACKCREATED Idle stack created ON
+ LED_INIRQ In an interrupt N/C
+ LED_SIGNAL In a signal handler N/C
+ LED_ASSERTION An assertion failed N/C
+ LED_PANIC The system has crashed FLASH
+
+ Thus if the LED is statically on, NuttX has successfully booted and is,
+ apparently, running normally. If the LED is flashing at approximately
+ 2Hz, then a fatal error has been detected and the system has halted.
+
+Configurations
+==============
+
+ Information Common to All Configurations
+ ----------------------------------------
+ Each Teensy-4.x configuration is maintained in a sub-directory and
+ can be selected as follow:
+
+ tools/configure.sh [OPTIONS] teensy-4.x:<subdir>
+
+ Where typical options are -l to configure to build on Linux or -c to
+ configure for Cygwin under Linux. 'tools/configure.sh -h' will show
+ you all of the options.
+
+ Before building, make sure the PATH environment variable include the
+ correct path to the directory than holds your toolchain binaries.
+
+ And then build NuttX by simply typing the following. At the conclusion of
+ the make, the nuttx binary will reside in an ELF file called, simply, nuttx.
+
+ make
+
+ The <subdir> that is provided above as an argument to the tools/configure.sh
+ must be is one of the following.
+
+ NOTES:
+
+ 1. These configurations use the mconf-based configuration tool. To
+ change any of these configurations using that tool, you should:
+
+ a. Build and install the kconfig-mconf tool. See nuttx/README.txt
+ see additional README.txt files in the NuttX tools repository.
+
+ b. Execute 'make menuconfig' in nuttx/ in order to start the
+ reconfiguration process.
+
+ 2. All of these configurations are set up to build under Windows using the
+ "GNU Tools for ARM Embedded Processors" that is maintained by ARM
+ (unless stated otherwise in the description of the configuration).
+
+ https://developer.arm.com/open-source/gnu-toolchain/gnu-rm
+
+ That toolchain selection can easily be reconfigured using
+ 'make menuconfig'. Here are the relevant current settings:
+
+ Build Setup:
+ CONFIG_HOST_WINDOWS=y : Window environment
+ CONFIG_WINDOWS_CYGWIN=y : Cywin under Windows
+
+ System Type -> Toolchain:
+ CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIW=y : GNU ARM EABI toolchain
+
+Configuration sub-directories
+-----------------------------
+
+
+ nsh-4.0:
+
+ Configures the NuttShell (nsh) located at examples/nsh for Teensy 4.0.
+ This NSH configuration is focused on low level, command-line driver testing.
+ Built-in applications are supported, but none are enabled. NutShells then
+ runs on UART6: Pin 0 is RX and pin 1 is TX
+
+ nsh-4.1:
+
+ Configures the NuttShell (nsh) located at examples/nsh for Teensy 4.1.
+ This NSH configuration is focused on low level, command-line driver testing.
+ Built-in applications are supported, but none are enabled. NutShells then
+ runs on UART1: Pin 24 is TX and pin 25 is RX
+
+ can-4.1:
+
+ This is an nsh configuration (see above) for Teensy-4.x with added support of
+ CAN driver. FlexCAN3 is chosen as default, the change can be made at System
+ type peripheral selection.
+
+ Bitrate and sample point can be also changed at System type peripheral selection,
+ basic values are 1 MHz for bitrate and 0.80 for sample point. The FlexCAN driver
+ for imxrt runs at 80 MHz clock frequency.
+
+ The configuration also includes CAN utilities as candump and cansend.
+
+ CAN_FD supported but not enabled. For CAN_FD please select following:
+
+ CAN_FD = y
+ NET_CAN_CANFD = y
+ NET_CAN_SOCK_OPTS = y
+
+ This configuration can be easily changed to work with Teensy 4.0 by
+ selecting CONFIG_TEENSY_40=y.
+
+ netnsh-4.1:
+
+ This configuration is similar to the nsh configuration except that is
+ has networking enabled, both IPv4 and IPv6. This NSH configuration is
+ focused on network-related testing.
+
+ This configuration cannot be changed to Teensy 4.0 as this board does
+ not have Ethernet capability.
+
+ sd-4.1
+
+ This is an nsh configuration (see above) for Teensy-4.x with added support of
+ connecting micro SD card.
+
+ You can mount micro SD card by "mount -t vfat /dev/mmcsd0 /mnt"
+
+ This configuration cannot be changed to Teensy 4.0 as this board does
+ not have micro SD card slot.
diff --git a/boards/arm/imxrt/teensy-4.x/configs/can-4.1/defconfig b/boards/arm/imxrt/teensy-4.x/configs/can-4.1/defconfig
new file mode 100644
index 0000000..f87e886
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/configs/can-4.1/defconfig
@@ -0,0 +1,80 @@
+#
+# This file is autogenerated: PLEASE DO NOT EDIT IT.
+#
+# You can use "make menuconfig" to make any modifications to the installed .config file.
+# You can then do "make savedefconfig" to generate a new defconfig file that includes your
+# modifications.
+#
+# CONFIG_NET_CAN_CANFD is not set
+# CONFIG_NET_ETHERNET is not set
+# CONFIG_NET_IPv4 is not set
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="teensy-4.x"
+CONFIG_ARCH_BOARD_TEENSY_4X=y
+CONFIG_ARCH_CHIP="imxrt"
+CONFIG_ARCH_CHIP_IMXRT=y
+CONFIG_ARCH_CHIP_MIMXRT1062DVL6A=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_ARMV7M_DCACHE=y
+CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y
+CONFIG_ARMV7M_ICACHE=y
+CONFIG_ARMV7M_USEBASEPRI=y
+CONFIG_BOARD_LOOPSPERMSEC=104926
+CONFIG_BUILTIN=y
+CONFIG_TEENSY_41=y
+CONFIG_CAN=y
+CONFIG_CANUTILS_CANDUMP=y
+CONFIG_CANUTILS_CANSEND=y
+CONFIG_DEBUG_BINFMT=y
+CONFIG_DEBUG_BINFMT_ERROR=y
+CONFIG_DEBUG_BINFMT_INFO=y
+CONFIG_DEBUG_BINFMT_WARN=y
+CONFIG_DEBUG_CAN=y
+CONFIG_DEBUG_CAN_ERROR=y
+CONFIG_DEBUG_CAN_INFO=y
+CONFIG_DEBUG_CAN_WARN=y
+CONFIG_DEBUG_ERROR=y
+CONFIG_DEBUG_FEATURES=y
+CONFIG_DEBUG_FULLOPT=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_IRQ=y
+CONFIG_DEBUG_IRQ_ERROR=y
+CONFIG_DEBUG_IRQ_INFO=y
+CONFIG_DEBUG_IRQ_WARN=y
+CONFIG_DEBUG_NET=y
+CONFIG_DEBUG_NET_ERROR=y
+CONFIG_DEBUG_NET_INFO=y
+CONFIG_DEBUG_NET_WARN=y
+CONFIG_DEBUG_SYMBOLS=y
+CONFIG_DEBUG_WARN=y
+CONFIG_FS_PROCFS=y
+CONFIG_IDLETHREAD_STACKSIZE=2048
+CONFIG_IMXRT_FLEXCAN3=y
+CONFIG_IMXRT_LPUART1=y
+CONFIG_INTELHEX_BINARY=y
+CONFIG_LPUART1_SERIAL_CONSOLE=y
+CONFIG_MAX_TASKS=16
+CONFIG_NET=y
+CONFIG_NETDEVICES=y
+CONFIG_NETDEV_IFINDEX=y
+CONFIG_NETDEV_LATEINIT=y
+CONFIG_NETDEV_STATISTICS=y
+CONFIG_NET_CAN=y
+CONFIG_NET_CAN_NOTIFIER=y
+CONFIG_NET_SOCKOPTS=y
+CONFIG_NET_STATISTICS=y
+CONFIG_NET_TIMESTAMP=y
+CONFIG_NFILE_DESCRIPTORS=8
+CONFIG_NSH_ARCHINIT=y
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_LINELEN=64
+CONFIG_NSH_READLINE=y
+CONFIG_RAM_SIZE=1048576
+CONFIG_RAM_START=0x20200000
+CONFIG_SCHED_HPWORK=y
+CONFIG_SIG_DEFAULT=y
+CONFIG_START_DAY=14
+CONFIG_START_MONTH=3
+CONFIG_SYSTEM_NSH=y
+CONFIG_USER_ENTRYPOINT="nsh_main"
diff --git a/boards/arm/imxrt/teensy-4.x/configs/netnsh-4.1/defconfig b/boards/arm/imxrt/teensy-4.x/configs/netnsh-4.1/defconfig
new file mode 100644
index 0000000..f125ae2
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/configs/netnsh-4.1/defconfig
@@ -0,0 +1,77 @@
+#
+# This file is autogenerated: PLEASE DO NOT EDIT IT.
+#
+# You can use "make menuconfig" to make any modifications to the installed .config file.
+# You can then do "make savedefconfig" to generate a new defconfig file that includes your
+# modifications.
+#
+# CONFIG_ARCH_LEDS is not set
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="teensy-4.x"
+CONFIG_ARCH_BOARD_TEENSY_4X=y
+CONFIG_ARCH_CHIP="imxrt"
+CONFIG_ARCH_CHIP_IMXRT=y
+CONFIG_ARCH_CHIP_MIMXRT1062DVL6A=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_ARMV7M_DCACHE=y
+CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y
+CONFIG_ARMV7M_ICACHE=y
+CONFIG_ARMV7M_USEBASEPRI=y
+CONFIG_BOARD_LOOPSPERMSEC=104926
+CONFIG_BUILTIN=y
+CONFIG_DEBUG_ERROR=y
+CONFIG_DEBUG_FEATURES=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_NET=y
+CONFIG_DEBUG_NET_ERROR=y
+CONFIG_DEBUG_NET_INFO=y
+CONFIG_DEBUG_NET_WARN=y
+CONFIG_DEBUG_WARN=y
+CONFIG_ETH0_PHY_DP83825I=y
+CONFIG_FS_PROCFS=y
+CONFIG_IDLETHREAD_STACKSIZE=2048
+CONFIG_IMXRT_ENET=y
+CONFIG_IMXRT_LPUART1=y
+CONFIG_INTELHEX_BINARY=y
+CONFIG_LIB_HOSTNAME="Teensy 4.x"
+CONFIG_LPUART1_SERIAL_CONSOLE=y
+CONFIG_MAX_TASKS=16
+CONFIG_NET=y
+CONFIG_NETDB_DNSCLIENT=y
+CONFIG_NETDEV_STATISTICS=y
+CONFIG_NETINIT_DHCPC=y
+CONFIG_NETINIT_NOMAC=y
+CONFIG_NETUTILS_TELNETD=y
+CONFIG_NET_ARP_SEND=y
+CONFIG_NET_BROADCAST=y
+CONFIG_NET_ICMP=y
+CONFIG_NET_ICMP_SOCKET=y
+CONFIG_NET_ICMPv6=y
+CONFIG_NET_ICMPv6_NEIGHBOR=y
+CONFIG_NET_ICMPv6_SOCKET=y
+CONFIG_NET_IPv6=y
+CONFIG_NET_SOCKOPTS=y
+CONFIG_NET_STATISTICS=y
+CONFIG_NET_TCP=y
+CONFIG_NET_TCPBACKLOG=y
+CONFIG_NET_TCP_WRITE_BUFFERS=y
+CONFIG_NET_UDP=y
+CONFIG_NET_UDP_WRITE_BUFFERS=y
+CONFIG_NFILE_DESCRIPTORS=8
+CONFIG_NSH_ARCHINIT=y
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_LINELEN=64
+CONFIG_NSH_READLINE=y
+CONFIG_RAM_SIZE=1048576
+CONFIG_RAM_START=0x20200000
+CONFIG_READLINE_CMD_HISTORY=y
+CONFIG_SCHED_LPWORK=y
+CONFIG_START_DAY=14
+CONFIG_START_MONTH=3
+CONFIG_SYSTEM_DHCPC_RENEW=y
+CONFIG_SYSTEM_NSH=y
+CONFIG_SYSTEM_PING6=y
+CONFIG_SYSTEM_PING=y
+CONFIG_TEENSY_41=y
+CONFIG_USER_ENTRYPOINT="nsh_main"
diff --git a/boards/arm/imxrt/teensy-4.x/configs/nsh-4.0/defconfig b/boards/arm/imxrt/teensy-4.x/configs/nsh-4.0/defconfig
new file mode 100644
index 0000000..5a488ef
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/configs/nsh-4.0/defconfig
@@ -0,0 +1,40 @@
+#
+# This file is autogenerated: PLEASE DO NOT EDIT IT.
+#
+# You can use "make menuconfig" to make any modifications to the installed .config file.
+# You can then do "make savedefconfig" to generate a new defconfig file that includes your
+# modifications.
+#
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="teensy-4.x"
+CONFIG_ARCH_BOARD_TEENSY_4X=y
+CONFIG_ARCH_CHIP="imxrt"
+CONFIG_ARCH_CHIP_IMXRT=y
+CONFIG_ARCH_CHIP_MIMXRT1062DVL6A=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_TEENSY_40=y
+CONFIG_ARMV7M_DCACHE=y
+CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y
+CONFIG_ARMV7M_ICACHE=y
+CONFIG_ARMV7M_USEBASEPRI=y
+CONFIG_BOARD_LOOPSPERMSEC=104926
+CONFIG_BUILTIN=y
+CONFIG_FS_PROCFS=y
+CONFIG_IDLETHREAD_STACKSIZE=2048
+CONFIG_IMXRT_LPUART6=y
+CONFIG_INTELHEX_BINARY=y
+CONFIG_LPUART6_SERIAL_CONSOLE=y
+CONFIG_MAX_TASKS=16
+CONFIG_NFILE_DESCRIPTORS=8
+CONFIG_NSH_ARCHINIT=y
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_DISABLE_IFUPDOWN=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_LINELEN=64
+CONFIG_NSH_READLINE=y
+CONFIG_RAM_SIZE=1048576
+CONFIG_RAM_START=0x20200000
+CONFIG_START_DAY=14
+CONFIG_START_MONTH=3
+CONFIG_SYSTEM_NSH=y
+CONFIG_USER_ENTRYPOINT="nsh_main"
diff --git a/boards/arm/imxrt/teensy-4.x/configs/nsh-4.1/defconfig b/boards/arm/imxrt/teensy-4.x/configs/nsh-4.1/defconfig
new file mode 100644
index 0000000..e838212
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/configs/nsh-4.1/defconfig
@@ -0,0 +1,40 @@
+#
+# This file is autogenerated: PLEASE DO NOT EDIT IT.
+#
+# You can use "make menuconfig" to make any modifications to the installed .config file.
+# You can then do "make savedefconfig" to generate a new defconfig file that includes your
+# modifications.
+#
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="teensy-4.x"
+CONFIG_ARCH_BOARD_TEENSY_4X=y
+CONFIG_ARCH_CHIP="imxrt"
+CONFIG_ARCH_CHIP_IMXRT=y
+CONFIG_ARCH_CHIP_MIMXRT1062DVL6A=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_ARMV7M_DCACHE=y
+CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y
+CONFIG_ARMV7M_ICACHE=y
+CONFIG_ARMV7M_USEBASEPRI=y
+CONFIG_BOARD_LOOPSPERMSEC=104926
+CONFIG_BUILTIN=y
+CONFIG_FS_PROCFS=y
+CONFIG_IDLETHREAD_STACKSIZE=2048
+CONFIG_IMXRT_LPUART1=y
+CONFIG_INTELHEX_BINARY=y
+CONFIG_LPUART1_SERIAL_CONSOLE=y
+CONFIG_MAX_TASKS=16
+CONFIG_NFILE_DESCRIPTORS=8
+CONFIG_NSH_ARCHINIT=y
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_DISABLE_IFUPDOWN=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_LINELEN=64
+CONFIG_NSH_READLINE=y
+CONFIG_RAM_SIZE=1048576
+CONFIG_RAM_START=0x20200000
+CONFIG_START_DAY=14
+CONFIG_START_MONTH=3
+CONFIG_SYSTEM_NSH=y
+CONFIG_TEENSY_41=y
+CONFIG_USER_ENTRYPOINT="nsh_main"
diff --git a/boards/arm/imxrt/teensy-4.x/configs/sd-4.1/defconfig b/boards/arm/imxrt/teensy-4.x/configs/sd-4.1/defconfig
new file mode 100644
index 0000000..8bb085b
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/configs/sd-4.1/defconfig
@@ -0,0 +1,65 @@
+#
+# This file is autogenerated: PLEASE DO NOT EDIT IT.
+#
+# You can use "make menuconfig" to make any modifications to the installed .config file.
+# You can then do "make savedefconfig" to generate a new defconfig file that includes your
+# modifications.
+#
+# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set
+# CONFIG_MMCSD_SPI is not set
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="teensy-4.x"
+CONFIG_ARCH_BOARD_TEENSY_4X=y
+CONFIG_ARCH_CHIP="imxrt"
+CONFIG_ARCH_CHIP_IMXRT=y
+CONFIG_ARCH_CHIP_MIMXRT1062DVL6A=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_ARMV7M_DCACHE=y
+CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y
+CONFIG_ARMV7M_ICACHE=y
+CONFIG_ARMV7M_USEBASEPRI=y
+CONFIG_BOARD_LOOPSPERMSEC=104926
+CONFIG_BUILTIN=y
+CONFIG_DEBUG_ASSERTIONS=y
+CONFIG_DEBUG_ERROR=y
+CONFIG_DEBUG_FEATURES=y
+CONFIG_DEBUG_FS=y
+CONFIG_DEBUG_FS_ERROR=y
+CONFIG_DEBUG_FS_INFO=y
+CONFIG_DEBUG_FS_WARN=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_WARN=y
+CONFIG_FAT_LCNAMES=y
+CONFIG_FAT_LFN=y
+CONFIG_FS_FAT=y
+CONFIG_FS_PROCFS=y
+CONFIG_IDLETHREAD_STACKSIZE=2048
+CONFIG_IMXRT_LPUART1=y
+CONFIG_IMXRT_USDHC1=y
+CONFIG_IMXRT_USDHC1_INVERT_CD=y
+CONFIG_IMXRT_USDHC1_WIDTH_D1_D4=y
+CONFIG_INTELHEX_BINARY=y
+CONFIG_LPUART1_SERIAL_CONSOLE=y
+CONFIG_MAX_TASKS=16
+CONFIG_MMCSD=y
+CONFIG_MMCSD_MULTIBLOCK_DISABLE=y
+CONFIG_MMCSD_SDIO=y
+CONFIG_NFILE_DESCRIPTORS=8
+CONFIG_NSH_ARCHINIT=y
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_DISABLE_IFUPDOWN=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_LINELEN=64
+CONFIG_NSH_READLINE=y
+CONFIG_RAM_SIZE=1048576
+CONFIG_RAM_START=0x20200000
+CONFIG_SCHED_HPWORK=y
+CONFIG_SDIO_BLOCKSETUP=y
+CONFIG_SPI=y
+CONFIG_SPI_CALLBACK=y
+CONFIG_SPI_CMDDATA=y
+CONFIG_START_DAY=14
+CONFIG_START_MONTH=3
+CONFIG_SYSTEM_NSH=y
+CONFIG_TEENSY_41=y
+CONFIG_USER_ENTRYPOINT="nsh_main"
diff --git a/boards/arm/imxrt/teensy-4.x/include/board.h b/boards/arm/imxrt/teensy-4.x/include/board.h
new file mode 100644
index 0000000..86a9665
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/include/board.h
@@ -0,0 +1,311 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/include/board.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __BOARDS_ARM_IMXRT_TEENSY_4_INCLUDE_BOARD_H
+#define __BOARDS_ARM_IMXRT_TEENSY_4_INCLUDE_BOARD_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/* Do not include i.MXRT header files here. */
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Clocking *****************************************************************/
+
+/* Set VDD_SOC to 1.25V */
+
+#define IMXRT_VDD_SOC (0x12)
+
+/* Set Arm PLL (PLL1) to fOut = (24Mhz * ARM_PLL_DIV_SELECT/2) /
+ * ARM_PODF_DIVISOR
+ * 600Mhz = (24Mhz * ARM_PLL_DIV_SELECT/2) /
+ * ARM_PODF_DIVISOR
+ * ARM_PLL_DIV_SELECT = 100
+ * ARM_PODF_DIVISOR = 2
+ * 600Mhz = (24Mhz * 100/2) / 2
+ *
+ * AHB_CLOCK_ROOT = PLL1fOut / IMXRT_AHB_PODF_DIVIDER
+ * 1Hz to 600 MHz = 600Mhz / IMXRT_ARM_CLOCK_DIVIDER
+ * IMXRT_ARM_CLOCK_DIVIDER = 1
+ * 600Mhz = 600Mhz / 1
+ *
+ * PRE_PERIPH_CLK_SEL = PRE_PERIPH_CLK_SEL_PLL1
+ * PERIPH_CLK_SEL = 1 (0 select PERIPH_CLK2_PODF,
+ * 1 select PRE_PERIPH_CLK_SEL_PLL1)
+ * PERIPH_CLK = 600Mhz
+ *
+ * IPG_CLOCK_ROOT = AHB_CLOCK_ROOT / IMXRT_IPG_PODF_DIVIDER
+ * IMXRT_IPG_PODF_DIVIDER = 4
+ * 150Mhz = 600Mhz / 4
+ *
+ * PRECLK_CLOCK_ROOT = IPG_CLOCK_ROOT /
+ * IMXRT_PERCLK_PODF_DIVIDER
+ * IMXRT_PERCLK_PODF_DIVIDER = 9
+ * 16.6Mhz = 150Mhz / 9
+ *
+ * SEMC_CLK_ROOT = 600Mhz / IMXRT_SEMC_PODF_DIVIDER
+ * (labeled AIX_PODF in 18.2)
+ * IMXRT_SEMC_PODF_DIVIDER = 8
+ * 75Mhz = 600Mhz / 8
+ *
+ * Set Sys PLL (PLL2) to fOut = (24Mhz * (20+(2*(DIV_SELECT)))
+ * 528Mhz = (24Mhz * (20+(2*(1)))
+ *
+ * Set USB1 PLL (PLL3) to fOut = (24Mhz * 20)
+ * 480Mhz = (24Mhz * 20)
+ *
+ * Set LPSPI PLL3 PFD0 to fOut = (480Mhz / 12 * 18)
+ * 720Mhz = (480Mhz / 12 * 18)
+ * 90Mhz = (720Mhz / LSPI_PODF_DIVIDER)
+ *
+ * Set LPI2C PLL3 / 8 to fOut = (480Mhz / 8)
+ * 60Mhz = (480Mhz / 8)
+ * 12Mhz = (60Mhz / LSPI_PODF_DIVIDER)
+ *
+ * These clock frequencies can be verified via the CCM_CLKO1 pin and sending
+ * the appropriate clock to it with something like;
+ *
+ * putreg32( <Clk number> | CCM_CCOSR_CLKO1_EN , IMXRT_CCM_CCOSR);
+ * imxrt_config_gpio(GPIO_CCM_CLKO1);
+ */
+
+#define BOARD_XTAL_FREQUENCY 24000000
+#define IMXRT_PRE_PERIPH_CLK_SEL CCM_CBCMR_PRE_PERIPH_CLK_SEL_PLL1
+#define IMXRT_PERIPH_CLK_SEL CCM_CBCDR_PERIPH_CLK_SEL_PRE_PERIPH
+#define IMXRT_ARM_PLL_DIV_SELECT 100
+#define IMXRT_ARM_PODF_DIVIDER 2
+#define IMXRT_AHB_PODF_DIVIDER 1
+#define IMXRT_IPG_PODF_DIVIDER 4
+#define IMXRT_PERCLK_CLK_SEL CCM_CSCMR1_PERCLK_CLK_SEL_IPG_CLK_ROOT
+#define IMXRT_PERCLK_PODF_DIVIDER 9
+#define IMXRT_SEMC_PODF_DIVIDER 8
+
+#define IMXRT_LPSPI_CLK_SELECT CCM_CBCMR_LPSPI_CLK_SEL_PLL3_PFD0
+#define IMXRT_LSPI_PODF_DIVIDER 8
+
+#define IMXRT_LPI2C_CLK_SELECT CCM_CSCDR2_LPI2C_CLK_SEL_PLL3_60M
+#define IMXRT_LSI2C_PODF_DIVIDER 5
+
+#define IMXRT_CAN_CLK_SELECT CCM_CSCMR2_CAN_CLK_SEL_PLL3_SW_80
+#define IMXRT_CAN_PODF_DIVIDER 1
+
+#define IMXRT_SYS_PLL_SELECT CCM_ANALOG_PLL_SYS_DIV_SELECT_22
+
+#define IMXRT_USB1_PLL_DIV_SELECT CCM_ANALOG_PLL_USB1_DIV_SELECT_20
+
+#define BOARD_CPU_FREQUENCY \
+ (BOARD_XTAL_FREQUENCY * (IMXRT_ARM_PLL_DIV_SELECT / 2)) / IMXRT_ARM_PODF_DIVIDER
+
+/* Define this to enable tracing */
+
+#if 0
+# define IMXRT_TRACE_PODF_DIVIDER 1
+# define IMXRT_TRACE_CLK_SELECT CCM_CBCMR_TRACE_CLK_SEL_PLL2_PFD0
+#endif
+
+/* LED definitions **********************************************************/
+
+/* There are four LED status indicators located on the EVK Board.
+ * The functions of these LEDs include:
+ *
+ * - Main Power Supply(D3)
+ * Green: DC 5V main supply is normal.
+ * Red: J2 input voltage is over 5.6V.
+ * Off: The board is not powered.
+ * - Reset RED LED(D15)
+ * - OpenSDA LED(D16)
+ * - USER LED(D8)
+ *
+ * Only a single LED, D8, is under software control.
+ */
+
+/* LED index values for use with board_userled() */
+
+#define BOARD_USERLED 0
+#define BOARD_NLEDS 1
+
+/* LED bits for use with board_userled_all() */
+
+#define BOARD_USERLED_BIT (1 << BOARD_USERLED)
+
+/* This LED is not used by the board port unless CONFIG_ARCH_LEDS is
+ * defined. In that case, the usage by the board port is defined in
+ * include/board.h and src/imxrt_autoleds.c. The LED is used to encode
+ * OS-related events as follows:
+ *
+ * -------------------- ----------------------------- ------
+ * SYMBOL Meaning LED
+ * -------------------- ----------------------------- ------
+ */
+
+#define LED_STARTED 0 /* NuttX has been started OFF */
+#define LED_HEAPALLOCATE 0 /* Heap has been allocated OFF */
+#define LED_IRQSENABLED 0 /* Interrupts enabled OFF */
+#define LED_STACKCREATED 1 /* Idle stack created ON */
+#define LED_INIRQ 2 /* In an interrupt N/C */
+#define LED_SIGNAL 2 /* In a signal handler N/C */
+#define LED_ASSERTION 2 /* An assertion failed N/C */
+#define LED_PANIC 3 /* The system has crashed FLASH */
+#undef LED_IDLE /* Not used */
+
+/* Thus if the LED is statically on, NuttX has successfully booted and is,
+ * apparently, running normally. If the LED is flashing at approximately
+ * 2Hz, then a fatal error has been detected and the system has halted.
+ */
+
+/* SDIO *********************************************************************/
+
+/* Pin drive characteristics - drive strength in particular may need tuning
+ * for specific boards, but has been checked by scope on the EVKB to make
+ * sure shapes are square with minimal ringing.
+ */
+
+#define PIN_USDHC1_D0 (GPIO_USDHC1_DATA0_1 | IOMUX_USDHC1_DATAX_DEFAULT)
+#define PIN_USDHC1_D1 (GPIO_USDHC1_DATA1_1 | IOMUX_USDHC1_DATAX_DEFAULT)
+#define PIN_USDHC1_D2 (GPIO_USDHC1_DATA3_1 | IOMUX_USDHC1_DATAX_DEFAULT)
+#define PIN_USDHC1_D3 (GPIO_USDHC1_DATA2_1 | IOMUX_USDHC1_DATAX_DEFAULT)
+#define PIN_USDHC1_DCLK (GPIO_USDHC1_CLK_1 | IOMUX_USDHC1_CLK_DEFAULT)
+#define PIN_USDHC1_CMD (GPIO_USDHC1_CMD_1 | IOMUX_USDHC1_CMD_DEFAULT)
+#define PIN_USDHC1_CD (PIN_USDHC1_D3)
+
+/* 386 KHz for initial inquiry stuff */
+
+#define BOARD_USDHC_IDMODE_PRESCALER USDHC_SYSCTL_SDCLKFS_DIV256
+#define BOARD_USDHC_IDMODE_DIVISOR USDHC_SYSCTL_DVS_DIV(2)
+
+/* 24.8MHz for other modes */
+
+#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)
+
+/* ETH Disambiguation *******************************************************/
+
+#define GPIO_ENET_TX_DATA00 (GPIO_ENET_TX_DATA00_1| \
+ IOMUX_ENET_DATA_DEFAULT) /* GPIO_B1_07 */
+#define GPIO_ENET_TX_DATA01 (GPIO_ENET_TX_DATA01_1| \
+ IOMUX_ENET_DATA_DEFAULT) /* GPIO_B1_08 */
+#define GPIO_ENET_RX_DATA00 (GPIO_ENET_RX_DATA00_1| \
+ IOMUX_ENET_DATA_DEFAULT) /* GPIO_B1_04 */
+#define GPIO_ENET_RX_DATA01 (GPIO_ENET_RX_DATA01_1| \
+ IOMUX_ENET_DATA_DEFAULT) /* GPIO_B1_05 */
+#define GPIO_ENET_MDIO (GPIO_ENET_MDIO_1|IOMUX_ENET_MDIO_DEFAULT) /* GPIO_B1_15 */
+#define GPIO_ENET_MDC (GPIO_ENET_MDC_1|IOMUX_ENET_MDC_DEFAULT) /* GPIO_B1_14 */
+#define GPIO_ENET_RX_EN (GPIO_ENET_RX_EN_1|IOMUX_ENET_EN_DEFAULT) /* GPIO_B1_06 */
+#define GPIO_ENET_RX_ER (GPIO_ENET_RX_ER_1|IOMUX_ENET_RXERR_DEFAULT) /* GPIO_B1_11 */
+#define GPIO_ENET_TX_CLK (GPIO_ENET_REF_CLK_2|\
+ IOMUX_ENET_TX_CLK_DEFAULT) /* GPIO_B1_10 */
+#define GPIO_ENET_TX_EN (GPIO_ENET_TX_EN_1|IOMUX_ENET_EN_DEFAULT) /* GPIO_B1_09 */
+
+/* PIO Disambiguation *******************************************************/
+
+/* LPUARTs
+ *
+ * Virtual console port provided by OpenSDA on UART1 and
+ * Arduino RS-232 Shield on UART3.
+ *
+ */
+
+#define GPIO_LPUART1_RX (GPIO_LPUART1_RX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B0_13 */
+#define GPIO_LPUART1_TX (GPIO_LPUART1_TX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B0_12 */
+#define GPIO_LPUART3_RX (GPIO_LPUART3_RX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B1_07 */
+#define GPIO_LPUART3_TX (GPIO_LPUART3_TX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B1_06 */
+#define GPIO_LPUART6_RX (GPIO_LPUART6_RX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B0_03 */
+#define GPIO_LPUART6_TX (GPIO_LPUART6_TX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B0_02 */
+
+/* LPI2Cs */
+
+#define GPIO_LPI2C1_SDA (GPIO_LPI2C1_SDA_2|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B1_01 */
+#define GPIO_LPI2C1_SCL (GPIO_LPI2C1_SCL_2|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B1_00 */
+#define GPIO_LPI2C3_SDA (GPIO_LPI2C3_SDA_1|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B1_06 */
+#define GPIO_LPI2C3_SCL (GPIO_LPI2C3_SCL_1|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B1_07 */
+#define GPIO_LPI2C4_SDA (GPIO_LPI2C4_SDA_1|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B0_13 */
+#define GPIO_LPI2C4_SCL (GPIO_LPI2C4_SCL_1|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B0_12 */
+
+/* LPSPI3
+ *
+ * pin 39 GPIO_AD_B1_13 LPSPI3_SDI
+ * pin 26 GPIO_AD_B1_14 LPSPI3_SDO
+ * pin 27 GPIO_AD_B1_15 LPSPI3_SCK
+ */
+
+#define GPIO_LPSPI3_MOSI (GPIO_LPSPI3_SDI_1|IOMUX_LPSPI_DEFAULT) /* GPIO_AD_B1_13 */
+#define GPIO_LPSPI3_MISO (GPIO_LPSPI3_SDO_1|IOMUX_LPSPI_DEFAULT) /* GPIO_AD_B1_14 */
+#define GPIO_LPSPI3_SCK (GPIO_LPSPI3_SCK_1|IOMUX_LPSPI_DEFAULT) /* GPIO_AD_B1_15 */
+
+/* LPSPI4
+ *
+ * pin 12 GPIO_B0_01 LPSPI3_SDI
+ * pin 11 GPIO_B0_02 LPSPI3_SDO
+ * pin 13 GPIO_B0_03 LPSPI3_SCK
+ */
+
+#define GPIO_LPSPI4_MOSI (GPIO_LPSPI4_SDI_2|IOMUX_LPSPI_DEFAULT) /* GPIO_B0_01 */
+#define GPIO_LPSPI4_MISO (GPIO_LPSPI4_SDO_2|IOMUX_LPSPI_DEFAULT) /* GPIO_B0_02 */
+#define GPIO_LPSPI4_SCK (GPIO_LPSPI4_SCK_2|IOMUX_LPSPI_DEFAULT) /* GPIO_B0_03 */
+
+/* FlexCAN */
+
+#define GPIO_FLEXCAN1_TX (GPIO_FLEXCAN1_TX_1|IOMUX_CAN_DEFAULT) /* GPIO_AD_B1_08 */
+#define GPIO_FLEXCAN1_RX (GPIO_FLEXCAN1_RX_1|IOMUX_CAN_DEFAULT) /* GPIO_AD_B1_09 */
+
+#define GPIO_FLEXCAN2_TX (GPIO_FLEXCAN2_TX_1|IOMUX_CAN_DEFAULT) /* GPIO_AD_B0_02 */
+#define GPIO_FLEXCAN2_RX (GPIO_FLEXCAN2_RX_1|IOMUX_CAN_DEFAULT) /* GPIO_AD_B0_03 */
+
+#define GPIO_FLEXCAN3_TX (GPIO_FLEXCAN3_TX_3|IOMUX_CAN_DEFAULT) /* GPIO_EMC_36 */
+#define GPIO_FLEXCAN3_RX (GPIO_FLEXCAN3_RX_3|IOMUX_CAN_DEFAULT) /* GPIO_EMC_37 */
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __BOARDS_ARM_IMXRT_TEENSY_4_INCLUDE_BOARD_H */
diff --git a/boards/arm/imxrt/teensy-4.x/kernel/Makefile b/boards/arm/imxrt/teensy-4.x/kernel/Makefile
new file mode 100644
index 0000000..0e17d49
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/kernel/Makefile
@@ -0,0 +1,103 @@
+############################################################################
+# boards/arm/imxrt/teensy-4.x/kernel/Make.defs
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+include $(TOPDIR)/Make.defs
+
+# The entry point name (if none is provided in the .config file)
+
+CONFIG_USER_ENTRYPOINT ?= user_start
+ENTRYPT = $(patsubst "%",%,$(CONFIG_USER_ENTRYPOINT))
+
+# Get the paths to the libraries and the links script path in format that
+# is appropriate for the host OS
+
+ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
+ # Windows-native toolchains
+ USER_LIBPATHS = ${shell for path in $(USERLIBS); do dir=`dirname $(TOPDIR)$(DELIM)$$path`;echo "-L\"`cygpath -w $$dir`\"";done}
+ USER_LDSCRIPT = -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)memory.ld}"
+ USER_LDSCRIPT += -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)user-space.ld}"
+ USER_HEXFILE += "${shell cygpath -w $(TOPDIR)$(DELIM)nuttx_user.hex}"
+ USER_SRECFILE += "${shell cygpath -w $(TOPDIR)$(DELIM)nuttx_user.srec}"
+ USER_BINFILE += "${shell cygpath -w $(TOPDIR)$(DELIM)nuttx_user.bin}"
+else
+ # Linux/Cygwin-native toolchain
+ USER_LIBPATHS = $(addprefix -L$(TOPDIR)$(DELIM),$(dir $(USERLIBS)))
+ USER_LDSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)memory.ld
+ USER_LDSCRIPT += -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)user-space.ld
+ USER_HEXFILE += "$(TOPDIR)$(DELIM)nuttx_user.hex"
+ USER_SRECFILE += "$(TOPDIR)$(DELIM)nuttx_user.srec"
+ USER_BINFILE += "$(TOPDIR)$(DELIM)nuttx_user.bin"
+endif
+
+USER_LDFLAGS = --undefined=$(ENTRYPT) --entry=$(ENTRYPT) $(USER_LDSCRIPT)
+USER_LDLIBS = $(patsubst lib%,-l%,$(basename $(notdir $(USERLIBS))))
+USER_LIBGCC = "${shell "$(CC)" $(ARCHCPUFLAGS) -print-libgcc-file-name}"
+
+# Source files
+
+CSRCS = imxrt_userspace.c
+COBJS = $(CSRCS:.c=$(OBJEXT))
+OBJS = $(COBJS)
+
+# Targets:
+
+all: $(TOPDIR)$(DELIM)nuttx_user.elf $(TOPDIR)$(DELIM)User.map
+.PHONY: nuttx_user.elf depend clean distclean
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+# Create the nuttx_user.elf file containing all of the user-mode code
+
+nuttx_user.elf: $(OBJS)
+ $(Q) $(LD) -o $@ $(USER_LDFLAGS) $(USER_LIBPATHS) $(OBJS) --start-group $(USER_LDLIBS) --end-group $(USER_LIBGCC)
+
+$(TOPDIR)$(DELIM)nuttx_user.elf: nuttx_user.elf
+ @echo "LD: nuttx_user.elf"
+ $(Q) cp -a nuttx_user.elf $(TOPDIR)$(DELIM)nuttx_user.elf
+ifeq ($(CONFIG_INTELHEX_BINARY),y)
+ @echo "CP: nuttx_user.hex"
+ $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O ihex nuttx_user.elf $(USER_HEXFILE)
+endif
+ifeq ($(CONFIG_MOTOROLA_SREC),y)
+ @echo "CP: nuttx_user.srec"
+ $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O srec nuttx_user.elf $(USER_SRECFILE)
+endif
+ifeq ($(CONFIG_RAW_BINARY),y)
+ @echo "CP: nuttx_user.bin"
+ $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O binary nuttx_user.elf $(USER_BINFILE)
+endif
+
+$(TOPDIR)$(DELIM)User.map: nuttx_user.elf
+ @echo "MK: User.map"
+ $(Q) $(NM) nuttx_user.elf >$(TOPDIR)$(DELIM)User.map
+ $(Q) $(CROSSDEV)size nuttx_user.elf
+
+.depend:
+
+depend: .depend
+
+clean:
+ $(call DELFILE, nuttx_user.elf)
+ $(call DELFILE, "$(TOPDIR)$(DELIM)nuttx_user.*")
+ $(call DELFILE, "$(TOPDIR)$(DELIM)User.map")
+ $(call CLEAN)
+
+distclean: clean
diff --git a/boards/arm/imxrt/teensy-4.x/kernel/imxrt_userspace.c b/boards/arm/imxrt/teensy-4.x/kernel/imxrt_userspace.c
new file mode 100644
index 0000000..557da3d
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/kernel/imxrt_userspace.c
@@ -0,0 +1,116 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/kernel/imxrt_userspace.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdlib.h>
+
+#include <nuttx/userspace.h>
+#include <nuttx/wqueue.h>
+#include <nuttx/mm/mm.h>
+
+#if defined(CONFIG_BUILD_PROTECTED) && !defined(__KERNEL__)
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Configuration ************************************************************/
+
+#ifndef CONFIG_NUTTX_USERSPACE
+# error "CONFIG_NUTTX_USERSPACE not defined"
+#endif
+
+#if CONFIG_NUTTX_USERSPACE != 0x60200000
+# error "CONFIG_NUTTX_USERSPACE must be 0x60200000 to match user-space.ld"
+#endif
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/* These 'addresses' of these values are setup by the linker script.
+ * They are not actual uint32_t storage locations!
+ * They are only used meaningfully in the following way:
+ *
+ * - The linker script defines, for example, the symbol_sdata.
+ * - The declareion extern uint32_t _sdata; makes C happy. C will believe
+ * that the value _sdata is the address of a uint32_t variable _data (it
+ * is not!).
+ * - We can recoved the linker value then by simply taking the address of
+ * of _data. like: uint32_t *pdata = &_sdata;
+ */
+
+extern uint32_t _stext; /* Start of .text */
+extern uint32_t _etext; /* End_1 of .text + .rodata */
+extern const uint32_t _eronly; /* End+1 of read only section (.text + .rodata) */
+extern uint32_t _sdata; /* Start of .data */
+extern uint32_t _edata; /* End+1 of .data */
+extern uint32_t _sbss; /* Start of .bss */
+extern uint32_t _ebss; /* End+1 of .bss */
+
+/* This is the user space entry point */
+
+int CONFIG_USER_ENTRYPOINT(int argc, char *argv[]);
+
+const struct userspace_s userspace __attribute__ ((section (".userspace"))) =
+{
+ /* General memory map */
+
+ .us_entrypoint = (main_t)CONFIG_USER_ENTRYPOINT,
+ .us_textstart = (uintptr_t)&_stext,
+ .us_textend = (uintptr_t)&_etext,
+ .us_datasource = (uintptr_t)&_eronly,
+ .us_datastart = (uintptr_t)&_sdata,
+ .us_dataend = (uintptr_t)&_edata,
+ .us_bssstart = (uintptr_t)&_sbss,
+ .us_bssend = (uintptr_t)&_ebss,
+
+ /* Memory manager heap structure */
+
+ .us_heap = &g_mmheap,
+
+ /* Task/thread startup routines */
+
+ .task_startup = nxtask_startup,
+#ifndef CONFIG_DISABLE_PTHREAD
+ .pthread_startup = pthread_startup,
+#endif
+
+ /* Signal handler trampoline */
+
+ .signal_handler = up_signal_handler,
+
+ /* User-space work queue support (declared in include/nuttx/wqueue.h) */
+
+#ifdef CONFIG_LIB_USRWORK
+ .work_usrstart = work_usrstart,
+#endif
+};
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+#endif /* CONFIG_BUILD_PROTECTED && !__KERNEL__ */
diff --git a/boards/arm/imxrt/teensy-4.x/scripts/Make.defs b/boards/arm/imxrt/teensy-4.x/scripts/Make.defs
new file mode 100644
index 0000000..2757a0e
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/scripts/Make.defs
@@ -0,0 +1,96 @@
+############################################################################
+# boards/arm/imxrt/teensy-4.x/scripts/Make.defs
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+include $(TOPDIR)/.config
+include $(TOPDIR)/tools/Config.mk
+include $(TOPDIR)/arch/arm/src/armv7-m/Toolchain.defs
+
+ifeq ($(CONFIG_BOOT_RUNFROMFLASH),y)
+ LDSCRIPT = flash.ld
+else ifeq ($(CONFIG_BOOT_RUNFROMISRAM),y)
+ LDSCRIPT = flash-ocram.ld
+endif
+
+ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
+ ARCHSCRIPT = -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)}"
+else
+ ARCHSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)
+endif
+
+CC = $(CROSSDEV)gcc
+CXX = $(CROSSDEV)g++
+CPP = $(CROSSDEV)gcc -E
+LD = $(CROSSDEV)ld
+STRIP = $(CROSSDEV)strip --strip-unneeded
+AR = $(CROSSDEV)ar rcs
+NM = $(CROSSDEV)nm
+OBJCOPY = $(CROSSDEV)objcopy
+OBJDUMP = $(CROSSDEV)objdump
+
+ARCHCCVERSION = ${shell $(CC) -v 2>&1 | sed -n '/^gcc version/p' | sed -e 's/^gcc version \([0-9\.]\)/\1/g' -e 's/[-\ ].*//g' -e '1q'}
+ARCHCCMAJOR = ${shell echo $(ARCHCCVERSION) | cut -d'.' -f1}
+
+ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
+ ARCHOPTIMIZATION = -g
+endif
+
+ifneq ($(CONFIG_DEBUG_NOOPT),y)
+ ARCHOPTIMIZATION += $(MAXOPTIMIZATION)
+endif
+
+ARCHCFLAGS = -fno-builtin
+ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fcheck-new -fno-rtti
+ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef -fno-strict-aliasing
+ARCHWARNINGSXX = -Wall -Wshadow -Wundef
+ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10
+
+CFLAGS = $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
+CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
+CXXFLAGS = $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
+CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS)
+CPPFLAGS = $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS)
+AFLAGS = $(CFLAGS) -D__ASSEMBLY__
+
+NXFLATLDFLAGS1 = -r -d -warn-common
+NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections
+LDNXFLATFLAGS = -e main -s 2048
+
+# Loadable module definitions
+
+CMODULEFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
+
+LDMODULEFLAGS = -r -e module_initialize
+ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
+ LDMODULEFLAGS += -T "${shell cygpath -w $(TOPDIR)/libs/libc/modlib/gnu-elf.ld}"
+else
+ LDMODULEFLAGS += -T $(TOPDIR)/libs/libc/modlib/gnu-elf.ld
+endif
+
+ifneq ($(CROSSDEV),arm-nuttx-elf-)
+ LDFLAGS += -nostartfiles -nodefaultlibs
+ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
+ LDFLAGS += -Map="${shell cygpath -w $(TOPDIR)/nuttx.map}"
+else
+ LDFLAGS += -Map=$(TOPDIR)/nuttx.map
+endif
+endif
+ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
+ LDFLAGS += -g
+endif
diff --git a/boards/arm/imxrt/teensy-4.x/scripts/flash-ocram.ld b/boards/arm/imxrt/teensy-4.x/scripts/flash-ocram.ld
new file mode 100644
index 0000000..c8b25d8
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/scripts/flash-ocram.ld
@@ -0,0 +1,186 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/scripts/flash-ocram.ld
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Specify the memory areas */
+
+/* The imxrt162-evk has 8MiB of QSPI FLASH beginning at address,
+ * 0x0060:0000, Upto 512Kb of DTCM RAM beginning at 0x2000:0000, and 1MiB OCRAM
+ * beginning at 0x2020:0000. Neither DTCM or SDRAM are used in this
+ * configuration.
+ *
+ * The default flexram setting on the iMXRT 1062 is
+ * 256Kib to OCRRAM, 128Kib ITCM and 128Kib DTCM.
+ * This can be changed by using a dcd by minipulating
+ * IOMUX GPR16 and GPR17.
+ * The configuartion we will use is 384Kib to OCRRAM, 0Kib ITCM and
+ * 128Kib DTCM.
+ *
+ * This is the OCRAM inker script.
+ * The NXP ROM bootloader will move the FLASH image to OCRAM.
+ * We must reserve 32K for the bootloader' OCRAM usage from the OCRAM Size
+ * and an additinal 8K for the ivt_s which is IVT_SIZE(8K) This 40K can be
+ * reused once the application is running.
+ *
+ * 0x2020:A000 to 0x202d:ffff - The application Image's vector table
+ * 0x2020:8000 to 0x2020:A000 - IVT
+ * 0x2020:0000 to 0x2020:7fff - NXP ROM bootloader.
+ *
+ * We artificially split the FLASH to allow locating sections that we do not
+ * want loaded inoto OCRAM. This is to save on OCRAM where the speen of the
+ * code does not matter.
+ *
+ */
+
+MEMORY
+{
+ flash (rx) : ORIGIN = 0x60000000, LENGTH = 7M
+ flashxip (rx) : ORIGIN = 0x60700000, LENGTH = 1M
+ /* Vectors @ boot+ivt OCRAM2 Flex RAM Boot IVT */
+ sram (rwx) : ORIGIN = 0x2020A000, LENGTH = 512K + 256K + 128K - (32K + 8K)
+ itcm (rwx) : ORIGIN = 0x00000000, LENGTH = 0K
+ dtcm (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
+}
+
+OUTPUT_ARCH(arm)
+EXTERN(_vectors)
+EXTERN(g_flash_config)
+EXTERN(g_image_vector_table)
+EXTERN(g_boot_data)
+EXTERN(g_dcd_data)
+
+ENTRY(_stext)
+
+SECTIONS
+{
+ /* Image Vector Table and Boot Data for booting from external flash */
+
+ .boot_hdr : ALIGN(4)
+ {
+ FILL(0xff)
+ __boot_hdr_start__ = ABSOLUTE(.) ;
+ KEEP(*(.boot_hdr.conf))
+ . = 0x1000 ;
+ KEEP(*(.boot_hdr.ivt))
+ . = 0x1020 ;
+ KEEP(*(.boot_hdr.boot_data))
+ . = 0x1030 ;
+ KEEP(*(.boot_hdr.dcd_data))
+ __boot_hdr_end__ = ABSOLUTE(.) ;
+ . = 0x2000 ;
+ } > flash
+
+ /* Catch all the section we want not in OCRAM so that the *(.text .text.*) in flash does not */
+
+ .flashxip : ALIGN(4)
+ {
+ FILL(0xff)
+
+ /* Order matters */
+
+ imxrt_start.o(.text)
+ imxrt_boot.o(.text)
+
+ *(.slow_memory)
+ *(.rodata .rodata.*)
+ KEEP(*(__param*))
+ *(.fixup)
+ *(.gnu.warning)
+ *(.gnu.linkonce.t.*)
+ *(.glue_7)
+ *(.glue_7t)
+ *(.got)
+ *(.gcc_except_table)
+ *(.gnu.linkonce.r.*)
+
+ } > flashxip
+
+ .text :
+ {
+ _stext = ABSOLUTE(.);
+ *(.vectors)
+ *(.text .text.*)
+ _etext = ABSOLUTE(.);
+ } > sram AT > flash
+
+ .init_section :
+ {
+ _sinit = ABSOLUTE(.);
+ *(.init_array .init_array.*)
+ _einit = ABSOLUTE(.);
+ } > flash
+
+ .ARM.extab :
+ {
+ *(.ARM.extab*)
+ } > flash
+
+ .ARM.exidx :
+ {
+ __exidx_start = ABSOLUTE(.);
+ *(.ARM.exidx*)
+ __exidx_end = ABSOLUTE(.);
+ } > flash
+
+ _eronly = ABSOLUTE(.);
+
+ .data :
+ {
+ _sdata = ABSOLUTE(.);
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+ CONSTRUCTORS
+ . = ALIGN(4);
+ _edata = ABSOLUTE(.);
+ } > sram AT > flash
+
+ .ramfunc ALIGN(4):
+ {
+ _sramfuncs = ABSOLUTE(.);
+ *(.ramfunc .ramfunc.*)
+ _eramfuncs = ABSOLUTE(.);
+ } > sram AT > flash
+
+ _framfuncs = LOADADDR(.ramfunc);
+
+ .bss :
+ {
+ _sbss = ABSOLUTE(.);
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ . = ALIGN(4);
+ _ebss = ABSOLUTE(.);
+ } > sram
+
+ /* Stabs debugging sections. */
+
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_info 0 : { *(.debug_info) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+}
diff --git a/boards/arm/imxrt/teensy-4.x/scripts/flash.ld b/boards/arm/imxrt/teensy-4.x/scripts/flash.ld
new file mode 100644
index 0000000..572afe8
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/scripts/flash.ld
@@ -0,0 +1,139 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/scripts/flash.ld
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Specify the memory areas */
+
+MEMORY
+{
+ flash (rx) : ORIGIN = 0x60000000, LENGTH = 1984K
+ sram (rwx) : ORIGIN = 0x20200000, LENGTH = 512K
+ itcm (rwx) : ORIGIN = 0x00000000, LENGTH = 512K
+ dtcm (rwx) : ORIGIN = 0x20000000, LENGTH = 512K
+}
+
+OUTPUT_ARCH(arm)
+EXTERN(_vectors)
+EXTERN(g_flash_config)
+EXTERN(g_image_vector_table)
+EXTERN(g_boot_data)
+
+ENTRY(_stext)
+
+SECTIONS
+{
+ /* Image Vector Table and Boot Data for booting from external flash */
+
+ .boot_hdr : ALIGN(4)
+ {
+ FILL(0xff)
+ __boot_hdr_start__ = ABSOLUTE(.) ;
+ KEEP(*(.boot_hdr.conf))
+ . = 0x1000 ;
+ KEEP(*(.boot_hdr.ivt))
+ . = 0x1020 ;
+ KEEP(*(.boot_hdr.boot_data))
+ . = 0x1030 ;
+ KEEP(*(.boot_hdr.dcd_data))
+ __boot_hdr_end__ = ABSOLUTE(.) ;
+ . = 0x2000 ;
+ } >flash
+
+ .text :
+ {
+ _stext = ABSOLUTE(.);
+ *(.vectors)
+ *(.text .text.*)
+ *(.fixup)
+ *(.gnu.warning)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.t.*)
+ *(.glue_7)
+ *(.glue_7t)
+ *(.got)
+ *(.gcc_except_table)
+ *(.gnu.linkonce.r.*)
+ _etext = ABSOLUTE(.);
+ } > flash
+
+ .init_section :
+ {
+ _sinit = ABSOLUTE(.);
+ *(.init_array .init_array.*)
+ _einit = ABSOLUTE(.);
+ } > flash
+
+ .ARM.extab :
+ {
+ *(.ARM.extab*)
+ } > flash
+
+ .ARM.exidx :
+ {
+ __exidx_start = ABSOLUTE(.);
+ *(.ARM.exidx*)
+ __exidx_end = ABSOLUTE(.);
+ } > flash
+
+ _eronly = ABSOLUTE(.);
+
+ .data :
+ {
+ _sdata = ABSOLUTE(.);
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+ CONSTRUCTORS
+ . = ALIGN(4);
+ _edata = ABSOLUTE(.);
+ } > sram AT > flash
+
+ .ramfunc ALIGN(4):
+ {
+ _sramfuncs = ABSOLUTE(.);
+ *(.ramfunc .ramfunc.*)
+ _eramfuncs = ABSOLUTE(.);
+ } > sram AT > flash
+
+ _framfuncs = LOADADDR(.ramfunc);
+
+ .bss :
+ {
+ _sbss = ABSOLUTE(.);
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ . = ALIGN(4);
+ _ebss = ABSOLUTE(.);
+ } > sram
+
+ /* Stabs debugging sections. */
+
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_info 0 : { *(.debug_info) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+}
diff --git a/boards/arm/imxrt/teensy-4.x/scripts/kernel-space.ld b/boards/arm/imxrt/teensy-4.x/scripts/kernel-space.ld
new file mode 100644
index 0000000..1f9cffc
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/scripts/kernel-space.ld
@@ -0,0 +1,104 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/scripts/kernel-space.ld
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* NOTE: This depends on the memory.ld script having been included prior to
+ * this script.
+ */
+
+OUTPUT_ARCH(arm)
+EXTERN(_vectors)
+ENTRY(_stext)
+
+SECTIONS
+{
+ .text :
+ {
+ _stext = ABSOLUTE(.);
+ *(.vectors)
+ *(.text .text.*)
+ *(.fixup)
+ *(.gnu.warning)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.t.*)
+ *(.glue_7)
+ *(.glue_7t)
+ *(.got)
+ *(.gcc_except_table)
+ *(.gnu.linkonce.r.*)
+ _etext = ABSOLUTE(.);
+ } > kflash
+
+ .init_section :
+ {
+ _sinit = ABSOLUTE(.);
+ *(.init_array .init_array.*)
+ _einit = ABSOLUTE(.);
+ } > kflash
+
+ .ARM.extab :
+ {
+ *(.ARM.extab*)
+ } > kflash
+
+ __exidx_start = ABSOLUTE(.);
+ .ARM.exidx :
+ {
+ *(.ARM.exidx*)
+ } > kflash
+
+ __exidx_end = ABSOLUTE(.);
+
+ _eronly = ABSOLUTE(.);
+
+ .data :
+ {
+ _sdata = ABSOLUTE(.);
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+ CONSTRUCTORS
+ . = ALIGN(4);
+ _edata = ABSOLUTE(.);
+ } > kocram AT > kflash
+
+ .bss :
+ {
+ _sbss = ABSOLUTE(.);
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ . = ALIGN(4);
+ _ebss = ABSOLUTE(.);
+ } > kocram
+
+ /* Stabs debugging sections */
+
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_info 0 : { *(.debug_info) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+}
diff --git a/boards/arm/imxrt/teensy-4.x/scripts/memory.ld b/boards/arm/imxrt/teensy-4.x/scripts/memory.ld
new file mode 100644
index 0000000..9f6606c
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/scripts/memory.ld
@@ -0,0 +1,67 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/scripts/memory.ld
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* The i.MXRT1060-EVK has 8MiB of Hyper FLASH beginning at address,
+ * 0x0060:0000, Up to 512Kb of DTCM RAM beginning at 0x2000:0000, and 1MiB OCRAM
+ * beginning at 0x2020:0000. Neither DTCM or SDRAM are used in this
+ * configuration.
+ *
+ * The user and kernel space partitions will be spanned with a single
+ * region of size 2**n bytes. As a consequence, as the partitions increase
+ * in size, the alignment requirement also increases. The sizes below give
+ * the largest possible user address spaces (but leave far too much for the
+ * OS).
+ *
+ * The solution to this wasted memory is to (1) use more than one region to
+ * span the user spaces, or (2) poke holes in a larger region (via sub-
+ * regions) to trim it to fit better.
+ *
+ * A detailed memory map for the 512KB SRAM region is as follows:
+ *
+ * 0x2020 0000: Kernel .data region. Typical size: 0.1KB
+ * ------ ---- Kernel .bss region. Typical size: 1.8KB
+ * 0x2020 0800: Kernel IDLE thread stack (approximate). Size is
+ * determined by CONFIG_IDLETHREAD_STACKSIZE and
+ * adjustments for alignment. Typical is 1KB.
+ * ------ ---- Padded to 4KB
+ * 0x2040 0000: User .data region. Size is variable.
+ * ------- ---- User .bss region Size is variable.
+ * 0x2042 0000: Beginning of kernel heap. Size determined by
+ * CONFIG_MM_KERNEL_HEAPSIZE.
+ * ------ ---- Beginning of user heap. Can vary with other settings.
+ * 0x2080 0000: End+1 of mappable OCRAM
+ */
+
+/* Specify the memory areas */
+
+MEMORY
+{
+ /* 8MiB of HyperFLASH */
+
+ kflash (rx) : ORIGIN = 0x60000000, LENGTH = 1M
+ uflash (rx) : ORIGIN = 0x60200000, LENGTH = 1M
+ flash (rx) : ORIGIN = 0x60400000, LENGTH = 6M
+
+ /* 1MiB of OCRAM */
+
+ dtcm (rwx) : ORIGIN = 0x20000000, LENGTH = 512K
+ kocram (rwx) : ORIGIN = 0x20200000, LENGTH = 512K
+ uocram (rwx) : ORIGIN = 0x20240000, LENGTH = 512K
+}
diff --git a/boards/arm/imxrt/teensy-4.x/scripts/user-space.ld b/boards/arm/imxrt/teensy-4.x/scripts/user-space.ld
new file mode 100644
index 0000000..65695c0
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/scripts/user-space.ld
@@ -0,0 +1,120 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/scripts/user-space.ld
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* NOTE: This depends on the memory.ld script having been included prior to
+ * this script.
+ */
+
+/* Make sure that the critical memory management functions are in user-space.
+ * the user heap memory manager will reside in user-space but be usable both
+ * by kernel- and user-space code
+ */
+
+EXTERN(umm_initialize)
+EXTERN(umm_addregion)
+EXTERN(umm_trysemaphore)
+EXTERN(umm_givesemaphore)
+
+EXTERN(malloc)
+EXTERN(realloc)
+EXTERN(zalloc)
+EXTERN(free)
+
+OUTPUT_ARCH(arm)
+SECTIONS
+{
+ .userspace :
+ {
+ *(.userspace)
+ } > uflash
+
+ .text :
+ {
+ _stext = ABSOLUTE(.);
+ *(.text .text.*)
+ *(.fixup)
+ *(.gnu.warning)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.t.*)
+ *(.glue_7)
+ *(.glue_7t)
+ *(.got)
+ *(.gcc_except_table)
+ *(.gnu.linkonce.r.*)
+ _etext = ABSOLUTE(.);
+ } > uflash
+
+ .init_section :
+ {
+ _sinit = ABSOLUTE(.);
+ *(.init_array .init_array.*)
+ _einit = ABSOLUTE(.);
+ } > uflash
+
+ .ARM.extab :
+ {
+ *(.ARM.extab*)
+ } > uflash
+
+ __exidx_start = ABSOLUTE(.);
+ .ARM.exidx :
+ {
+ *(.ARM.exidx*)
+ } > uflash
+
+ __exidx_end = ABSOLUTE(.);
+
+ _eronly = ABSOLUTE(.);
+
+ .data :
+ {
+ _sdata = ABSOLUTE(.);
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+ CONSTRUCTORS
+ . = ALIGN(4);
+ _edata = ABSOLUTE(.);
+ } > uocram AT > uflash
+
+ .bss :
+ {
+ _sbss = ABSOLUTE(.);
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ . = ALIGN(4);
+ _ebss = ABSOLUTE(.);
+ } > uocram
+
+ /* Stabs debugging sections */
+
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_info 0 : { *(.debug_info) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+}
diff --git a/boards/arm/imxrt/teensy-4.x/src/Makefile b/boards/arm/imxrt/teensy-4.x/src/Makefile
new file mode 100644
index 0000000..5de101b
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/Makefile
@@ -0,0 +1,57 @@
+############################################################################
+# boards/arm/imxrt/teensy-4.x/sec/Makefile
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+include $(TOPDIR)/Make.defs
+
+CSRCS = imxrt_boot.c imxrt_flexspi_nor_boot.c imxrt_flexspi_nor_flash.c
+
+ifeq ($(CONFIG_LIB_BOARDCTL),y)
+CSRCS += imxrt_appinit.c imxrt_bringup.c
+else ifeq ($(CONFIG_BOARD_LATE_INITIALIZE),y)
+CSRCS += imxrt_bringup.c
+endif
+
+ifeq ($(CONFIG_ARCH_LEDS),y)
+CSRCS += imxrt_autoleds.c
+else
+CSRCS += imxrt_userleds.c
+endif
+
+ifeq ($(CONFIG_IMXRT_LPSPI),y)
+CSRCS += imxrt_spi.c
+endif
+
+ifeq ($(CONFIG_IMXRT_LPI2C),y)
+CSRCS += imxrt_i2c.c
+endif
+
+ifeq ($(CONFIG_IMXRT_FLEXCAN),y)
+CSRCS += imxrt_flexcan.c
+endif
+
+ifeq ($(CONFIG_IMXRT_ENET),y)
+CSRCS += imxrt_ethernet.c
+endif
+
+ifeq ($(CONFIG_IMXRT_ADC),y)
+CSRCS += imxrt_adc.c
+endif
+
+include $(TOPDIR)/boards/Board.mk
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_adc.c b/boards/arm/imxrt/teensy-4.x/src/imxrt_adc.c
new file mode 100644
index 0000000..5db0732
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_adc.c
@@ -0,0 +1,112 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_adc.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <errno.h>
+#include <debug.h>
+
+#include <nuttx/board.h>
+#include <nuttx/analog/adc.h>
+#include <arch/board/board.h>
+
+#include "chip.h"
+#include "arm_arch.h"
+
+#include "imxrt_adc.h"
+#include "teensy-4.h"
+
+#ifdef CONFIG_IMXRT_ADC
+
+/* channels 1 and 2 have the same number of pins on Teensy */
+
+#define ADC_NCHANNELS 16
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const uint8_t g_chanlist[ADC_NCHANNELS] =
+ {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15
+ };
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: imxrt_adc_setup
+ *
+ * Description:
+ * Initialize and register the ADC driver.
+ *
+ ****************************************************************************/
+
+int imxrt_adc_initialize(void)
+{
+ struct adc_dev_s *adc;
+ int ret;
+
+ /* Call imxrt_adcinitialize() to get an instance of the ADC interface */
+ #ifdef CONFIG_IMXRT_ADC1
+ adc = imxrt_adcinitialize(1, g_chanlist, ADC_NCHANNELS);
+ if (adc == NULL)
+ {
+ aerr("ERROR: Failed to get ADC1 interface\n");
+ return -ENODEV;
+ }
+
+ /* Register the ADC driver at "/dev/adc1" */
+
+ ret = adc_register("/dev/adc1", adc);
+ if (ret < 0)
+ {
+ aerr("ERROR: adc_register adc1 failed: %d\n", ret);
+ return ret;
+ }
+
+ #endif
+ #ifdef CONFIG_IMXRT_ADC2
+ adc = imxrt_adcinitialize(2, g_chanlist, ADC_NCHANNELS);
+ if (adc == NULL)
+ {
+ aerr("ERROR: Failed to get ADC2 interface\n");
+ return -ENODEV;
+ }
+
+ /* Register the ADC driver at "/dev/adc2" */
+
+ ret = adc_register("/dev/adc2", adc);
+ if (ret < 0)
+ {
+ aerr("ERROR: adc_register adc2 failed: %d\n", ret);
+ return ret;
+ }
+ #endif
+
+ return OK;
+}
+
+#endif /* CONFIG_IMXRT_ADC */
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_appinit.c b/boards/arm/imxrt/teensy-4.x/src/imxrt_appinit.c
new file mode 100644
index 0000000..09cb334
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_appinit.c
@@ -0,0 +1,99 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_appinit.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <syslog.h>
+
+#include <nuttx/board.h>
+
+#include "teensy-4.h"
+
+#if !defined(CONFIG_ARCH_LEDS) && defined(CONFIG_USERLED_LOWER)
+# define HAVE_LEDS 0
+#endif
+
+#ifdef CONFIG_LIB_BOARDCTL
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_app_initialize
+ *
+ * Description:
+ * Perform application specific initialization. This function is never
+ * called directly from application code, but only indirectly via the
+ * (non-standard) boardctl() interface using the command BOARDIOC_INIT.
+ *
+ * Input Parameters:
+ * arg - The boardctl() argument is passed to the board_app_initialize()
+ * implementation without modification. The argument has no
+ * meaning to NuttX; the meaning of the argument is a contract
+ * between the board-specific initialization logic and the
+ * matching application logic. The value could be such things as a
+ * mode enumeration value, a set of DIP switch switch settings, a
+ * pointer to configuration data read from a file or serial FLASH,
+ * or whatever you would like to do with it. Every implementation
+ * should accept zero/NULL as a default configuration.
+ *
+ * Returned Value:
+ * Zero (OK) is returned on success; a negated errno value is returned on
+ * any failure to indicate the nature of the failure.
+ *
+ ****************************************************************************/
+
+int board_app_initialize(uintptr_t arg)
+{
+ int ret;
+ #ifdef HAVE_LEDS
+ /* Register the LED driver */
+
+ ret = userled_lower_initialize(LED_DRIVER_PATH);
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: userled_lower_initialize() failed: %d\n", ret);
+ return ret;
+ }
+#endif
+
+#if defined(CONFIG_IMXRT_LPSPI1) || defined(CONFIG_IMXRT_LPSPI2) || \
+ defined(CONFIG_IMXRT_LPSPI3) || defined(CONFIG_IMXRT_LPSPI4)
+ imxrt_spidev_initialize();
+#endif
+
+# ifndef CONFIG_BOARD_LATE_INITIALIZE
+ /* Perform board initialization */
+
+ return imxrt_bringup();
+# else
+ return OK;
+# endif
+
+ UNUSED(ret);
+}
+
+#endif /* CONFIG_LIB_BOARDCTL */
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_autoleds.c b/boards/arm/imxrt/teensy-4.x/src/imxrt_autoleds.c
new file mode 100644
index 0000000..def7598
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_autoleds.c
@@ -0,0 +1,165 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_autoleds.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* There are four LED status indicators located on the EVK Board. The
+ * functions of these LEDs include:
+ *
+ * - Main Power Supply(D3)??
+ * Green: DC 5V main supply is normal.
+ * Red: J2 input voltage is over 5.6V.
+ * Off: The board is not powered.
+ * - Reset RED LED(D21)??
+ * - OpenSDA LED(D20)??
+ * - USER LED(D8)
+ *
+ * Only a single LED, D8, is under software control.
+ *
+ * This LED is not used by the board port unless CONFIG_ARCH_LEDS is
+ * defined. In that case, the usage by the board port is defined in
+ * include/board.h and src/imxrt_autoleds.c. The LED is used to encode
+ * OS-related events as follows:
+ *
+ * -------------------- ----------------------- ------
+ * SYMBOL Meaning LED
+ * -------------------- ----------------------- ------
+ *
+ * LED_STARTED 0 NuttX has been started OFF
+ * LED_HEAPALLOCATE 0 Heap has been allocated OFF
+ * LED_IRQSENABLED 0 Interrupts enabled OFF
+ * LED_STACKCREATED 1 Idle stack created ON
+ * LED_INIRQ 2 In an interrupt N/C
+ * LED_SIGNAL 2 In a signal handler N/C
+ * LED_ASSERTION 2 An assertion failed N/C
+ * LED_PANIC 3 The system has crashed FLASH
+ * LED_IDLE Not used
+ *
+ * Thus if the LED is statically on, NuttX has successfully booted and is,
+ * apparently, running normally. If the LED is flashing at approximately
+ * 2Hz, then a fatal error has been detected and the system has halted.
+ */
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <nuttx/board.h>
+
+#include "imxrt_gpio.h"
+#include "imxrt_iomuxc.h"
+#include <arch/board/board.h>
+#include "teensy-4.h"
+
+#ifdef CONFIG_ARCH_LEDS
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: imxrt_autoled_initialize
+ *
+ * Description:
+ * Initialize NuttX-controlled LED logic
+ *
+ * Input Parameters:
+ * None
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+void imxrt_autoled_initialize(void)
+{
+ /* Configure LED GPIO for output */
+
+ imxrt_config_gpio(GPIO_LED);
+}
+
+/****************************************************************************
+ * Name: board_autoled_on
+ *
+ * Description:
+ * Turn on the "logical" LED state
+ *
+ * Input Parameters:
+ * led - Identifies the "logical" LED state (see definitions in
+ * include/board.h)
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+void board_autoled_on(int led)
+{
+ bool ledon = true;
+
+ switch (led)
+ {
+ case 0: /* LED Off */
+ ledon = false;
+ break;
+
+ case 2: /* LED No change */
+ return;
+
+ case 1: /* LED On */
+ case 3: /* LED On */
+ break;
+ }
+
+ imxrt_gpio_write(GPIO_LED, ledon); /* Low illuminates */
+}
+
+/****************************************************************************
+ * Name: board_autoled_off
+ *
+ * Description:
+ * Turn off the "logical" LED state
+ *
+ * Input Parameters:
+ * led - Identifies the "logical" LED state (see definitions in
+ * include/board.h)
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+void board_autoled_off(int led)
+{
+ switch (led)
+ {
+ case 0: /* LED Off */
+ case 1: /* LED Off */
+ case 3: /* LED Off */
+ break;
+
+ case 2: /* LED No change */
+ return;
+ }
+
+ imxrt_gpio_write(GPIO_LED, false); /* Low illuminates */
+}
+
+#endif /* CONFIG_ARCH_LEDS */
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_boot.c b/boards/arm/imxrt/teensy-4.x/src/imxrt_boot.c
new file mode 100644
index 0000000..4572f65
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_boot.c
@@ -0,0 +1,118 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_boot.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <nuttx/board.h>
+#include <arch/board/board.h>
+
+#include "imxrt_start.h"
+#include "teensy-4.h"
+#include "arm_arch.h"
+#include "imxrt_flexspi_nor_boot.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: imxrt_ocram_initialize
+ *
+ * Description:
+ * Called off reset vector to reconfigure the flexRAM
+ * and finish the FLASH to RAM Copy.
+ *
+ ****************************************************************************/
+
+void imxrt_ocram_initialize(void)
+{
+ const uint32_t *src;
+ uint32_t *dest;
+ uint32_t regval;
+
+ /* Reallocate 128K of Flex RAM from ITCM to OCRAM
+ * Final Configuration is
+ * 128 DTCM
+ *
+ * 128 FlexRAM OCRAM (202C:0000-202D:ffff)
+ * 256 FlexRAM OCRAM (2028:0000-202B:ffff)
+ * 512 System OCRAM2 (2020:0000-2027:ffff)
+ * */
+
+ putreg32(0xaa555555, IMXRT_IOMUXC_GPR_GPR17);
+ regval = getreg32(IMXRT_IOMUXC_GPR_GPR16);
+ putreg32(regval | GPR_GPR16_FLEXRAM_BANK_CFG_SELF, IMXRT_IOMUXC_GPR_GPR16);
+
+ for (src = (uint32_t *) (LOCATE_IN_SRC(g_boot_data.start) +
+ g_boot_data.size),
+ dest = (uint32_t *) (g_boot_data.start + g_boot_data.size);
+ dest < (uint32_t *) & _etext;
+ )
+ {
+ *dest++ = *src++;
+ }
+}
+
+/****************************************************************************
+ * Name: imxrt_boardinitialize
+ *
+ * Description:
+ * All i.MX RT architectures must provide the following entry point. This
+ * entry point is called early in the initialization -- after clocking and
+ * memory have been configured but before caches have been enabled and
+ * before any devices have been initialized.
+ *
+ ****************************************************************************/
+
+void imxrt_boardinitialize(void)
+{
+ /* Configure on-board LEDs if LED support has been selected. */
+
+#ifdef CONFIG_ARCH_LEDS
+ imxrt_autoled_initialize();
+#endif
+}
+
+/****************************************************************************
+ * Name: board_late_initialize
+ *
+ * Description:
+ * If CONFIG_BOARD_LATE_INITIALIZE is selected, then an additional
+ * initialization call will be performed in the boot-up sequence to a
+ * function called board_late_initialize(). board_late_initialize() will
+ * be called immediately after up_intitialize() is called and just before
+ * the initial application is started. This additional initialization
+ * phase may be used, for example, to initialize board-specific device
+ * drivers.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_BOARD_LATE_INITIALIZE
+void board_late_initialize(void)
+{
+ /* Perform board initialization */
+
+ imxrt_bringup();
+}
+#endif /* CONFIG_BOARD_LATE_INITIALIZE */
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_bringup.c b/boards/arm/imxrt/teensy-4.x/src/imxrt_bringup.c
new file mode 100644
index 0000000..6cbaa05
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_bringup.c
@@ -0,0 +1,182 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_bringup.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/mount.h>
+#include <sys/types.h>
+#include <debug.h>
+
+#include <syslog.h>
+#include <nuttx/i2c/i2c_master.h>
+#include <nuttx/video/fb.h>
+#include <imxrt_lpi2c.h>
+#include <imxrt_lpspi.h>
+#include <nuttx/input/buttons.h>
+#include <nuttx/usb/cdcacm.h>
+
+#ifdef CONFIG_IMXRT_USDHC
+# include "imxrt_usdhc.h"
+#endif
+
+#ifdef CONFIG_USBMONITOR
+# include <nuttx/usb/usbmonitor.h>
+#endif
+
+#ifdef CONFIG_VIDEO_FB
+# include <nuttx/video/fb.h>
+#endif
+
+#include "imxrt_enet.h"
+#include "teensy-4.h"
+
+#include <arch/board/board.h> /* Must always be included last */
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Checking needed by MMC/SDCard */
+
+#ifdef CONFIG_NSH_MMCSDMINOR
+# define MMCSD_MINOR CONFIG_NSH_MMCSDMINOR
+#else
+# define MMCSD_MINOR 0
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+#if defined (CONFIG_IMXRT_USDHC) && (CONFIG_TEENSY_41)
+static int nsh_sdmmc_initialize(void)
+{
+ struct sdio_dev_s *sdmmc;
+ int ret = 0;
+
+ /* Get an instance of the SDIO interface */
+
+ sdmmc = imxrt_usdhc_initialize(0);
+ if (!sdmmc)
+ {
+ syslog(LOG_ERR, "ERROR: Failed to initialize SD/MMC\n");
+ }
+ else
+ {
+ /* Bind the SDIO interface to the MMC/SD driver */
+
+ ret = mmcsd_slotinitialize(0, sdmmc);
+ if (ret != OK)
+ {
+ syslog(LOG_ERR,
+ "ERROR: Failed to bind SDIO to the MMC/SD driver: %d\n",
+ ret);
+ }
+
+ imxrt_usdhc_set_sdio_card_isr(sdmmc, NULL, NULL);
+ }
+
+ return OK;
+}
+#else
+# define nsh_sdmmc_initialize() (OK)
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: imxrt_bringup
+ *
+ * Description:
+ * Bring up board features
+ *
+ ****************************************************************************/
+
+int imxrt_bringup(void)
+{
+ int ret;
+
+ /* If we got here then perhaps not all initialization was successful,
+ * but at least enough succeeded to bring-up NSH with perhaps reduced
+ * capabilities.
+ */
+
+#ifdef CONFIG_FS_PROCFS
+ /* Mount the procfs file system */
+
+ ret = mount(NULL, "/proc", "procfs", 0, NULL);
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: Failed to mount procfs at /proc: %d\n", ret);
+ }
+#endif
+
+#if defined(CONFIG_I2C_DRIVER)
+ imxrt_i2c_setup();
+#endif
+
+#ifdef CONFIG_IMXRT_USDHC
+ /* Initialize SDHC-base MMC/SD card support */
+
+ nsh_sdmmc_initialize();
+#endif
+
+#if defined(CONFIG_IMXRT_ENET) && defined(CONFIG_NETDEV_LATEINIT)
+ ret = imxrt_netinitialize(0);
+#endif
+
+#if defined(CONFIG_IMXRT_FLEXCAN) && defined(CONFIG_NETDEV_LATEINIT)
+ ret = imxrt_can_setup();
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: imxrt_can_setup() failed: %d\n", ret);
+ return ret;
+ }
+#endif
+
+#ifdef CONFIG_VIDEO_FB
+ /* Initialize and register the framebuffer driver */
+
+ ret = fb_register(0, 0);
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: fb_register() failed: %d\n", ret);
+ }
+#endif
+
+#ifdef CONFIG_IMXRT_ADC
+ /* Initialize ADC and register the ADC driver. */
+
+ ret = imxrt_adc_initialize();
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: imxrt_adc_initialize() failed: %d\n", ret);
+ }
+#endif
+
+ UNUSED(ret);
+ return OK;
+}
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_ethernet.c b/boards/arm/imxrt/teensy-4.x/src/imxrt_ethernet.c
new file mode 100644
index 0000000..74d78f6
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_ethernet.c
@@ -0,0 +1,275 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_ethernet.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/* Force verbose debug on in this file only to support unit-level testing. */
+
+#ifdef CONFIG_NETDEV_PHY_DEBUG
+# undef CONFIG_DEBUG_INFO
+# define CONFIG_DEBUG_INFO 1
+# undef CONFIG_DEBUG_NET
+# define CONFIG_DEBUG_NET 1
+#endif
+
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <nuttx/irq.h>
+#include <nuttx/arch.h>
+
+#include "imxrt_gpio.h"
+#include "imxrt_enet.h"
+
+#include "teensy-4.h"
+
+#if defined (CONFIG_IMXRT_ENET) && (CONFIG_TEENSY_41)
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define IMXRT_ENET_DEVNAME "eth0"
+
+/* Debug ********************************************************************/
+
+/* Extra, in-depth debug output that is only available if
+ * CONFIG_NETDEV_PHY_DEBUG us defined.
+ */
+
+#ifdef CONFIG_NETDEV_PHY_DEBUG
+# define phyerr _err
+# define phywarn _warn
+# define phyinfo _info
+#else
+# define phyerr(x...)
+# define phywarn(x...)
+# define phyinfo(x...)
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: imxrt_enet_phy_enable
+ ****************************************************************************/
+
+#ifdef CONFIG_IMXRT_GPIO1_0_15_IRQ
+static void imxrt_enet_phy_enable(bool enable)
+{
+ phyinfo("IRQ%d: enable=%d\n", GPIO_ENET_INT, enable);
+
+ if (enable)
+ {
+ up_enable_irq(GPIO_ENET_IRQ);
+ }
+ else
+ {
+ up_disable_irq(GPIO_ENET_IRQ);
+ }
+}
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Function: imxrt_phy_boardinitialize
+ *
+ * Description:
+ * Some boards require specialized initialization of the PHY before it can
+ * be used. This may include such things as configuring GPIOs, resetting
+ * the PHY, etc.
+ * If CONFIG_IMXRT_ENET_PHYINIT is defined in the configuration then the
+ * board specific logic must provide imxrt_phyinitialize();
+ * The i.MX RT Ethernet driver will call this function one time before it
+ * first uses the PHY.
+ *
+ * Input Parameters:
+ * intf - Always zero for now.
+ *
+ * Returned Value:
+ * OK on success; Negated errno on failure.
+ *
+ ****************************************************************************/
+
+int imxrt_phy_boardinitialize(int intf)
+{
+#ifdef CONFIG_IMXRT_GPIO1_0_15_IRQ
+ /* Configure the PHY interrupt pin */
+
+ phyinfo("Configuring interrupt: %08x\n", GPIO_ENET_INT);
+ imxrt_config_gpio(GPIO_ENET_INT);
+#endif
+
+ /* Configure the PHY reset pin.
+ *
+ * The #RST uses inverted logic. The initial value of zero will put the
+ * PHY into the reset state.
+ */
+
+ phyinfo("Configuring reset: %08x\n", GPIO_ENET_RST);
+ imxrt_config_gpio(GPIO_ENET_RST);
+
+ /* Take the PHY out of reset. */
+
+ imxrt_gpio_write(GPIO_ENET_RST, true);
+ return OK;
+}
+
+/****************************************************************************
+ * Name: arch_phy_irq
+ *
+ * Description:
+ * This function may be called to register an interrupt handler that will
+ * be called when a PHY interrupt occurs. This function both attaches
+ * the interrupt handler and enables the interrupt if 'handler' is non-
+ * NULL. If handler is NULL, then the interrupt is detached and disabled
+ * instead.
+ *
+ * The PHY interrupt is always disabled upon return. The caller must
+ * call back through the enable function point to control the state of
+ * the interrupt.
+ *
+ * This interrupt may or may not be available on a given platform depending
+ * on how the network hardware architecture is implemented. In a typical
+ * case, the PHY interrupt is provided to board-level logic as a GPIO
+ * interrupt (in which case this is a board-specific interface and really
+ * should be called board_phy_irq()); In other cases, the PHY interrupt
+ * may be cause by the chip's MAC logic (in which case arch_phy_irq()) is
+ * an appropriate name. Other other boards, there may be no PHY interrupts
+ * available at all. If client attachable PHY interrupts are available
+ * from the board or from the chip, then CONFIG_ARCH_PHY_INTERRUPT should
+ * be defined to indicate that fact.
+ *
+ * Typical usage:
+ * a. OS service logic (not application logic*) attaches to the PHY
+ * PHY interrupt and enables the PHY interrupt.
+ * b. When the PHY interrupt occurs: (1) the interrupt should be
+ * disabled and () work should be scheduled on the worker thread (or
+ * perhaps a dedicated application thread).
+ * c. That worker thread should use the SIOCGMIIPHY, SIOCGMIIREG,
+ * and SIOCSMIIREG ioctl calls** to communicate with the PHY,
+ * determine what network event took place (Link Up/Down?), and
+ * take the appropriate actions.
+ * d. It should then interact the PHY to clear any pending
+ * interrupts, then re-enable the PHY interrupt.
+ *
+ * * This is an OS internal interface and should not be used from
+ * application space. Rather applications should use the SIOCMIISIG
+ * ioctl to receive a signal when a PHY event occurs.
+ * ** This interrupt is really of no use if the Ethernet MAC driver
+ * does not support these ioctl calls.
+ *
+ * Input Parameters:
+ * intf - Identifies the network interface. For example "eth0". Only
+ * useful on platforms that support multiple Ethernet interfaces
+ * and, hence, multiple PHYs and PHY interrupts.
+ * handler - The client interrupt handler to be invoked when the PHY
+ * asserts an interrupt. Must reside in OS space, but can
+ * signal tasks in user space. A value of NULL can be passed
+ * in order to detach and disable the PHY interrupt.
+ * arg - The argument that will accompany the interrupt
+ * enable - A function pointer that be unused to enable or disable the
+ * PHY interrupt.
+ *
+ * Returned Value:
+ * Zero (OK) returned on success; a negated errno value is returned on
+ * failure.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_IMXRT_GPIO1_0_15_IRQ
+int arch_phy_irq(FAR const char *intf, xcpt_t handler, void *arg,
+ phy_enable_t *enable)
+{
+ irqstate_t flags;
+ phy_enable_t enabler;
+ int irq;
+
+ DEBUGASSERT(intf);
+
+ ninfo("%s: handler=%p\n", intf, handler);
+ phyinfo("EMAC: devname=%s\n", IMXRT_ENET_DEVNAME);
+
+ if (strcmp(intf, IMXRT_ENET_DEVNAME) == 0)
+ {
+ irq = GPIO_ENET_IRQ;
+ enabler = imxrt_enet_phy_enable;
+ }
+ else
+ {
+ nerr("ERROR: Unsupported interface: %s\n", intf);
+ return -EINVAL;
+ }
+
+ /* Disable interrupts until we are done. This guarantees that the
+ * following operations are atomic.
+ */
+
+ flags = spin_lock_irqsave();
+
+ /* Configure the interrupt */
+
+ if (handler)
+ {
+ /* The interrupt pin has already been configured as an interrupting
+ * input (by imxrt_phy_boardinitialize() above).
+ *
+ * Attach the new button handler.
+ */
+
+ phyinfo("Attach IRQ%d\n", irq);
+ irq_attach(irq, handler, arg);
+ }
+ else
+ {
+ phyinfo("Detach IRQ%d\n", irq);
+ irq_detach(irq);
+ enabler = NULL;
+ }
+
+ /* Return with the interrupt disabled in either case */
+
+ up_disable_irq(GPIO_ENET_IRQ);
+
+ /* Return the enabling function pointer */
+
+ if (enable)
+ {
+ *enable = enabler;
+ }
+
+ /* Return the old handler (so that it can be restored) */
+
+ spin_unlock_irqrestore(flags);
+ return OK;
+}
+#endif /* CONFIG_IMXRT_GPIO1_0_15_IRQ */
+
+#endif /* CONFIG_IMXRT_ENET && CONFIG_TEENSY_41 */
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_flexcan.c b/boards/arm/imxrt/teensy-4.x/src/imxrt_flexcan.c
new file mode 100644
index 0000000..d12d133
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_flexcan.c
@@ -0,0 +1,83 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_flexcan.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdbool.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <nuttx/can/can.h>
+
+#include "imxrt_flexcan.h"
+#include "teensy-4.h"
+
+#if defined(CONFIG_IMXRT_FLEXCAN) && defined(CONFIG_NETDEV_LATEINIT)
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: imxrt_can_setup
+ *
+ * Description:
+ * Initialize CAN and register the CAN device
+ *
+ ****************************************************************************/
+
+int imxrt_can_setup(void)
+{
+ int ret;
+#ifdef CONFIG_IMXRT_FLEXCAN3
+ /* Call arm_caninitialize() to get an instance of the CAN interface */
+
+ ret = imxrt_caninitialize(3);
+ if (ret < 0)
+ {
+ canerr("ERROR: Failed to get CAN interface\n");
+ return -ENODEV;
+ }
+#elif CONFIG_IMXRT_FLEXCAN2
+ ret = imxrt_caninitialize(2);
+ if (ret < 0)
+ {
+ canerr("ERROR: Failed to get CAN interface\n");
+ return -ENODEV;
+ }
+#elif CONFIG_IMXRT_FLEXCAN1
+ ret = imxrt_caninitialize(1);
+ if (ret < 0)
+ {
+ canerr("ERROR: Failed to get CAN interface\n");
+ return -ENODEV;
+ }
+#else
+ return -ENODEV;
+#endif
+ UNUSED(ret);
+ return OK;
+}
+
+#endif /* CONFIG_IMXRT_FLEXCAN */
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_boot.c b/boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_boot.c
new file mode 100644
index 0000000..dff0685
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_boot.c
@@ -0,0 +1,58 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_boot.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include "imxrt_flexspi_nor_boot.h"
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+__attribute__((section(".boot_hdr.ivt")))
+ const struct ivt_s g_image_vector_table =
+ {
+ IVT_HEADER, /* IVT Header */
+ IMAGE_ENTRY_ADDRESS, /* Image Entry Function */
+ IVT_RSVD, /* Reserved = 0 */
+ (uint32_t) DCD_ADDRESS, /* Address where DCD information is
+ * stored */
+ (uint32_t) BOOT_DATA_ADDRESS, /* Address where BOOT Data Structure
+ * is stored */
+ (uint32_t) IMAG_VECTOR_TABLE, /* Pointer to IVT Self (absolute
+ * address */
+ (uint32_t) CSF_ADDRESS, /* Address where CSF file is stored */
+ IVT_RSVD /* Reserved = 0 */
+ };
+
+__attribute__((section(".boot_hdr.boot_data")))
+ const struct boot_data_s g_boot_data =
+ {
+ IMAGE_DEST, /* boot start location */
+ (IMAGE_DEST_END - IMAGE_DEST), /* size */
+ PLUGIN_FLAG, /* Plugin flag */
+ 0xffffffff /* empty - extra data word */
+ };
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
\ No newline at end of file
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_boot.h b/boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_boot.h
new file mode 100644
index 0000000..78fe4e3
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_boot.h
@@ -0,0 +1,157 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_boot.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __BOARDS_ARM_IMXRT_TEENSY_4X_SRC_IMXRT_FLEXSPI_NOR_BOOT_H
+# define __BOARDS_ARM_IMXRT_TEENSY_4X_SRC_IMXRT_FLEXSPI_NOR_BOOT_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+# include <stdint.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* IVT Data */
+
+# define IVT_MAJOR_VERSION 0x4
+# define IVT_MAJOR_VERSION_SHIFT 0x4
+# define IVT_MAJOR_VERSION_MASK 0xf
+# define IVT_MINOR_VERSION 0x1
+# define IVT_MINOR_VERSION_SHIFT 0x0
+# define IVT_MINOR_VERSION_MASK 0xf
+
+# define IVT_VERSION(major, minor) \
+ ((((major) & IVT_MAJOR_VERSION_MASK) << IVT_MAJOR_VERSION_SHIFT) | \
+ (((minor) & IVT_MINOR_VERSION_MASK) << IVT_MINOR_VERSION_SHIFT))
+
+# define IVT_TAG_HEADER (0xd1) /* Image Vector Table */
+# define IVT_SIZE 0x2000
+# define IVT_PAR IVT_VERSION(IVT_MAJOR_VERSION, IVT_MINOR_VERSION)
+
+# define IVT_HEADER (IVT_TAG_HEADER | (IVT_SIZE << 8) | (IVT_PAR << 24))
+# define IVT_RSVD (uint32_t)(0x00000000)
+
+/* DCD Data */
+
+# define DCD_TAG_HEADER (0xd2)
+# define DCD_TAG_HEADER_SHIFT (24)
+# define DCD_VERSION (0x41)
+# define DCD_ARRAY_SIZE 1
+
+# define FLASH_BASE 0x60000000
+# define FLASH_END 0x7f7fffff
+
+/* This needs to take into account the memory configuration at
+ * boot bootloader
+ */
+
+# define ROM_BOOTLOADER_OCRAM_RES 0x8000
+# define OCRAM_BASE (0x20200000 + ROM_BOOTLOADER_OCRAM_RES)
+# define OCRAM_END (OCRAM_BASE + (512 * 1024) + (256 * 1024) \
+ - ROM_BOOTLOADER_OCRAM_RES)
+
+# define SCLK 1
+# if defined(CONFIG_BOOT_RUNFROMFLASH)
+# define IMAGE_DEST FLASH_BASE
+# define IMAGE_DEST_END FLASH_END
+# define IMAGE_DEST_OFFSET 0
+# else
+# define IMAGE_DEST OCRAM_BASE
+# define IMAGE_DEST_END OCRAM_END
+# define IMAGE_DEST_OFFSET IVT_SIZE
+# endif
+
+# define LOCATE_IN_DEST(x) (((uint32_t)(x)) - FLASH_BASE + IMAGE_DEST)
+# define LOCATE_IN_SRC(x) (((uint32_t)(x)) - IMAGE_DEST + FLASH_BASE)
+
+# define DCD_ADDRESS 0
+# define BOOT_DATA_ADDRESS LOCATE_IN_DEST(&g_boot_data)
+# define CSF_ADDRESS 0
+# define PLUGIN_FLAG (uint32_t)0
+
+/* Located in Destination Memory */
+
+# define IMAGE_ENTRY_ADDRESS ((uint32_t)&_vectors)
+# define IMAG_VECTOR_TABLE LOCATE_IN_DEST(&g_image_vector_table)
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/* IVT Data */
+
+struct ivt_s
+ {
+ /* Header with tag #HAB_TAG_IVT, length and HAB version fields */
+
+ uint32_t hdr;
+
+ /* Absolute address of the first instr. to execute from the image */
+
+ uint32_t entry;
+
+ /* Reserved in this version of HAB: should be NULL. */
+
+ uint32_t reserved1;
+
+ /* Absolute address of the image DCD: may be NULL. */
+
+ uint32_t dcd;
+
+ /* Absolute address of the Boot Data: may be NULL */
+
+ uint32_t boot_data;
+
+ /* Absolute address of the IVT. */
+
+ uint32_t self;
+
+ /* Absolute address of the image CSF. */
+
+ uint32_t csf;
+
+ /* Reserved in this version of HAB: should be zero. */
+
+ uint32_t reserved2;
+ };
+
+/* Boot Data */
+
+struct boot_data_s
+ {
+ uint32_t start; /* boot start location */
+ uint32_t size; /* size */
+ uint32_t plugin; /* plugin flag - 1 if downloaded application is
+ * plugin */
+ uint32_t placeholder; /* placeholder to make even 0x10 size */
+ };
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+extern const struct boot_data_s g_boot_data;
+extern const uint8_t g_dcd_data[];
+extern const uint32_t _vectors[];
+
+#endif /* __BOARDS_ARM_IMXRT_TEENSY_4_SRC_IMXRT_FLEXSPI_NOR_BOOT_H */
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_flash.c b/boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_flash.c
new file mode 100644
index 0000000..c153676
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_flash.c
@@ -0,0 +1,137 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_flash.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include "imxrt_flexspi_nor_flash.h"
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#if defined (CONFIG_TEENSY4_QSPI_FLASH)
+__attribute__((section(".boot_hdr.conf")))
+const struct flexspi_nor_config_s g_flash_config =
+{
+ .mem_config =
+ {
+ .tag = FLEXSPI_CFG_BLK_TAG,
+ .version = FLEXSPI_CFG_BLK_VERSION,
+ .read_sample_clksrc = FLASH_READ_SAMPLE_CLK_LOOPBACK_FROM_SCKPAD,
+ .cs_hold_time = 3u,
+ .cs_setup_time = 3u,
+ .column_address_width = 0u,
+ .device_type = FLEXSPI_DEVICE_TYPE_SERIAL_NOR,
+ .sflash_pad_type = SERIAL_FLASH_4PADS,
+ .serial_clk_freq = FLEXSPI_SERIAL_CLKFREQ_60MHz,
+ #ifdef CONFIG_TEENSY_40
+ .sflash_a1size = 2u * 1024u * 1024u,
+ #endif
+ #ifdef CONFIG_TEENSY_41
+ .sflash_a1size = 8u * 1024u * 1024u,
+ #endif
+ .data_valid_time =
+ {
+ 0u, 0u
+ },
+ .lookup_table =
+ {
+ /* LUTs */
+
+ FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xeb,
+ RADDR_SDR, FLEXSPI_4PAD, 0x18),
+ FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06,
+ READ_SDR, FLEXSPI_4PAD, 0x04),
+ 0x00000000,
+ 0x00000000,
+
+ FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05,
+ READ_SDR, FLEXSPI_1PAD, 0x04),
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+
+ FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, STOP, FLEXSPI_1PAD, 0x0),
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+
+ FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20,
+ RADDR_SDR, FLEXSPI_1PAD, 0x18),
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+
+ FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xd8,
+ RADDR_SDR, FLEXSPI_1PAD, 0x18),
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+
+ FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02,
+ RADDR_SDR, FLEXSPI_1PAD, 0x18),
+ FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04,
+ STOP, FLEXSPI_1PAD, 0x0),
+ 0x00000000,
+ 0x00000000,
+
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+
+ FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0x0),
+ },
+ },
+
+ .page_size = 256u,
+ .sector_size = 4u * 1024u,
+ .blocksize = 64u * 1024u,
+ .is_uniform_blocksize = false,
+};
+#else
+# error Boot Flash type not chosen!
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
\ No newline at end of file
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_flash.h b/boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_flash.h
new file mode 100644
index 0000000..e580db0
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_flash.h
@@ -0,0 +1,364 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_flexspi_nor_flash.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+#ifndef __BOARDS_ARM_IMXRT_TEENSY_4X_SRC_IMXRT_FLEXSPI_NOR_FLASH_H
+# define __BOARDS_ARM_IMXRT_TEENSY_4X_SRC_IMXRT_FLEXSPI_NOR_FLASH_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+# include <stdint.h>
+# include <stdbool.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* FLEXSPI memory config block related definitions */
+
+# define FLEXSPI_CFG_BLK_TAG (0x42464346ul)
+# define FLEXSPI_CFG_BLK_VERSION (0x56010100ul)
+# define FLEXSPI_CFG_BLK_SIZE (512)
+
+/* FLEXSPI Feature related definitions */
+
+# define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
+
+/* Lookup table related definitions */
+
+# define CMD_INDEX_READ 0
+# define CMD_INDEX_READSTATUS 1
+# define CMD_INDEX_WRITEENABLE 2
+# define CMD_INDEX_WRITE 4
+
+# define CMD_LUT_SEQ_IDX_READ 0
+# define CMD_LUT_SEQ_IDX_READSTATUS 1
+# define CMD_LUT_SEQ_IDX_WRITEENABLE 3
+# define CMD_LUT_SEQ_IDX_WRITE 9
+
+# define CMD_SDR 0x01
+# define CMD_DDR 0x21
+# define RADDR_SDR 0x02
+# define RADDR_DDR 0x22
+# define CADDR_SDR 0x03
+# define CADDR_DDR 0x23
+# define MODE1_SDR 0x04
+# define MODE1_DDR 0x24
+# define MODE2_SDR 0x05
+# define MODE2_DDR 0x25
+# define MODE4_SDR 0x06
+# define MODE4_DDR 0x26
+# define MODE8_SDR 0x07
+# define MODE8_DDR 0x27
+# define WRITE_SDR 0x08
+# define WRITE_DDR 0x28
+# define READ_SDR 0x09
+# define READ_DDR 0x29
+# define LEARN_SDR 0x0a
+# define LEARN_DDR 0x2a
+# define DATSZ_SDR 0x0b
+# define DATSZ_DDR 0x2b
+# define DUMMY_SDR 0x0c
+# define DUMMY_DDR 0x2c
+# define DUMMY_RWDS_SDR 0x0d
+# define DUMMY_RWDS_DDR 0x2d
+# define JMP_ON_CS 0x1f
+# define STOP 0
+
+# define FLEXSPI_1PAD 0
+# define FLEXSPI_2PAD 1
+# define FLEXSPI_4PAD 2
+# define FLEXSPI_8PAD 3
+
+# define FLEXSPI_LUT_OPERAND0_MASK (0xffu)
+# define FLEXSPI_LUT_OPERAND0_SHIFT (0U)
+# define FLEXSPI_LUT_OPERAND0(x) (((uint32_t) \
+ (((uint32_t)(x)) << FLEXSPI_LUT_OPERAND0_SHIFT)) & \
+ FLEXSPI_LUT_OPERAND0_MASK)
+# define FLEXSPI_LUT_NUM_PADS0_MASK (0x300u)
+# define FLEXSPI_LUT_NUM_PADS0_SHIFT (8u)
+# define FLEXSPI_LUT_NUM_PADS0(x) (((uint32_t) \
+ (((uint32_t)(x)) << FLEXSPI_LUT_NUM_PADS0_SHIFT)) & \
+ FLEXSPI_LUT_NUM_PADS0_MASK)
+# define FLEXSPI_LUT_OPCODE0_MASK (0xfc00u)
+# define FLEXSPI_LUT_OPCODE0_SHIFT (10u)
+# define FLEXSPI_LUT_OPCODE0(x) (((uint32_t) \
+ (((uint32_t)(x)) << FLEXSPI_LUT_OPCODE0_SHIFT)) & \
+ FLEXSPI_LUT_OPCODE0_MASK)
+# define FLEXSPI_LUT_OPERAND1_MASK (0xff0000u)
+# define FLEXSPI_LUT_OPERAND1_SHIFT (16U)
+# define FLEXSPI_LUT_OPERAND1(x) (((uint32_t) \
+ (((uint32_t)(x)) << FLEXSPI_LUT_OPERAND1_SHIFT)) & \
+ FLEXSPI_LUT_OPERAND1_MASK)
+# define FLEXSPI_LUT_NUM_PADS1_MASK (0x3000000u)
+# define FLEXSPI_LUT_NUM_PADS1_SHIFT (24u)
+# define FLEXSPI_LUT_NUM_PADS1(x) (((uint32_t) \
+ (((uint32_t)(x)) << FLEXSPI_LUT_NUM_PADS1_SHIFT)) & \
+ FLEXSPI_LUT_NUM_PADS1_MASK)
+# define FLEXSPI_LUT_OPCODE1_MASK (0xfc000000u)
+# define FLEXSPI_LUT_OPCODE1_SHIFT (26u)
+# define FLEXSPI_LUT_OPCODE1(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPCODE1_SHIFT)) & \
+ FLEXSPI_LUT_OPCODE1_MASK)
+
+# define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
+ (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | \
+ FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
+ FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
+
+/* */
+
+# define NOR_CMD_INDEX_READ CMD_INDEX_READ
+# define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS
+# define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE
+# define NOR_CMD_INDEX_ERASESECTOR 3
+# define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE
+# define NOR_CMD_INDEX_CHIPERASE 5
+# define NOR_CMD_INDEX_DUMMY 6
+# define NOR_CMD_INDEX_ERASEBLOCK 7
+
+/* READ LUT sequence id in lookupTable stored in config block */
+
+# define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ
+
+/* Read Status LUT sequence id in lookupTable stored in config block */
+
+# define NOR_CMD_LUT_SEQ_IDX_READSTATUS CMD_LUT_SEQ_IDX_READSTATUS
+
+/* 2 Read status DPI/QPI/OPI sequence id in LUT stored in config block */
+
+# define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 2
+
+/* 3 Write Enable sequence id in lookupTable stored in config block */
+
+# define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE CMD_LUT_SEQ_IDX_WRITEENABLE
+
+/* 4 Write Enable DPI/QPI/OPI sequence id in LUT stored in config block */
+
+# define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI 4
+
+/* 5 Erase Sector sequence id in lookupTable stored in config block */
+
+# define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5
+
+/* 8 Erase Block sequence id in lookupTable stored in config block */
+
+# define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8
+
+/* 9 Program sequence id in lookupTable stored in config block */
+
+# define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM CMD_LUT_SEQ_IDX_WRITE
+
+/* 11 Chip Erase sequence in lookupTable id stored in config block */
+
+# define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11
+
+/* 13 Read SFDP sequence in lookupTable id stored in config block */
+
+# define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13
+
+/* 14 Restore 0-4-4/0-8-8 mode sequence id in LUT stored in config block */
+
+# define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD 14
+
+/* 15 Exit 0-4-4/0-8-8 mode sequence id in LUT stored in config blobk */
+
+# define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD 15
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/* Definitions for FlexSPI Serial Clock Frequency */
+
+enum flexspi_serial_clkfreq_e
+ {
+ FLEXSPI_SERIAL_CLKFREQ_30MHz = 1,
+ FLEXSPI_SERIAL_CLKFREQ_50MHz = 2,
+ FLEXSPI_SERIAL_CLKFREQ_60MHz = 3,
+ FLEXSPI_SERIAL_CLKFREQ_75MHz = 4,
+ FLEXSPI_SERIAL_CLKFREQ_80MHz = 5,
+ FLEXSPI_SERIAL_CLKFREQ_100MHz = 6,
+ FLEXSPI_SERIAL_CLKFREQ_133MHz = 7,
+ FLEXSPI_SERIAL_CLKFREQ_166MHz = 8,
+ FLEXSPI_SERIAL_CLKFREQ_200MHz = 9,
+ };
+
+/* FlexSPI clock configuration type */
+
+enum flexspi_serial_clockmode_e
+ {
+ FLEXSPI_CLKMODE_SDR,
+ FLEXSPI_CLKMODE_DDR,
+ };
+
+/* FlexSPI Read Sample Clock Source definition */
+
+enum flash_read_sample_clk_e
+ {
+ FLASH_READ_SAMPLE_CLK_LOOPBACK_INTERNELLY = 0,
+ FLASH_READ_SAMPLE_CLK_LOOPBACK_FROM_DQSPAD = 1,
+ FLASH_READ_SAMPLE_CLK_LOOPBACK_FROM_SCKPAD = 2,
+ FLASH_READ_SAMPLE_CLK_EXTERNALINPUT_FROM_DQSPAD = 3,
+ };
+
+/* Misc feature bit definitions */
+
+enum flash_misc_feature_e
+ {
+ FLEXSPIMISC_OFFSET_DIFFCLKEN = 0, /* Bit for Differential clock enable */
+ FLEXSPIMISC_OFFSET_CK2EN = 1, /* Bit for CK2 enable */
+ FLEXSPIMISC_OFFSET_PARALLELEN = 2, /* Bit for Parallel mode enable */
+
+ FLEXSPIMISC_OFFSET_WORD_ADDRESSABLE_EN = 3, /* Bit for Word Addressable
+ * enable */
+ FLEXSPIMISC_OFFSET_SAFECONFIG_FREQ_EN = 4, /* Bit for Safe Configuration
+ * Frequency enable */
+
+ FLEXSPIMISC_OFFSET_PAD_SETTING_OVERRIDE_EN = 5, /* Bit for Pad setting
+ * override enable */
+
+ FLEXSPIMISC_OFFSET_DDR_MODE_EN = 6, /* Bit for DDR clock confiuration
+ * indication. */
+ };
+
+/* Flash Type Definition */
+
+enum flash_flash_type_e
+ {
+ FLEXSPI_DEVICE_TYPE_SERIAL_NOR = 1, /* Flash devices are Serial NOR */
+ FLEXSPI_DEVICE_TYPE_SERIAL_NAND = 2, /* Flash devices are Serial
+ * NAND */
+ FLEXSPI_DEVICE_TYPE_SERIAL_RAM = 3, /* Flash devices are Serial
+ * RAM/HyperFLASH */
+
+ FLEXSPI_DEVICE_TYPE_MCP_NOR_NAND = 0x12, /* Flash device is MCP device,
+ * A1 is Serial NOR, A2 is
+ * Serial NAND */
+ FLEXSPI_DEVICE_TYPE_MCP_NOR_RAM = 0x13, /* Flash device is MCP device,
+ * A1 is Serial NOR, A2 is
+ * Serial RAMs */
+ };
+
+/* Flash Pad Definitions */
+
+enum flash_flash_pad_e
+ {
+ SERIAL_FLASH_1PAD = 1,
+ SERIAL_FLASH_2PADS = 2,
+ SERIAL_FLASH_4PADS = 4,
+ SERIAL_FLASH_8PADS = 8,
+ };
+
+/* Flash Configuration Command Type */
+
+enum flash_config_cmd_e
+ {
+ DEVICE_CONFIG_CMD_TYPE_GENERIC, /* Generic command, for example:
+ * configure dummy cycles, drive
+ * strength, etc */
+ DEVICE_CONFIG_CMD_TYPE_QUADENABLE, /* Quad Enable command */
+ DEVICE_CONFIG_CMD_TYPE_SPI2XPI, /* Switch from SPI to DPI/QPI/OPI mode */
+ DEVICE_CONFIG_CMD_TYPE_XPI2SPI, /* Switch from DPI/QPI/OPI to SPI mode */
+ DEVICE_CONFIG_CMD_TYPE_SPI2NO_CMD, /* Switch to 0-4-4/0-8-8 mode */
+ DEVICE_CONFIG_CMD_TYPE_RESET, /* Reset device command */
+ };
+
+/* FlexSPI LUT Sequence structure */
+
+struct flexspi_lut_seq_s
+ {
+ uint8_t seq_num; /* Sequence Number, valid number: 1-16 */
+ uint8_t seq_id; /* Sequence Index, valid number: 0-15 */
+ uint16_t reserved;
+ };
+
+/* FlexSPI Memory Configuration Block */
+
+struct flexspi_mem_config_s
+ {
+ uint32_t tag;
+ uint32_t version;
+ uint32_t reserved0;
+ uint8_t read_sample_clksrc;
+ uint8_t cs_hold_time;
+ uint8_t cs_setup_time;
+ uint8_t column_address_width; /* [0x00f-0x00f] Column Address with,
+ * for HyperBus protocol, it is fixed
+ * to 3, For Serial NAND, need to refer
+ * to datasheet */
+ uint8_t device_mode_cfg_enable;
+ uint8_t device_mode_type;
+ uint16_t wait_time_cfg_commands;
+ struct flexspi_lut_seq_s device_mode_seq;
+ uint32_t device_mode_arg;
+ uint8_t config_cmd_enable;
+ uint8_t config_mode_type[3];
+ struct flexspi_lut_seq_s config_cmd_seqs[3];
+ uint32_t reserved1;
+ uint32_t config_cmd_args[3];
+ uint32_t reserved2;
+ uint32_t controller_misc_option;
+ uint8_t device_type;
+ uint8_t sflash_pad_type;
+ uint8_t serial_clk_freq;
+ uint8_t lut_custom_seq_enable;
+ uint32_t reserved3[2];
+ uint32_t sflash_a1size;
+ uint32_t sflash_a2size;
+ uint32_t sflash_b1size;
+ uint32_t sflash_b2size;
+ uint32_t cspad_setting_override;
+ uint32_t sclkpad_setting_override;
+ uint32_t datapad_setting_override;
+ uint32_t dqspad_setting_override;
+ uint32_t timeout_in_ms;
+ uint32_t command_interval;
+ uint16_t data_valid_time[2];
+ uint16_t busy_offset;
+ uint16_t busybit_polarity;
+ uint32_t lookup_table[64];
+ struct flexspi_lut_seq_s lut_customseq[12];
+ uint32_t reserved4[4];
+ };
+
+/* Serial NOR configuration block */
+
+struct flexspi_nor_config_s
+ {
+ struct flexspi_mem_config_s mem_config; /* Common memory configuration
+ * info via FlexSPI */
+
+ uint32_t page_size; /* Page size of Serial NOR */
+ uint32_t sector_size; /* Sector size of Serial NOR */
+ uint8_t ipcmd_serial_clkfreq; /* Clock frequency for IP command */
+ uint8_t is_uniform_blocksize; /* Sector/Block size is the same */
+ uint8_t reserved0[2]; /* Reserved for future use */
+ uint8_t serial_nor_type; /* Serial NOR Flash type: 0/1/2/3 */
+ uint8_t need_exit_nocmdmode; /* Need to exit NoCmd mode before other
+ * IP command */
+ uint8_t halfclk_for_nonreadcmd; /* Half the Serial Clock for non-read
+ * command: true/false */
+ uint8_t need_restore_nocmdmode; /* Need to Restore NoCmd mode after IP
+ * command execution */
+ uint32_t blocksize; /* Block size */
+ uint32_t reserve2[11]; /* Reserved for future use */
+ };
+
+#endif /* __BOARDS_ARM_IMXRT_TEENSY_4_SRC_IMXRT_FLEXSPI_NOR_FLASH_H */
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_i2c.c b/boards/arm/imxrt/teensy-4.x/src/imxrt_i2c.c
new file mode 100644
index 0000000..6b4fff0
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_i2c.c
@@ -0,0 +1,114 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_i2c.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdbool.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <nuttx/i2c/i2c_master.h>
+#include <nuttx/sensors/bmp280.h>
+#include <imxrt_lpi2c.h>
+
+#include "teensy-4.h"
+
+#ifdef CONFIG_IMXRT_LPI2C
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: imxrt_i2c_register
+ *
+ * Description:
+ * Register I2C driver
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_I2C_DRIVER
+static void imxrt_i2c_register(int bus)
+{
+ FAR struct i2c_master_s *i2c;
+ int ret;
+
+ i2c = imxrt_i2cbus_initialize(bus);
+ if (i2c == NULL)
+ {
+ serr("ERROR: Failed to get I2C%d interface\n", bus);
+ }
+ else
+ {
+ ret = i2c_register(i2c, bus);
+ if (ret < 0)
+ {
+ serr("ERROR: Failed to register I2C%d driver: %d\n", bus, ret);
+ imxrt_i2cbus_uninitialize(i2c);
+ }
+ }
+
+ #ifdef SENSORS_BMP280
+ if (CONFIG_BMP280_LPI2C == bus)
+ {
+ /* Register the BMP280 driver */
+
+ ret = bmp280_register(BMP280_DRIVER_PATH, i2c);
+ if (ret < 0)
+ {
+ serr("ERROR: Failed to register BMP280\n");
+ }
+ }
+ #endif
+}
+#endif
+
+/****************************************************************************
+ * Name: imxrt_i2c_setup
+ *
+ * Description:
+ * Choose which I2C driver should be initialize
+ *
+ ****************************************************************************/
+
+void imxrt_i2c_setup()
+{
+#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C1)
+ imxrt_i2c_register(1);
+#endif
+
+#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C2)
+ serr("ERROR: LPI2C2 is not on Teensy-4.x board\n");
+#endif
+
+#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C3)
+ imxrt_i2c_register(3);
+#endif
+
+#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C4)
+ imxrt_i2c_register(4);
+#endif
+}
+
+#endif /* CONFIG_IMXRT_LPI2C */
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_spi.c b/boards/arm/imxrt/teensy-4.x/src/imxrt_spi.c
new file mode 100644
index 0000000..ed02f5f
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_spi.c
@@ -0,0 +1,212 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_spi.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <nuttx/spi/spi.h>
+#include <arch/board/board.h>
+
+#include "arm_arch.h"
+
+#include "imxrt_config.h"
+#include "imxrt_lpspi.h"
+#include "imxrt_gpio.h"
+#include "teensy-4.h"
+
+#if defined(CONFIG_IMXRT_LPSPI1) || defined(CONFIG_IMXRT_LPSPI2) || \
+ defined(CONFIG_IMXRT_LPSPI3) || defined(CONFIG_IMXRT_LPSPI4)
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: imxrt_spidev_initialize
+ *
+ * Description:
+ * Called to configure SPI chip select GPIO pins for the imxrt1060-evk
+ * board.
+ *
+ ****************************************************************************/
+
+void weak_function imxrt_spidev_initialize(void)
+{
+#ifdef CONFIG_IMXRT_LPSPI3
+ imxrt_config_gpio(GPIO_LPSPI3_CS); /* LPSPI3 chip select */
+#endif
+#ifdef CONFIG_IMXRT_LPSPI4
+ imxrt_config_gpio(GPIO_LPSPI4_CS); /* LPSPI4 chip select */
+#endif
+}
+
+/****************************************************************************
+ * Name: imxrt_lpspi1/2/3select and imxrt_lpspi1/2/3status
+ *
+ * Description:
+ * The external functions, imxrt_lpspi1/2/3select and imxrt_lpspi1/2/3status
+ * must be provided by board-specific logic.
+ * They are implementations of the select and status methods of the SPI
+ * interface defined by struct spi_ops_s (see include/nuttx/spi/spi.h).
+ * All other methods (including imxrt_lpspibus_initialize())
+ * are provided by common STM32 logic.
+ * To use this common SPI logic on your board:
+ *
+ * 1. Provide logic in imxrt_boardinitialize() to configure SPI chip select
+ * pins.
+ * 2. Provide imxrt_lpspi1/2/3select() and imxrt_lpspi1/2/3status()
+ * functions in your board-specific logic.
+ * These functions will perform chip selection and status operations
+ * using GPIOs in the way your board is configured.
+ * 3. Add a calls to imxrt_lpspibus_initialize() in your low level
+ * application initialization logic
+ * 4. The handle returned by imxrt_lpspibus_initialize() may then be used
+ * to bind the SPI driver to higher level logic (e.g., calling
+ * mmcsd_spislotinitialize(), for example, will bind the SPI driver to
+ * the SPI MMC/SD driver).
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_IMXRT_LPSPI1
+void imxrt_lpspi1select(FAR struct spi_dev_s *dev, uint32_t devid,
+ bool selected)
+{
+ spiinfo("devid: %d CS: %s\n", (int)devid,
+ selected ? "assert" : "de-assert");
+
+ imxrt_gpio_write(GPIO_LPSPI1_CS, !selected);
+}
+
+uint8_t imxrt_lpspi1status(FAR struct spi_dev_s *dev, uint32_t devid)
+{
+ return 0;
+}
+#endif
+
+#ifdef CONFIG_IMXRT_LPSPI2
+void imxrt_lpspi2select(FAR struct spi_dev_s *dev, uint32_t devid,
+ bool selected)
+{
+ spiinfo("devid: %d CS: %s\n", (int)devid,
+ selected ? "assert" : "de-assert");
+
+ imxrt_gpio_write(GPIO_LPSPI2_CS, !selected);
+}
+
+uint8_t imxrt_lpspi2status(FAR struct spi_dev_s *dev, uint32_t devid)
+{
+ return 0;
+}
+#endif
+
+#ifdef CONFIG_IMXRT_LPSPI3
+void imxrt_lpspi3select(FAR struct spi_dev_s *dev, uint32_t devid,
+ bool selected)
+{
+ spiinfo("devid: %d CS: %s\n", (int)devid,
+ selected ? "assert" : "de-assert");
+
+ imxrt_gpio_write(GPIO_LPSPI3_CS, !selected);
+}
+
+uint8_t imxrt_lpspi3status(FAR struct spi_dev_s *dev, uint32_t devid)
+{
+ return 0;
+}
+#endif
+
+#ifdef CONFIG_IMXRT_LPSPI4
+void imxrt_lpspi4select(FAR struct spi_dev_s *dev, uint32_t devid,
+ bool selected)
+{
+ spiinfo("devid: %d CS: %s\n", (int)devid,
+ selected ? "assert" : "de-assert");
+
+ imxrt_gpio_write(GPIO_LPSPI4_CS, !selected);
+}
+
+uint8_t imxrt_lpspi4status(FAR struct spi_dev_s *dev, uint32_t devid)
+{
+ return 0;
+}
+#endif
+
+/****************************************************************************
+ * Name: imxrt_lpspi1cmddata
+ *
+ * Description:
+ * Set or clear the SH1101A A0 or SD1306 D/C n bit to select data (true)
+ * or command (false). This function must be provided by platform-specific
+ * logic. This is an implementation of the cmddata method of the SPI
+ * interface defined by struct spi_ops_s (see include/nuttx/spi/spi.h).
+ *
+ * Input Parameters:
+ *
+ * spi - SPI device that controls the bus the device that requires the CMD/
+ * DATA selection.
+ * devid - If there are multiple devices on the bus, this selects which one
+ * to select cmd or data. NOTE: This design restricts, for example,
+ * one one SPI display per SPI bus.
+ * cmd - true: select command; false: select data
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_SPI_CMDDATA
+#ifdef CONFIG_IMXRT_LPSPI1
+int imxrt_lpspi1cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
+{
+ return -ENODEV;
+}
+#endif
+
+#ifdef CONFIG_IMXRT_LPSPI2
+int imxrt_lpspi2cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
+{
+ return -ENODEV;
+}
+#endif
+
+#ifdef CONFIG_IMXRT_LPSPI3
+int imxrt_lpspi3cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
+{
+ return -ENODEV;
+}
+#endif
+
+#ifdef CONFIG_IMXRT_LPSPI4
+int imxrt_lpspi4cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
+{
+ return -ENODEV;
+}
+#endif
+#endif /* CONFIG_SPI_CMDDATA */
+
+#endif /* CONFIG_IMXRT_LPSPI1 || CONFIG_IMXRT_LPSPI2 */
diff --git a/boards/arm/imxrt/teensy-4.x/src/imxrt_userleds.c b/boards/arm/imxrt/teensy-4.x/src/imxrt_userleds.c
new file mode 100644
index 0000000..19ccde4
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/imxrt_userleds.c
@@ -0,0 +1,82 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/imxrt_userleds.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* There are two LED status indicators located on the EVK Board. The
+ * functions of these LEDs include:
+ *
+ * - RED LED (loading status)
+ * - dim: ready
+ * - bright: writing
+ * - blink: no USB
+ * - USER LED (D8)
+ *
+ * Only a single LED, D8, is under software control.
+ */
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include "imxrt_gpio.h"
+#include "imxrt_iomuxc.h"
+#include <arch/board/board.h>
+#include "teensy-4.h"
+
+#ifndef CONFIG_ARCH_LEDS
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_userled_initialize
+ ****************************************************************************/
+
+uint32_t board_userled_initialize(void)
+{
+ /* Configure LED GPIO for output */
+
+ imxrt_config_gpio(GPIO_LED);
+ return BOARD_NLEDS;
+}
+
+/****************************************************************************
+ * Name: board_userled
+ ****************************************************************************/
+
+void board_userled(int led, bool ledon)
+{
+ imxrt_gpio_write(GPIO_LED, !ledon); /* Low illuminates */
+}
+
+/****************************************************************************
+ * Name: board_userled_all
+ ****************************************************************************/
+
+void board_userled_all(uint32_t ledset)
+{
+ /* Low illuminates */
+
+ imxrt_gpio_write(GPIO_LED, (ledset & BOARD_USERLED_BIT) == 0);
+}
+
+#endif /* !CONFIG_ARCH_LEDS */
diff --git a/boards/arm/imxrt/teensy-4.x/src/teensy-4.h b/boards/arm/imxrt/teensy-4.x/src/teensy-4.h
new file mode 100644
index 0000000..178784d
--- /dev/null
+++ b/boards/arm/imxrt/teensy-4.x/src/teensy-4.h
@@ -0,0 +1,195 @@
+/****************************************************************************
+ * boards/arm/imxrt/teensy-4.x/src/teensy-4.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __BOARDS_ARM_IMXRT_TEENSY_4X_SRC_TEENSY_4_H
+# define __BOARDS_ARM_IMXRT_TEENSY_4X_SRC_TEENSY_4_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+# include <nuttx/config.h>
+
+# include <stdint.h>
+# include <stdbool.h>
+
+# include <arch/irq.h>
+# include <nuttx/irq.h>
+
+# include "imxrt_gpio.h"
+# include "imxrt_iomuxc.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* i.MX RT 1060 GPIO Pin Definitions ****************************************/
+
+/* LEDs */
+
+/* There are two LED status indicators located on the Teensy 4.x board.
+ * The functions of these LEDs include:
+ *
+ * - RED LED (loading status)
+ * - dim: ready
+ * - bright: writing
+ * - blink: no USB
+ * - USER LED(D8)
+ *
+ * Only a single LED, D8, is under software control.
+ */
+
+# define GPIO_LED (GPIO_OUTPUT | IOMUX_LED_DEFAULT | \
+ GPIO_OUTPUT_ZERO | GPIO_PORT2 | GPIO_PIN3) /* BO_03 */
+
+# define LED_DRIVER_PATH "/dev/userleds"
+
+# define BMP280_DRIVER_PATH "/dev/press0"
+
+/* LPSPI3 CS: GPIO_AD_B1_12 */
+
+# define IOMUX_LPSPI3_CS (IOMUX_SLEW_FAST | IOMUX_DRIVE_50OHM | \
+ IOMUX_SPEED_MEDIUM | IOMUX_PULL_UP_100K | \
+ _IOMUX_PULL_ENABLE)
+# define GPIO_LPSPI3_CS (GPIO_OUTPUT | GPIO_OUTPUT_ONE | \
+ GPIO_PORT1 | GPIO_PIN28 | IOMUX_LPSPI3_CS)
+
+/* LPSPI4 CS: GPIO_B0_00 */
+
+# define IOMUX_LPSPI4_CS (IOMUX_SLEW_FAST | IOMUX_DRIVE_50OHM | \
+ IOMUX_SPEED_MEDIUM | IOMUX_PULL_UP_100K | \
+ _IOMUX_PULL_ENABLE)
+# define GPIO_LPSPI4_CS (GPIO_OUTPUT | GPIO_OUTPUT_ONE | \
+ GPIO_PORT2 | GPIO_PIN0 | IOMUX_LPSPI4_CS)
+
+/* USB OTG ID Pin: GPIO_AD_B1_02 */
+
+#define GPIO_USBOTG_ID (GPIO_USB_OTG1_ID_1 | IOMUX_USBOTG_ID_DEFAULT) /* AD_B1_02 */
+
+/* Ethernet */
+
+/* Ethernet Interrupt: GPIO_B0_15
+ *
+ * This pin has a week pull-up within the PHY, is open-drain, and requires
+ * an external 1k ohm pull-up resistor (present on the EVK). A falling
+ * edge then indicates a change in state of the PHY.
+ */
+
+#define GPIO_ENET_INT (IOMUX_ENET_INT_DEFAULT | \
+ GPIO_PORT2 | GPIO_PIN15) /* B0_15 */
+#define GPIO_ENET_IRQ IMXRT_IRQ_GPIO2_15
+
+/* Ethernet Reset: GPIO_B0_14
+ *
+ * The #RST uses inverted logic. The initial value of zero will put the
+ * PHY into the reset state.
+ */
+
+#define GPIO_ENET_RST (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | \
+ GPIO_PORT2 | GPIO_PIN14 | IOMUX_ENET_RST_DEFAULT) /* B0_14 */
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public data
+ ****************************************************************************/
+
+# ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Name: imxrt_bringup
+ *
+ * Description:
+ * Bring up board features
+ *
+ ****************************************************************************/
+
+# if defined(CONFIG_LIB_BOARDCTL) || defined(CONFIG_BOARD_LATE_INITIALIZE)
+int imxrt_bringup(void);
+# endif
+
+/****************************************************************************
+ * Name: imxrt_spidev_initialize
+ *
+ * Description:
+ * Called to configure SPI chip select GPIO pins for the i.MXRT1050 EVK.
+ *
+ ****************************************************************************/
+
+void imxrt_spidev_initialize(void);
+
+/****************************************************************************
+ * Name: imxrt_can_setup
+ *
+ * Description:
+ * Initialize CAN and register the CAN device
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_IMXRT_FLEXCAN
+int imxrt_can_setup(void);
+#endif
+
+/****************************************************************************
+ * Name: imxrt_adc_initialize
+ *
+ * Description:
+ * Initialize ADC drivers
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_IMXRT_ADC
+int imxrt_adc_initialize(void);
+#endif
+
+/****************************************************************************
+ * Name: imxrt_i2c_setup
+ *
+ * Description:
+ * Choose which I2C driver should be initialize
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_IMXRT_LPI2C
+void imxrt_i2c_setup(void);
+#endif
+
+/****************************************************************************
+ * Name: imxrt_autoled_initialize
+ *
+ * Description:
+ * Initialize NuttX-controlled LED logic
+ *
+ * Input Parameters:
+ * None
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_ARCH_LEDS
+void imxrt_autoled_initialize(void);
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __BOARDS_ARM_TEENSY_4X_SRC_TEENSY_4_H */