Skip to main content

Zephyr Porting Guide for AXON/EDM/PICO-IMX93

Applicable Platforms

This guide applies to the following SOMs.

  • AXON-IMX93
  • EDM-IMX93
  • PICO-IMX93

Introduction

This article documents a practical workflow for building and running Zephyr RTOS on the Cortex-M33 core of the NXP i.MX93 platform. It covers setting up a Zephyr workspace with west, building M33 targets , and booting the M33 firmware either by loading a binary from U-Boot or by using Linux remoteproc to start an ELF on the M33 core.

Part1: Set Up the Environment

Follow these steps on Ubuntu to prepare the Zephyr workspace using the TechNexion fork for i.MX93 platforms.

1.1 Install System Packages

sudo apt update
sudo apt install -y git cmake ninja-build gperf dfu-util device-tree-compiler \
python3-venv python3-pip xz-utils file make gcc g++

1.2 Clone TechNexion Zephyr Fork

mkdir -p ~/tn-zephyr-ws
cd ~/tn-zephyr-ws
git clone -b tn-v4.3-branch https://github.com/TechNexion/zephyr.git zephyr

1.3 Initialize Python venv and West

python3 -m venv .venv
source .venv/bin/activate
pip install -U pip west
west init -l zephyr
west update

1.4 Install Dependencies and SDK

pip install -r zephyr/scripts/requirements.txt
cd zephyr
west zephyr-export
west sdk install

Part2: Build and Run hello_world example

This section shows how to:

  • Build the Zephyr hello_world sample for the PICO-IMX93 Cortex-M33 core.
  • Identify the generated binary and ELF files.
  • Boot the M33 core from U-Boot using the generated image.

2.1 Build the hello_world application

Use west build to compile the Zephyr hello_world sample for the PICO-IMX93 M33 target:

west build -p always -b pico_imx93/mimx9352/m33 samples/hello_world

After a successful build, Zephyr places output files under the build/zephyr/ directory and copy binary file to 1st FAT partition:

cp build/zephyr/zephyr.bin /media/username/boot/

2.2 Run hello_world example

Choose to load bin with cortex-m33 support.

In u-boot prompt:

setenv m33image zephyr.bin
run m33boot

You should see the following output from debug console:

helloworld.png

Part3: Build and Run synchronization example

3.1 Build the synchronization application

Use west build to compile the Zephyr synchronization sample for the PICO-IMX93 M33 target:

west build -p always -b pico_imx93/mimx9352/m33 samples/synchronization

After a successful build, Zephyr places output files under the build/zephyr/ directory ; deploy zephyr.elf to /lib/firmware/ for Linux remoteproc loading and place zephyr.bin on the first FAT (BOOT) partition for U-Boot booting:

cp build/zephyr/zephyr.bin /media/username/boot/
cp build/zephyr/zephyr.elf /media/username/root/lib/firmware/

3.2 Run synchronization example

1.Choose to load bin with cortex-m33 support.

In u-boot prompt:

setenv m33image zephyr.bin
run m33boot

You should see the following output from debug console:

synchronization.png

2.Choose to load elf with cortex-m33 support.

In u-boot prompt:

run prepare_mcore
boot

In Yocto prompt:

echo zephyr.elf > /sys/class/remoteproc/remoteproc0/firmware
echo start > /sys/class/remoteproc/remoteproc0/state

You should see the following output from debug console:

synchronizationelf.png

Part4: Build and Run openamp example

4.1 Build the openamp application

Use west build to compile the Zephyr openamp sample for the PICO-IMX93 M33 target:

west build -p always -b pico_imx93/mimx9352/m33 samples/subsys/ipc/openamp_rsc_table

After a successful build, Zephyr places output files under the build/zephyr/ directory ; deploy zephyr.elf to /lib/firmware/ for Linux remoteproc loading and place zephyr.bin on the first FAT (BOOT) partition for U-Boot booting:

cp build/zephyr/zephyr_openamp_rsc_table.bin /media/username/boot/
cp build/zephyr/zephyr_openamp_rsc_table.elf /media/username/root/lib/firmware/

4.2 Run openamp example

1.Choose to load bin with cortex-m33 support.

In u-boot prompt:

setenv m33image zephyr_openamp_rsc_table.bin
run m33boot

In Yocto prompt:

dmesg | grep rpmsg
echo "Hello Zephyr" >/dev/ttyRPMSG1

You should see the following output from debug console:

openampbin.png

2.Choose to load elf with cortex-m33 support.

In u-boot prompt:

run prepare_mcore
boot

In Yocto prompt:

cat /sys/class/remoteproc/remoteproc0/state
echo zephyr_openamp_rsc_table.elf > /sys/class/remoteproc/remoteproc0/firmware
echo start > /sys/class/remoteproc/remoteproc0/state

dmesg | grep rpmsg
echo "Hello Zephyr" >/dev/ttyRPMSG1

You should see the following output from debug console:

openampelf.png

Reference