Yocto Build U-Boot TI

From Variscite Wiki
Yocto Build U-Boot from source code

Introduction

This guide walks through the process for manually building and installing the U-Boot images from source. It is derived from TI's Build U-Boot guide

Installing required packages

Install the required packages documented in the Build Yocto from source code guide.

Building U-boot requires Python 3.10 or newer, which is shipped with Ubuntu 22.04.

In addition to Python 3.10, the following python3 modules are required for binman:

$ pip3 install jsonschema pyelftools

Fetch source code and install dependencies

This section describes the one time process to install the toolchains and fetch the necessary source code for building U-Boot.

Install Toolchains to home directory

$ cd ~
$ wget  && \
   tar -Jxvf  -C $HOME && \
   wget  && \
   tar -Jxvf  -C $HOME

Fetch Source Code

Setup a working directory

$ export WORKDIR=~/imx93-var-som-u-boot
$ mkdir $WORKDIR

Fetch the U-Boot source:

$ cd $WORKDIR
$ git clone https://github.com/varigit/uboot-imx -b lf_v2022.04_var03 uboot-imx

Fetch ti-linux-firmware:

$ cd $WORKDIR
$ git clone  -b  
$ cd  && \
  git checkout  && \
  cd ../

Fetch arm-trusted-firmware:

$ cd $WORKDIR
$ git clone  -b  
$ cd  && \
  git checkout  && \
  cd ../

Fetch optee-os:

$ cd $WORKDIR
$ git clone  -b  
$ cd  && \
  git checkout  && \
  cd ../

Build U-Boot out of Yocto tree

After fetching the source code and installing dependencies, you may return to $WORKDIR anytime and follow these steps to build U-Boot:

Setup the environment

Export the working directory

$ export WORKDIR=~/imx93-var-som-u-boot

Export variables for building U-Boot

$ export PATH=$HOME//bin:$PATH &&
  export PATH=$HOME//bin:$PATH &&  
  export TI_LINUX_FW_DIR=$WORKDIR/ &&
  export UBOOT_DIR=$WORKDIR/uboot-imx && 
  export TFA_DIR=$WORKDIR/ && 
  export OPTEE_DIR=$WORKDIR/

Build Images

ATF

$ cd $TFA_DIR
$ make -j$(nproc) ARCH=aarch64 CROSS_COMPILE=aarch64-none-linux-gnu- PLAT=k3 TARGET_BOARD=lite SPD=opteed

OP-TEE

$ cd $OPTEE_DIR
$ make -j$(nproc) CROSS_COMPILE64=aarch64-none-linux-gnu- CROSS_COMPILE32=arm-none-linux-gnueabihf- PLATFORM=k3-am62x CFG_ARM64_core=y CFG_TEE_CORE_LOG_LEVEL=1

U-Boot R5 Images

Optional - Modify :

$ cd $WORKDIR/uboot-imx
$ make -j$(nproc) ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf-  O=$UBOOT_DIR/out/r5
$ make -j$(nproc) ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- O=$UBOOT_DIR/out/r5 menuconfig
... make and save some changes ... 
$ make -j$(nproc) ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- O=$UBOOT_DIR/out/r5 savedefconfig
$ cp out/r5/defconfig configs/

Build u-boot-spl.bin for tiboot3.bin. Saved in $UBOOT_DIR/out/r5:

$ cd $WORKDIR/uboot-imx
$ make -j$(nproc) ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf-  O=$UBOOT_DIR/out/r5
$ make -j$(nproc) ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- O=$UBOOT_DIR/out/r5 BINMAN_INDIRS=$TI_LINUX_FW_DIR
Note:

The AM62P SOC has multiple variants (HS-FS, HS-SE). For more information, see: Device types

U-Boot A53 Images

Optional - Modify :

$ cd $WORKDIR/uboot-imx
$ make -j$(nproc) ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu-  O=$UBOOT_DIR/out/a53
$ make -j$(nproc) ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu- O=$UBOOT_DIR/out/a53 menuconfig
 ... make and save some changes ... 
$ make -j$(nproc) ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu- O=$UBOOT_DIR/out/a53 savedefconfig
$ cp out/a53/defconfig configs/

Build tispl.bin and u-boot.img. Saved in $UBOOT_DIR/out/a53. Requires bl31.bin, tee-pager_v2.bin, and ipc_echo_testb_mcu1_0_release_strip.xer5f.

