Skip to content

Commit

Permalink
tools/imx9: prepare bootable bootloader image
Browse files Browse the repository at this point in the history
This does the following:
  1. Fetches mkimage_imx8 (same used with imx9) source code
  2. Fetches the ELE / AHAB binary
  3. Extracts the ELE / AHAB binary
  4. Compiles the mkimage with hostcc
  5. Utilizes the mkimage tool to create a bootable SD image,
     combining the ELE / AHAB image with the NuttX bootloader
  6. dd is used to prepend empty space in place of BL31
  7. Outputs sdimage.img which is a bootable binary
  8. Removes all binaries, sources code images that have been
     downloaded

Signed-off-by: Eero Nurkkala <[email protected]>
  • Loading branch information
eenurkka authored and jlaitine committed Jul 12, 2024
1 parent 640c479 commit 4b517db
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 4 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,6 @@ uImage
.DS_Store
tools/gdb/__pycache__
/build
.ccls-cache
compile_commands.json
imx9-sdimage.img
31 changes: 27 additions & 4 deletions Documentation/platforms/arm64/imx9/boards/imx93-evk/README.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,19 @@ README.txt
The kit i.MX93 Evaluation Kit has a pre-installed Linux image which contains
u-boot and the i.MX93 reference Linux installation.

u-boot is required to boot NuttX (for now) as it initializes the hardware for
us, i.e. DDR, clocks, I/O muxes etc.
NuttX may work as the bootloader, replacing u-boot completely. Currently it
doesn't initialize the DDR memory yet. In other words, DDR training is still
missing.

==========================================

How to run nuttx on i.MX93 Evaluation Kit.

==========================================

Below is a set of instructions on how to run NuttX on the i.MX93 EVK
Below is a set of instructions on how to run NuttX on the i.MX93 EVK, on top
of the u-boot. Also, instructions on running NuttX as the bootloader will
follow.

==========================================

Expand Down Expand Up @@ -75,11 +78,12 @@ Loading and running the NuttX image

==========================================

You have three options:
You have four options:

1 - Load via u-boot from SD-card
2 - Load via gdb
3 - Load via JLink
4 - Run from SD-card, without u-boot

==========================================

Expand Down Expand Up @@ -143,3 +147,22 @@ Option 3: load with JLink:
3. Load nuttx. Note that JLink expects the .elf extension, the default build output of nuttx is just "nuttx" without the extension, so it must be added to the file...

J-Link>LoadFile <path_to>/nuttx.elf

==========================================

Option 4: Run from SD-card, without u-boot

==========================================

1. Make sure CONFIG_IMX9_BOOTLOADER is set and system is configured properly for bootloader operation:

tools/configure.sh imx93-evk:bootloader

2. The build outputs a file "imx9-sdimage.img". This image also contains the Ahab container. It's required to grant Trusted Resource Domain Controller (TRDC) permissions.
Flash it to an SD-card, where sdX may be sda or something else; verify the block device name properly (eg. /dev/sda, /dev/sdb etc):

sudo dd if=imx9-sdimage.img of=/dev/sdX bs=1k && sync

3. Insert the SD-card into the imx93-evk, make sure BMODE switch is [1,2,3,4] = [Off, On, Off, Off] so that it boots from the SD-card.

This should boot into NuttShell in EL3 level.
41 changes: 41 additions & 0 deletions tools/imx9/Config.mk
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,50 @@
# POSTBUILD -- Perform post build operations

ifeq ($(CONFIG_IMX9_BOOTLOADER),y)
MK_BASE_URL = https://raw.githubusercontent.com/nxp-imx/imx-mkimage/cbb99377cc2bb8f7cf213794c030e1c60423ef1f/src
BASE_PATH = $(TOPDIR)$(DELIM)tools$(DELIM)imx9$(DELIM)
FILE_1 = imx8qxb0.c
FILE_1_PATH = $(BASE_PATH)$(FILE_1)
FILE_2 = mkimage_common.h
FILE_2_PATH = $(BASE_PATH)$(FILE_2)
FILE_3 = mkimage_imx8.c
FILE_3_PATH = $(BASE_PATH)$(FILE_3)
FILE_EXE = $(BASE_PATH)mkimage_imx9
AHAB_BASE_URL = https://www.nxp.com/lgfiles/NMG/MAD/YOCTO
AHAB = firmware-ele-imx-0.1.1
AHAB_BINARY = $(AHAB).bin
AHAB_PATH = $(BASE_PATH)$(AHAB_BINARY)

