Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

344 lines
11 KiB

.. zephyr:board:: imx93_evk
Overview
********
The i.MX93 Evaluation Kit (MCIMX93-EVK board) is a platform designed to show
the most commonly used features of the i.MX 93 Applications Processor in a
small and low cost package. The MCIMX93-EVK board is an entry-level development
board, which helps developers to get familiar with the processor before
investing a large amount of resources in more specific designs.
i.MX93 MPU is composed of one cluster of 2x Cortex-A55 cores and a single
Cortex®-M33 core. Zephyr OS is ported to run on one of the Cortex®-A55 core.
- Board features:
- RAM: 2GB LPDDR4
- Storage:
- SanDisk 16GB eMMC5.1
- microSD Socket
- Wireless:
- Murata Type-2EL (SDIO+UART+SPI) module. It is based on NXP IW612 SoC,
which supports dual-band (2.4 GHz /5 GHz) 1x1 Wi-Fi 6, Bluetooth 5.2,
and 802.15.4
- USB:
- Two USB 2.0 Type C connectors
- Ethernet
- PCI-E M.2
- Connectors:
- 40-Pin Dual Row Header
- LEDs:
- 1x Power status LED
- 2x UART LED
- Debug
- JTAG 20-pin connector
- MicroUSB for UART debug, two COM ports for A55 and M33
Supported Features
==================
.. zephyr:board-supported-hw::
Devices
========
System Clock
------------
This board configuration uses a system clock frequency of 24 MHz.
Cortex-A55 Core runs up to 1.7 GHz.
Cortex-M33 Core runs up to 200MHz in which SYSTICK runs on same frequency.
Serial Port
-----------
This board configuration uses a single serial communication channel with the
CPU's UART2 for A55 core and M33 core.
Board MUX Control
-----------------
This board configuration uses a series of digital multiplexers to switch between
different board functions. The multiplexers are controlled by a GPIO signal called
``EXP_SEL`` from onboard GPIO expander ADP5585. It can be configured to select
function set "A" or "B" by dts configuration if board control module is enabled.
The following dts node is defined:
.. code-block:: dts
board_exp_sel: board-exp-sel {
compatible = "imx93evk-exp-sel";
mux-gpios = <&gpio_exp0 4 GPIO_ACTIVE_HIGH>;
mux = "A";
};
Following steps are required to configure the ``EXP_SEL`` signal:
1. Enable Kconfig option ``CONFIG_BOARD_MIMX93_EVK_EXP_SEL_INIT``.
2. Select ``mux="A";`` or ``mux="B";`` in ``&board_exp_sel`` devicetree node.
Kconfig option ``CONFIG_BOARD_MIMX93_EVK_EXP_SEL_INIT`` is enabled if a board
function that requires configuring the mux is enabled. The MUX option is
automatically selected if certain board function is enabled, and takes precedence
over dts config. For instance, if ``CONFIG_CAN`` is enabled, MUX A is selected
even if ``mux="B";`` is configured in dts, and an warning would be reported in
the log.
User Button GPIO Option
--------------------------
The user buttons RFU_BTN1 and RFU_BTN2 is connected to i.MX 93 GPIO by default,
but can be changed to connect to onboard GPIO expander PCAL6524 with on-board DIP
switches. To do this, switch SW1006 to 0000, then switch SW1005 to 0101. An devicetree
overlay is included to support this.
Run following command to test user buttons on PCAL6524:
.. zephyr-app-commands::
:zephyr-app: samples/basic/button
:host-os: unix
:board: imx93_evk/mimx9352/a55
:goals: build
:gen-args: -DEXTRA_DTC_OVERLAY_FILE=imx93_evk_mimx9352_exp_btn.overlay
Run the app, press RFU_BTN1 and the red LED turns on accordingly.
Note: The overlay only supports ``mimx9352/a55``, but can be extended to support
``mimx9352/m33`` if I2C and PCAL6524 is enabled.
Programming and Debugging (A55)
*******************************
.. zephyr:board-supported-runners::
U-Boot "cpu" command is used to load and kick Zephyr to Cortex-A secondary Core, Currently
it is supported in : `Real-Time Edge U-Boot`_ (use the branch "uboot_vxxxx.xx-y.y.y,
xxxx.xx is uboot version and y.y.y is Real-Time Edge Software version, for example
"uboot_v2023.04-2.9.0" branch is U-Boot v2023.04 used in Real-Time Edge Software release
v2.9.0), and pre-build images and user guide can be found at `Real-Time Edge Software`_.
.. _Real-Time Edge U-Boot:
https://github.com/nxp-real-time-edge-sw/real-time-edge-uboot
.. _Real-Time Edge Software:
https://www.nxp.com/rtedge
Copy the compiled ``zephyr.bin`` to the first FAT partition of the SD card and
plug the SD card into the board. Power it up and stop the u-boot execution at
prompt.
Use U-Boot to load and kick zephyr.bin to Cortex-A55 Core1:
.. code-block:: console
fatload mmc 1:1 0xd0000000 zephyr.bin; dcache flush; icache flush; cpu 1 release 0xd0000000
Or use the following command to kick zephyr.bin to Cortex-A55 Core0:
.. code-block:: console
fatload mmc 1:1 0xd0000000 zephyr.bin; dcache flush; icache flush; go 0xd0000000
Use this configuration to run basic Zephyr applications and kernel tests,
for example, with the :zephyr:code-sample:`synchronization` sample:
.. zephyr-app-commands::
:zephyr-app: samples/synchronization
:host-os: unix
:board: imx93_evk/mimx9352/a55
:goals: build
This will build an image with the synchronization sample app, boot it and
display the following console output:
.. code-block:: console
*** Booting Zephyr OS build Booting Zephyr OS build v3.7.0-2055-g630f27a5a867 ***
thread_a: Hello World from cpu 0 on imx93_evk!
thread_b: Hello World from cpu 0 on imx93_evk!
thread_a: Hello World from cpu 0 on imx93_evk!
thread_b: Hello World from cpu 0 on imx93_evk!
System Reboot (A55)
===================
Currently i.MX93 only support cold reboot and doesn't support warm reboot.
Use this configuratiuon to verify cold reboot with :zephyr:code-sample:`shell-module`
sample:
.. zephyr-app-commands::
:zephyr-app: samples/subsys/shell/shell_module
:host-os: unix
:board: imx93_evk/mimx9352/a55
:goals: build
This will build an image with the shell sample app, boot it and execute
kernel reboot command in shell command line:
.. code-block:: console
uart:~$ kernel reboot cold
Programming and Debugging (M33)
*******************************
Copy the compiled ``zephyr.bin`` to the first FAT partition of the SD card and
plug the SD card into the board. Power it up and stop the u-boot execution at
prompt.
Use U-Boot to load and kick zephyr.bin to Cortex-M33 Core:
Boot with code from TCM
=======================
.. code-block:: console
load mmc 1:1 0x80000000 zephyr.bin;cp.b 0x80000000 0x201e0000 0x30000;bootaux 0x1ffe0000 0
Boot with code from DDR
=======================
.. code-block:: console
load mmc 1:1 0x84000000 zephyr.bin;dcache flush;bootaux 0x84000000 0
Note: Cortex M33 need execute permission to run code from DDR memory. In order
to enable this, `imx-atf`_ can to be modified in "plat/imx/imx93/trdc_config.h".
.. _imx-atf:
https://github.com/nxp-imx/imx-atf
Use this configuration to run basic Zephyr applications and kernel tests,
for example, with the :zephyr:code-sample:`synchronization` sample:
.. zephyr-app-commands::
:zephyr-app: samples/synchronization
:host-os: unix
:board: imx93_evk/mimx9352/m33
:goals: run
This will build an image with the synchronization sample app, boot it and
display the following console output:
.. code-block:: console
*** Booting Zephyr OS build v3.7.0-684-g71a7d05ba60a ***
thread_a: Hello World from cpu 0 on imx93_evk!
thread_b: Hello World from cpu 0 on imx93_evk!
thread_a: Hello World from cpu 0 on imx93_evk!
thread_b: Hello World from cpu 0 on imx93_evk!
To make a container image flash.bin with ``zephyr.bin`` for SD/eMMC programming and booting
from BootROM. Refer to user manual of i.MX93 `MCUX SDK release`_.
.. _MCUX SDK release:
https://mcuxpresso.nxp.com/
References
==========
More information can refer to NXP official website:
`NXP website`_.
.. _NXP website:
https://www.nxp.com/products/processors-and-microcontrollers/arm-processors/i-mx-applications-processors/i-mx-9-processors/i-mx-93-applications-processor-family-arm-cortex-a55-ml-acceleration-power-efficient-mpu:i.MX93
Using the SOF-specific variant
******************************
Purpose
=======
Since this board doesn't have a DSP, an alternative for people who might be interested
in running SOF on this board had to be found. The alternative consists of running SOF
on an A55 core using Jailhouse as a way to "take away" one A55 core from Linux and
assign it to Zephyr with `SOF`_.
.. _SOF:
https://github.com/thesofproject/sof
What is Jailhouse?
==================
Jailhouse is a light-weight hypervisor that allows the partitioning of hardware resources.
For more details on how this is done and, generally, about Jailhouse, please see: `1`_,
`2`_ and `3`_. The GitHub repo can be found `here`_.
.. _1:
https://lwn.net/Articles/578295/
.. _2:
https://lwn.net/Articles/578852/
.. _3:
http://events17.linuxfoundation.org/sites/events/files/slides/ELCE2016-Jailhouse-Tutorial.pdf
.. _here:
https://github.com/siemens/jailhouse
How does it work?
=================
Firstly, we need to explain a few Jailhouse concepts that will be referred to later on:
* **Cell**: refers to a set of hardware resources that the OS assigned to this
cell can utilize.
* **Root cell**: refers to the cell in which Linux is running. This is the main cell which
will contain all the hardware resources that Linux will utilize and will be used to assign
resources to the inmates. The inmates CANNOT use resources such as the CPU that haven't been
assigned to the root cell.
* **Inmate**: refers to any other OS that runs alongside Linux. The resources an inmate will
use are taken from the root cell (the cell Linux is running in).
SOF+Zephyr will run as an inmate, alongside Linux, on core 1 of the board. This means that
said core will be taken away from Linux and will only be utilized by Zephyr.
The hypervisor restricts inmate's/root's access to certain hardware resources using
the second-stage translation table which is based on the memory regions described in the
configuration files. Please consider the following scenario:
Root cell wants to use the **UART** which let's say has its registers mapped in
the **[0x0 - 0x42000000]** region. If the inmate wants to use the same **UART** for
some reason then we'd need to also add this region to inmate's configuration
file and add the **JAILHOUSE_MEM_ROOTSHARED** flag. This flag means that the inmate
is allowed to share this region with the root. If this region is not set in
the inmate's configuration file and Zephyr (running as an inmate here) tries
to access this region this will result in a second stage translation fault.
Notes:
* Linux and Zephyr are not aware that they are running alongside each other.
They will only be aware of the cores they have been assigned through the config
files (there's a config file for the root and one for each inmate).
Architecture overview
=====================
The architecture overview can be found at this `location`_. (latest status update as of now
and the only one containing diagrams).
.. _location:
https://github.com/thesofproject/sof/issues/7192
How to use this board?
======================
This board has been designed for SOF so it's only intended to be used with SOF.
TODO: document the SOF build process for this board. For now, the support for
i.MX93 is still in review and has yet to merged on SOF side.
.. include:: ../../common/board-footer.rst
:start-after: nxp-board-footer