$ cd $WORKDIR/uboot-imx
$ make -j$(nproc) ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu-  O=$UBOOT_DIR/out/a53
$ make -j$(nproc) ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu- \
     BL31=$TFA_DIR/build/k3/lite/release/bl31.bin \
     TEE=$OPTEE_DIR/out/arm-plat-k3/core/tee-pager_v2.bin \
     O=$UBOOT_DIR/out/a53 BINMAN_INDIRS=$TI_LINUX_FW_DIR

Update U-Boot on running system

To update U-Boot on an existing system, the following SPL and U-Boot images need to be installed to the boot partition of the boot media (eMMC or SD):

$UBOOT_DIR/out/r5/tiboot3.bin
$UBOOT_DIR/out/a53/tispl.bin
$UBOOT_DIR/out/a53/u-boot.img

After updating the boot media, boot U-Boot and verify the commit ids of the R5 SPL, A53 SPL, and A53 U-Boot match the output of git rev-parse HEAD. For example:

$ cd $UBOOT_DIR && git rev-parse HEAD
11d2b714ce07d42614c562b3b2444a594a120650

Verify this matches the versions printed by U-Boot:

U-Boot SPL -g (Mar 23 2023 - 22:04:15 +0000)    <--- R5
U-Boot SPL -g (Mar 23 2023 - 22:04:15 +0000)    <--- A53
U-Boot -g (Mar 24 2023 - 16:25:35 -0500)        <--- A53

Update U-Boot on an SD Card

To update U-Boot on an SD Card, copy the files to the sd card.

  • Mount the SD card boot partition on your host computer and verify the previous U-Boot files are installed:
$ mkdir ~/.sdcard
$ sudo mount /dev/sdX ~/.sdcard
$ ls ~/.sdcard
tiboot3.bin  tispl.bin  u-boot.img  uEnv.txt
  • Copy the new files and umount the SD card:
$ sudo cp $UBOOT_DIR/out/r5/tiboot3.bin $UBOOT_DIR/out/a53/tispl.bin $UBOOT_DIR/out/a53/u-boot.img ~/.sdcard
$ sudo umount ~/.sdcard && sync
  • Boot the SD card and verify the R5 SPL, A53 SPL, and A53 U-Boot match the output of git rev-parse HEAD

Update U-Boot using UMS

U-Boot can be updated by using the USB Mass Storage gadget to mount the eMMC or SD card on your host computer.

  • Connect the USB OTG port to host computer.
  • Start the VAR-SOM-MX93 and interrupt U-Boot
  • Start UMS on eMMC:
u-boot> ums 0 mmc 1
  • Or...start UMS on SD card:
u-boot> ums 0 mmc 2
  • Or...start UMS on the current boot device:
u-boot> ums 0 mmc $mmcdev
  • Mount the SD card boot partition and verify the previous U-Boot files are installed:
$ mkdir ~/.sdcard
$ sudo mount /dev/sdX ~/.sdcard
$ ls ~/.sdcard
tiboot3.bin  tispl.bin  u-boot.img  uEnv.txt
  • Copy the new files and umount the SD card:
$ sudo cp $UBOOT_DIR/out/r5/tiboot3.bin $UBOOT_DIR/out/a53/tispl.bin $UBOOT_DIR/out/a53/u-boot.img ~/.sdcard
$ sudo umount ~/.sdcard && sync
  • Boot the SD card and verify the R5 SPL, A53 SPL, and A53 U-Boot match the output of git rev-parse HEAD

Update U-Boot using Ethernet

U-Boot can be updated on a running system by using scp to transfer the files:

  • Mount the eMMC boot partition and verify the previous U-Boot files are installed:
# mount /dev/mmcblk0p1 /mnt/
# ls /mnt
tiboot3.bin  tispl.bin  u-boot.img  uEnv.txt
  • Transfer the new files:
$ scp $UBOOT_DIR/out/r5/tiboot3.bin $UBOOT_DIR/out/a53/tispl.bin $UBOOT_DIR/out/a53/u-boot.img root@<ip address>:/mnt/
  • Reboot the VAR-SOM-MX93 and verify the R5 SPL, A53 SPL, and A53 U-Boot match the output of git rev-parse HEAD