|  | .. zephyr:board:: imx943_evk | 
|  |  | 
|  | Overview | 
|  | ******** | 
|  |  | 
|  | The IMX943LP5EVK-19 board is a design and evaluation platform based on the | 
|  | NXP i.MX 943 processor. The i.MX 943 processor integrates up to four Arm | 
|  | Cortex-A55 cores, along with two Arm Cortex-M33 cores and two Arm Cortex-M7 | 
|  | cores for functional safety. With PLCs, I/O controllers, V2X accelerators, | 
|  | ML acceleration, energy management, and advanced security, the i.MX 943 | 
|  | processor provides optimized performance and power efficiency for industrial, | 
|  | IoT, and automotive devices. The i.MX943 device on the board comes in a | 
|  | compact 19 x 19 mm/15 x 15 mm package. | 
|  |  | 
|  | Hardware | 
|  | ******** | 
|  |  | 
|  | - i.MX 943 automotive applications processor | 
|  |  | 
|  | - The processor integrates up to four Arm Cortex-A55 cores, and supports | 
|  | functional safety with built-in Arm Cortex-M33 and -M7 cores | 
|  |  | 
|  | - DRAM memory: 8-Gbit LPDDR5 DRAM | 
|  | - XSPI interface: 64 MB octal SPI NOR flash memory | 
|  | - eMMC: 32 GB eMMC NAND flash memory | 
|  | - uSDHC interface: an SD card slot | 
|  | - USB interface: Two USB Type-C ports | 
|  | - Ethernet interface: seven Ethernet ports | 
|  | - PCIe interface: one M.2 slot and one PCIe x4 slot. | 
|  | - FlexCAN interface: four CAN controller with four CAN connector. | 
|  | - LPUART interface | 
|  | - LPSPI interface | 
|  | - LPI2C interface | 
|  | - SAI interface | 
|  | - MQS interface | 
|  | - MICFIL interface | 
|  | - LVDS interface | 
|  | - ADC interface | 
|  | - SINC interface | 
|  | - Debug interface | 
|  |  | 
|  | - One USB-to-UART/MPSSE device, FT4232H | 
|  | - One USB 3.2 Type-C connector (J15) for FT4232H provides quad serial ports | 
|  | - JTAG header J16 | 
|  |  | 
|  | Supported Features | 
|  | ================== | 
|  |  | 
|  | .. zephyr:board-supported-hw:: | 
|  |  | 
|  | System Clock | 
|  | ------------ | 
|  |  | 
|  | This board configuration uses a system clock frequency of 24 MHz for Cortex-A55. | 
|  | Cortex-A55 Core runs up to 1.7 GHz. | 
|  | Cortex-M33 Core runs up to 333MHz in which SYSTICK runs on same frequency. | 
|  |  | 
|  |  | 
|  | Serial Port | 
|  | ----------- | 
|  |  | 
|  | This board configuration uses a single serial communication channel with the | 
|  | CPU's UART1 for Cortex-A55, and UART8 for Cortex-M33. | 
|  |  | 
|  | Ethernet | 
|  | -------- | 
|  |  | 
|  | NETC driver supports to manage the Physical Station Interface (PSI), and TSN switch. | 
|  | The ENET0, ENETC1, ENETC2 ports could be enabled for M33 by west build option | 
|  | ``-DEXTRA_DTC_OVERLAY_FILE=enetc.overlay``. | 
|  |  | 
|  | For A55 Core, ENET0, ENETC1, ENETC2 ports are enabled by default, so no overlay is | 
|  | needed, but NETC depends on GIC ITS, so need to make sure to allocate heap memory to | 
|  | be larger than 851968 byes by setting CONFIG_HEAP_MEM_POOL_SIZE. | 
|  |  | 
|  | The two switch ports could be verified via :zephyr:code-sample:`dsa` on M33 core | 
|  | or on A55 Core, for example for A55 Core: | 
|  |  | 
|  | .. zephyr-app-commands:: | 
|  | :zephyr-app: samples/net/dsa | 
|  | :host-os: unix | 
|  | :board: imx943_evk/mimx94398/a55 | 
|  | :goals: flash | 
|  |  | 
|  | Or for M33 Core: | 
|  |  | 
|  | .. zephyr-app-commands:: | 
|  | :zephyr-app: samples/net/dsa | 
|  | :host-os: unix | 
|  | :board: imx943_evk/mimx94398/m33/ddr | 
|  | :goals: build | 
|  |  | 
|  | Programming and Debugging (A55) | 
|  | ******************************* | 
|  |  | 
|  | .. zephyr:board-supported-runners:: | 
|  |  | 
|  | There are multiple methods to program and debug Zephyr on the A55 core: | 
|  |  | 
|  | Option 1. Boot Zephyr by Using JLink Runner | 
|  | =========================================== | 
|  |  | 
|  | Dependency | 
|  | ---------- | 
|  |  | 
|  | Need to disable all watchdog in U-Boot, otherwise, watchdog will reset the board | 
|  | after Zephyr start up from the same A55 Core. | 
|  |  | 
|  | Setup | 
|  | ----- | 
|  |  | 
|  | The default runner for the board is JLink, connect the EVK board's JTAG connector to | 
|  | the host computer using a J-Link debugger, power up the board and stop the board at | 
|  | U-Boot command line. | 
|  |  | 
|  | Then use "west flash" or "west debug" command to load the zephyr.bin | 
|  | image from the host computer and start the Zephyr application on A55 core0. | 
|  |  | 
|  | Flash and Run | 
|  | ------------- | 
|  |  | 
|  | Here is an example for the :zephyr:code-sample:`hello_world` application. | 
|  |  | 
|  | .. zephyr-app-commands:: | 
|  | :zephyr-app: samples/hello_world | 
|  | :host-os: unix | 
|  | :board: imx943_evk/mimx94398/a55 | 
|  | :goals: flash | 
|  |  | 
|  | Then the following log could be found on UART1 console: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | *** Booting Zephyr OS build v4.1.0-3650-gdb71736adb68 *** | 
|  | Hello World! imx943_evk/mimx94398/a55 | 
|  |  | 
|  | Debug | 
|  | ----- | 
|  |  | 
|  | Here is an example for the :zephyr:code-sample:`hello_world` application. | 
|  |  | 
|  | .. zephyr-app-commands:: | 
|  | :zephyr-app: samples/hello_world | 
|  | :host-os: unix | 
|  | :board: imx943_evk/mimx94398/a55 | 
|  | :goals: debug | 
|  |  | 
|  | Option 2. Boot Zephyr by Using U-Boot Command | 
|  | ============================================= | 
|  |  | 
|  | U-Boot "go" command can be used to start Zephyr on A55 Core0. | 
|  |  | 
|  | Dependency | 
|  | ---------- | 
|  |  | 
|  | Need to disable all watchdog in U-Boot, otherwise, watchdog will reset the board | 
|  | after Zephyr start up from the same A55 Core. | 
|  |  | 
|  | Step 1: Build Zephyr application | 
|  | -------------------------------- | 
|  |  | 
|  | Here is an example for the :zephyr:code-sample:`hello_world` application. | 
|  |  | 
|  | .. zephyr-app-commands:: | 
|  | :zephyr-app: samples/hello_world | 
|  | :host-os: unix | 
|  | :board: imx943_evk/mimx94398/a55 | 
|  | :goals: build | 
|  |  | 
|  | Step 2: Download Zephyr Image into DDR Memory | 
|  | --------------------------------------------- | 
|  |  | 
|  | Firstly need to download Zephyr binary image into DDR memory, it can use tftp: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | tftp 0xd0000000 zephyr.bin | 
|  |  | 
|  | Or copy the Zephyr image ``zephyr.bin`` SD card and plug the card into the board, for example | 
|  | if copy to the FAT partition of the SD card, use the following U-Boot command to load the image | 
|  | into DDR memory (assuming the SD card is dev 1, fat partition ID is 1, they could be changed | 
|  | based on actual setup): | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | fatload mmc 1:1 0xd0000000 zephyr.bin; | 
|  |  | 
|  | Step 3: Boot Zephyr | 
|  | ------------------- | 
|  |  | 
|  | Use the following command to boot Zephyr on the core0: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | dcache flush; icache flush; go 0xd0000000; | 
|  |  | 
|  | Then the following log could be found on UART1 console: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | *** Booting Zephyr OS build v4.1.0-3650-gdb71736adb68 *** | 
|  | Hello World! imx943_evk/mimx94398/a55 | 
|  |  | 
|  | .. include:: ../../common/board-footer.rst | 
|  | :start-after: nxp-board-footer | 
|  |  | 
|  | Programming and Debugging (M33 in NETC MIX, M7_0 in M7MIX0, M7_1 in M7MIX1) | 
|  | *************************************************************************** | 
|  |  | 
|  | Step 1. Build Zephyr application | 
|  | ================================ | 
|  |  | 
|  | Here is an example to build the :zephyr:code-sample:`hello_world` application. | 
|  |  | 
|  | For TCM target | 
|  |  | 
|  | .. zephyr-app-commands:: | 
|  | :zephyr-app: samples/hello_world | 
|  | :board: imx943_evk/mimx94398/m33 | 
|  | :goals: build | 
|  |  | 
|  | .. zephyr-app-commands:: | 
|  | :zephyr-app: samples/hello_world | 
|  | :board: imx943_evk/mimx94398/m7_0 | 
|  | :goals: build | 
|  |  | 
|  | .. zephyr-app-commands:: | 
|  | :zephyr-app: samples/hello_world | 
|  | :board: imx943_evk/mimx94398/m7_1 | 
|  | :goals: build | 
|  |  | 
|  | For DDR target | 
|  |  | 
|  | .. zephyr-app-commands:: | 
|  | :zephyr-app: samples/hello_world | 
|  | :board: imx943_evk/mimx94398/m33/ddr | 
|  | :goals: build | 
|  |  | 
|  | Step 2. Build bootable firmware | 
|  | =============================== | 
|  |  | 
|  | The imx-mkimage tool and some other firmware files from `i.MX Linux BSP release`_ | 
|  | are required to make a bootable firmware to program to SD/eMMC. | 
|  |  | 
|  | Below is an operations example on Linux host. (For more detail, refer to | 
|  | `i.MX Linux BSP release`_ 6.12.3_1.0.0) | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | # download | 
|  |  | 
|  | git clone https://github.com/nxp-imx/imx-mkimage.git -b lf-6.12.3_1.0.0 | 
|  | git clone https://github.com/nxp-imx/imx-sm.git      -b lf-6.12.3-imx943-er1 | 
|  | git clone https://github.com/nxp-imx/imx-oei.git     -b lf-6.12.3-imx943-er1 | 
|  |  | 
|  | wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.27-5af0ceb.bin | 
|  | wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-ele-imx-2.0.1-0a66c34.bin | 
|  |  | 
|  | # some firmware files need to be unpacked | 
|  |  | 
|  | chmod 777 firmware-imx-8.27-5af0ceb.bin | 
|  | chmod 777 firmware-ele-imx-2.0.1-0a66c34.bin | 
|  | ./firmware-imx-8.27-5af0ceb.bin --auto-accept | 
|  | ./firmware-ele-imx-2.0.1-0a66c34.bin --auto-accept | 
|  |  | 
|  | # some firmware files need to be built from source | 
|  |  | 
|  | export TOOLS=$ARMGCC_DIR | 
|  | export SM_CROSS_COMPILE=${TOOLS}/bin/arm-none-eabi- | 
|  | export OEI_CROSS_COMPILE=${TOOLS}/bin/arm-none-eabi- | 
|  |  | 
|  | make -C imx-oei board=mx943lp5-19 oei=ddr d=1 all | 
|  | make -C imx-sm config=mx94alt cfg | 
|  | make -C imx-sm config=mx94alt all | 
|  |  | 
|  | # make bootable firmware flash.bin | 
|  |  | 
|  | cp firmware-imx-8.27-5af0ceb/firmware/ddr/synopsys/lpddr5*v202409.bin imx-mkimage/iMX94/ | 
|  | cp firmware-ele-imx-2.0.1-0a66c34/mx943a0-ahab-container.img          imx-mkimage/iMX94/ | 
|  | cp imx-sm/build/mx94alt/m33_image.bin                                 imx-mkimage/iMX94/ | 
|  | cp imx-oei/build/mx943lp5-19/ddr/oei-m33-ddr.bin                      imx-mkimage/iMX94/ | 
|  | cp zephyr/build/zephyr/zephyr.bin                                     imx-mkimage/iMX94/m33s_image.bin (m70_image.bin or m71_image.bin) | 
|  |  | 
|  | cd imx-mkimage | 
|  | make SOC=iMX94 OEI=YES flash_m33s     # for TCM target | 
|  | make SOC=iMX94 OEI=YES flash_m33s_ddr # for DDR target | 
|  | or | 
|  | make SOC=iMX94 OEI=YES flash_m33s_m70_m71  # for TCM target | 
|  |  | 
|  |  | 
|  | # Program to SD card | 
|  |  | 
|  | dd if=iMX94/flash.bin of=/dev/sdb bs=1k seek=32 && sync | 
|  |  | 
|  | Note: for this Linux BSP release version, we need to do some changes in imx-sm and imx-mkimage | 
|  | to support M33 boot and DDR target. | 
|  |  | 
|  | imx-sm changes: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | diff --git a/configs/mx94alt.cfg b/configs/mx94alt.cfg | 
|  | index 4613900..069992a 100755 | 
|  | --- a/configs/mx94alt.cfg | 
|  | +++ b/configs/mx94alt.cfg | 
|  | @@ -308,7 +308,7 @@ FAULT_SWNCF04       OWNER, reaction=sys_shutdown | 
|  | # Boot EENV                                                                # | 
|  | #==========================================================================# | 
|  |  | 
|  | -LM1                 name="Boot", rpc=scmi, boot=2, skip=1, did=3, default | 
|  | +LM1                 name="Boot", rpc=scmi, boot=2, skip=1, did=13, default | 
|  |  | 
|  | DFMT0:              sa=secure | 
|  | DFMT1:              sa=secure, pa=privileged | 
|  | @@ -322,10 +322,6 @@ DATA:               perm=rw | 
|  |  | 
|  | PD_NETC             stop=6 | 
|  | CPU_M33S            start=1, stop=5 | 
|  | -PD_M70              stop=4 | 
|  | -CPU_M7P0            start=2, stop=3 | 
|  | -PD_M71              stop=2 | 
|  | -CPU_M7P1            start=3, stop=1 | 
|  |  | 
|  | # Start/Stop (mSel=1) | 
|  |  | 
|  | imx-mkimage changes: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | diff --git a/iMX94/soc.mak b/iMX94/soc.mak | 
|  | index 838d2a2..bc756f9 100644 | 
|  | --- a/iMX94/soc.mak | 
|  | +++ b/iMX94/soc.mak | 
|  | @@ -392,6 +392,11 @@ flash_m33s: $(MKIMG) $(AHAB_IMG) $(MCU_IMG) $(M33S_IMG) $(OEI_IMG_M33) | 
|  | -m33 $(MCU_IMG) 0 $(MCU_TCM_ADDR) \ | 
|  | -m33 $(M33S_IMG) 1 $(M33S_TCM_ADDR) $(M33S_TCM_ADDR_ALIAS) -out flash.bin | 
|  |  | 
|  | +flash_m33s_ddr: $(MKIMG) $(AHAB_IMG) $(MCU_IMG) $(M33S_IMG) $(OEI_IMG_M33) | 
|  | +       ./$(MKIMG) -soc IMX9 -cntr_version 2 -u 1 -append $(AHAB_IMG) -c $(OEI_OPT_M33) -msel $(MSEL) \ | 
|  | +                  -m33 $(MCU_IMG) 0 $(MCU_TCM_ADDR) \ | 
|  | +                  -m33 $(M33S_IMG) 1 0x86000000 0x86000000 -out flash.bin | 
|  | + | 
|  | flash_m33s_xspi: $(MKIMG) $(AHAB_IMG) $(MCU_IMG) $(M33S_IMG) $(OEI_IMG_M33) | 
|  | ./$(MKIMG) -soc IMX9 -cntr_version 2 -u 1 -append $(AHAB_IMG) -dev flexspi -c $(OEI_OPT_M33) -msel $(MSEL) \ | 
|  | -m33 $(MCU_IMG) 0 $(MCU_TCM_ADDR) \ | 
|  |  | 
|  | Step 3. Boot Zephyr | 
|  | =================== | 
|  |  | 
|  | Boot board from SD card. It will display the following console output. | 
|  |  | 
|  | For TCM target | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | *** Booting Zephyr OS build v4.1.0-5264-g8654b4029d16 *** | 
|  | Hello World! imx943_evk/mimx94398/m33 | 
|  |  | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | *** Booting Zephyr OS build v4.2.0-803-g5537e8d9b3f1 *** | 
|  | Hello World! imx943_evk/mimx94398/m7_0 | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | *** Booting Zephyr OS build v4.2.0-803-g2f145e66dce2 *** | 
|  | Hello World! imx943_evk/mimx94398/m7_1 | 
|  |  | 
|  | For DDR target | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | *** Booting Zephyr OS build v4.1.0-5264-g8654b4029d16 *** | 
|  | Hello World! imx943_evk/mimx94398/m33/ddr | 
|  |  | 
|  | Note: | 
|  |  | 
|  | a. Please connect two additional usb2serial converter between Host PC and board's | 
|  | auduino interface with dupont cable for M70 in M70 MIX and M71 in M71 MIX. | 
|  | Connection as below, | 
|  |  | 
|  | .. code-block:: text | 
|  |  | 
|  | +---------+  USB  +-----------------+                                 +---------+ | 
|  | | Host PC |<----->| USB-to-Serial a |--TX-->RX(J48-2, M2_UART11_RXD)--|  board  | | 
|  | |         |       |                 |--RX<--TX(J48-4, M2_UART11_TXD)--|         | | 
|  | |         |       |                 |--GND----------------GND(J47-14)-|         | | 
|  | |         |       +-----------------+                                 |         | | 
|  | |         |                                                           |         | | 
|  | |         |  USB  +-----------------+                                 |         | | 
|  | |         |<----->| USB to Serial b |--TX-->RX(J44-2, M1_UART12_RXD)--|         | | 
|  | |         |       |                 |--RX<--TX(j44-4, M1_UART12_TXD)--|         | | 
|  | |         |       |                 |--GND----------------GND(J43-14)-|         | | 
|  | +---------+       +-----------------+                                 +---------+ | 
|  |  | 
|  | b. There will be 4 serial ports identified when connect USB cable to debug port. | 
|  | The first serial port will be UART8 for M33. As there is multiplexing between JTAG | 
|  | and UART8, below bcu (`bcu 1.1.113 download`_) configuration is needed to use UART8. | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | bcu lsftdi | 
|  | bcu set_gpio fta_jtag_host_en 0 -board=imx943evk19b1 -id=1-1 | 
|  |  | 
|  | .. _bcu 1.1.113 download: | 
|  | https://github.com/nxp-imx/bcu/releases/tag/bcu_1.1.113 | 
|  |  | 
|  | .. _i.MX Linux BSP release: | 
|  | https://www.nxp.com/design/design-center/software/embedded-software/i-mx-software/embedded-linux-for-i-mx-applications-processors:IMXLINUX |