define DOWNLOAD_FILES
$(call DOWNLOAD,$(MK_BASE_URL),$(FILE_1),$(FILE_1_PATH))
$(call DOWNLOAD,$(MK_BASE_URL),$(FILE_2),$(FILE_2_PATH))
$(call DOWNLOAD,$(MK_BASE_URL),$(FILE_3),$(FILE_3_PATH))
$(call DOWNLOAD,$(AHAB_BASE_URL),$(AHAB_BINARY),$(AHAB_PATH))
$(Q) chmod a+x $(BASE_PATH)$(AHAB_BINARY)
$(Q) (cd $(BASE_PATH) && ./$(AHAB_BINARY) --auto-accept)
endef

ifeq ("$(wildcard $(FILE_EXE))","")
MKIMAGE_NOT_PRESENT = 1
endif

define POSTBUILD
$(Q) echo "Removing sections"
$(Q) $(OBJCOPY) -O binary -R .bss -R .initstack $(BIN) nuttx.bin
$(Q) ([ $$? -eq 0 ] && echo "Done.")

$(Q) echo "Constructing sd image"
$(Q) echo "#define MKIMAGE_COMMIT 0xcbb99377" > $(BASE_PATH)build_info.h

$(if $(MKIMAGE_NOT_PRESENT),$(call DOWNLOAD_FILES))

+$(Q) $(MAKE) -C $(TOPDIR)$(DELIM)tools$(DELIM)imx9 -f Makefile.host
$(Q) tools$(DELIM)imx9$(DELIM)mkimage_imx9$(HOSTEXEEXT) -soc IMX9 -append $(BASE_PATH)$(AHAB)$(DELIM)mx93a1-ahab-container.img -c -ap nuttx.bin a55 0x2049a000 -out flash.bin 1>/dev/null 2>&1
$(Q) dd if=/dev/zero of=imx9-sdimage.img bs=1k count=32 1>/dev/null 2>&1
$(Q) cat flash.bin >> imx9-sdimage.img
$(Q) rm flash.bin
$(Q) echo "imx9-sdimage.img" >> nuttx.manifest
$(Q) echo "Created imx9-sdimage.img"
$(Q) $(MAKE) -C $(TOPDIR)$(DELIM)tools$(DELIM)imx9 -f Makefile.host clean
endef
endif
47 changes: 47 additions & 0 deletions tools/imx9/Makefile.host
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
############################################################################
# tools/imx9/Makefile.host
#
# 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
all: mkimage_imx9
default: mkimage_imx9
.PHONY: clean

# Add CFLAGS=-g on the make command line to build debug versions

CFLAGS = -g -O2 -Wall -std=c99 -static

# mkimage_imx9 - combine and sign a bootloader image for flashing

mkimage_imx9: imx8qxb0.c mkimage_imx8.c
@gcc $(CFLAGS) -o mkimage_imx9 imx8qxb0.c mkimage_imx8.c

clean:
ifneq ($(CONFIG_WINDOWS_NATIVE),y)
$(Q) rm -rf *.dSYM
endif
$(call DELFILE, mkimage_imx9)
$(call DELFILE, mkimage_imx9.exe)
$(call DELFILE, mkimage_imx8.c)
$(call DELFILE, imx8qxb0.c)
$(call DELFILE, mkimage_common.h)
$(call DELFILE, build_info.h)
$(call DELFILE, firmware-ele-imx-0.1.1.bin)
$(call DELDIR, firmware-ele-imx-0.1.1)
$(call CLEAN)

0 comments on commit 4b517db

Please sign in to comment.