i.MX 93 AHAB with U-BOOT#
This notebook describes how to build a bootable AHAB image with ELE firmware and U-BOOT bootloader, load it using the NXPUUU app and how to use NXPELE app.
1. Prerequisites#
SPSDK is needed with examples extension.
pip install spsdk[examples]
(Please refer to the installation documentation.)This demo was tested with i.MX93 EVK board
1.1 Images preparation#
to create resulting binary containing AHAB containers, we need to prepare the binaries
in this section we reproduce the process which is done by the
imx-mkimage
tool as flash singleboot binaryObtain all the necessary binaries (lpddr4 firmware, u-boot, bl31, ELE firmware) and put them into inputs directory
1.2 U-Boot#
Read the U-Boot documentation to understand the U-Boot build process In order to use the nxpele app, U-Boot must be built with AHAB support. CONFIG_AHAB_BOOT=y If you want to use the nxpele over fastboot, also multiplexing of console output to fastboot must be enabled by setting CONFIG_CONSOLE_MUX=y.
1.3 Requirements#
Download these files from the https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/<package name>
and put them into the inputs directory.
lpddr4 firmware files
u-boot binary (u-boot SPL and u-boot) built with AHAB support.
bl31.bin binary (ARM Trusted Firmware)
ELE firmware binary AHAB
i.MX93 EVK board
2. AHAB Image#
The U-Boot image (flash.bin created by imx-mkimage) consists of two container sets - first container set is load to OCRAM using the SDPS protocol supported by ROM. The first container set contains U-Boot SPL binary, ELE firmware and firmware and training data for DDR controller. The second container set contains the full U-Boot and ATF image and is loaded to DDR by U-Boot SPL.
2.1 AHAB Template#
We can generate the template using the nxpimage ahab get-template command. The command will generate a template. The template is a YAML file that contains the AHAB header and the AHAB container. The AHAB header contains the information about the image, such as the version, the number of containers, and the signature. The AHAB container contains the information about the image, such as the image type, the image version, the image size, and the image signature.
The following command generates the template:
nxpimage ahab get-template -f mimx9352 -o ahab_template.yaml
2.2 Exporting of the AHAB image#
The AHAB image can be exported using the nxpimage ahab export command. The command will create the AHAB image from the template. The following command creates the AHAB image:
nxpimage ahab export -c ahab_template.yaml
2.3 U-Boot SPL image#
U-Boot SPL image contains ELE firmware (Optional), DDR firmware and training data, and U-Boot SPL binary. It is the first container set that is loaded to OCRAM by ROM using SDPS protocol. Let’s prepare the configuration from the template.
2.3 U-Boot ATF Image#
The secondary container set contains the U-Boot and ATF images.
3. AHAB Image Container set#
Now we have the AHAB image with U-Boot SPL DDR and AHAB Image with U-Boot ATF container. We can use the nxpimage binary-image merge command to merge the AHAB images into one binary image. The following command merges the AHAB images:
nxpimage -v bootable-image merge -c u-boot-flash_template.yaml -o flash.bin
We have to prepare the configuration. In configuration file we just specify the target memory (in our case we are downloading the image using the nxpuuu so serial downloader is enough).
YamlDiffWidget("inputs/imx93_ahab_bimg.diffc").html
nxpimage bootable-image get-templates -f mimx9352 -o workspace --force
Creating workspace/bootimg_mimx9352_serial_downloader.yaml template file.
Creating workspace/bootimg_mimx9352_flexspi_nor.yaml template file.
Creating workspace/bootimg_mimx9352_emmc.yaml template file.
Creating workspace/bootimg_mimx9352_sd.yaml template file.
Creating workspace/bootimg_mimx9352_recovery_spi.yaml template file.
VERBOSITY = "-v"
U_BOOT_FLASH_BOOT_CFG = "inputs/u-boot-bootable.yaml"
U_BOOT_FLASH_BOOT = "outputs/flash.bin"
%! nxpimage $VERBOSITY bootable-image merge --config $U_BOOT_FLASH_BOOT_CFG --output $U_BOOT_FLASH_BOOT
nxpimage -v bootable-image merge --config inputs/u-boot-bootable.yaml --output outputs/flash.bin
INFO:spsdk.image.ahab.ahab_iae:Adding DDR memory areas into SPL image
INFO:spsdk.apps.nxpimage:Created Bootable Image:
Name: Bootable Image for mimx9352
Starts: 0x0
Ends: 0x1639ff
Size: Size: 1.4 MiB; 1,456,640 B
Alignment: 1 B
Execution Start Address: Not defined
Pattern:zeros
Memory type: MemoryType.SERIAL_DOWNLOADER
Revision: a1
INFO:spsdk.apps.nxpimage:Created Bootable Image memory map:
+==0x0000_0000= Bootable Image for mimx9352 =============+
| Size: 1.4 MiB; 1,456,640 B |
| Memory type: MemoryType.SERIAL_DOWNLOADER Revision: a1 |
| Pattern: zeros |
|+==0x0000_0000= primary_image_container_set ===========+|
|| Size: 228.5 kiB; 233,984 B ||
|| AHAB Image for mimx9352_a1 ||
|| Pattern: zeros ||
||+==0x0000_0000= AHAB Containers =====================+||
||| Size: 8.0 kiB; 8,192 B |||
||| AHAB Containers block |||
||| Pattern: zeros |||
|||+==0x0000_0000= AHAB Container 0 ==================+|||
|||| Size: 160 B ||||
|||| AHAB Container for none_SWver:0 ||||
|||+==0x0000_009f=====================================+|||
||+==0x0000_1fff=======================================+||
||+==0x0000_2000= U-Boot SPL with DDR tunning images ==+||
||| Size: 220.5 kiB; 225,792 B |||
||| AHAB data block for cortex-a55 core and executable |||
||| Image Type. |||
||+==0x0003_91ff=======================================+||
|+==0x0003_91ff=========================================+|
| Gap: 512 B |
|+==0x0003_9400= secondary_image_container_set =========+|
|| Size: 1.2 MiB; 1,222,144 B ||
|| AHAB Image for mimx9352_a1 ||
|| Pattern: zeros ||
||+==0x0003_9400= AHAB Containers =====================+||
||| Size: 8.0 kiB; 8,192 B |||
||| AHAB Containers block |||
||| Pattern: zeros |||
|||+==0x0003_9400= AHAB Container 0 ==================+|||
|||| Size: 288 B ||||
|||| AHAB Container for none_SWver:0 ||||
|||+==0x0003_951f=====================================+|||
||+==0x0003_b3ff=======================================+||
||+==0x0003_b400= ATF - ARM Trusted Firmware ==========+||
||| Size: 38.0 kiB; 38,912 B |||
||| AHAB data block for cortex-a55 core and executable |||
||| Image Type. |||
||+==0x0004_4bff=======================================+||
||+==0x0004_4c00= U-Boot Firmware =====================+||
||| Size: 1.1 MiB; 1,175,040 B |||
||| AHAB data block for cortex-a55 core and executable |||
||| Image Type. |||
||+==0x0016_39ff=======================================+||
|+==0x0016_39ff=========================================+|
+==0x0016_39ff===========================================+
Success. (Bootable Image: outputs/flash.bin created)
4. Image download#
First we put the iMX93
into serial downloader mode for Cortex-A (0011
), and use uuu
to upload the flash.bin
containing U-Boot and other firmware.
The picture below shows the desired DIP switch configuration for flashing Cortex-A:
%! nxpuuu $VERBOSITY write -f mimx9352 -b emmc $U_BOOT_FLASH_BOOT
nxpuuu -v write -f mimx9352 -b emmc outputs/flash.bin
SDPS: boot -f outputs/flash.bin
Done
5. NXPELE#
NXPELE is a tool that can communicate with the EdgeLock enclave. It might be used for example for writing and reading the fuses and keyblob generation.
To communicate with the iMX93
, we need to set it into eMMC boot for Cortex-A (0000
)
The picture below shows the desired DIP switch configuration for booting from Cortex-A:
%! nxpele -f mimx9352 get-info
nxpele -f mimx9352 get-info
ELE get info ends successfully:
Command: 0xda
Version: 1
Length: 92
SoC ID: MX93 - 0x9300
SoC version: A000
Life Cycle: OEM_OPEN - 0x0010
SSSM state: 4
UUID: ae4d3fd10dcc44e7bccd9e27a152e5d3
SHA256 ROM PATCH: 0563db6df6388ec7f5b2bba52110bebdfa0302b6e3a39493e03c7c9be7ab8686
SHA256 FW: 0000000000000000000000000000000000000000000000000000000000000000