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.


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=~/imx8mp-var-dart-u-boot
$ mkdir $WORKDIR

Fetch the U-Boot source:

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

Fetch the core-secdev-k3 Security Dev Tool:

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

Fetch ti-k3-image-gen:

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

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=~/imx8mp-var-dart-u-boot

Export variables for building U-Boot

$ export PATH=$HOME//bin:$PATH &&
  export PATH=$HOME//bin:$PATH &&  
  export TI_SECURE_DEV_PKG=$WORKDIR/ && 
  export K3IG_DIR=$WORKDIR/ && 
  export SYSFW_DIR=$WORKDIR//ti-sysfw && 
  export DMFW_DIR=$WORKDIR//ti-dm/am62xx &&
  export UBOOT_DIR=$WORKDIR/ && 
  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/
$ 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/
$ 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  

Build tiboot3-am62x-hs-fs-evm.bin. Saved in $K3IG_DIR. Requires u-boot-spl.bin and ti-fs-firmware-am62x-hs-fs.bin.

$ cd $K3IG_DIR
$ make -j$(nproc) ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- SOC=am62x SOC_TYPE=hs-fs SBL=$UBOOT_DIR/out/r5/spl/u-boot-spl.bin SYSFW_DIR=$SYSFW_DIR


Note:

The AM62 SOC has multiple variants (GP, HS-FS, HS-SE). For more information, see: Device types Early Variscite VAR-SOM-AM62 samples were shipped with the GP variant.

To build U-Boot for the GP variant, replaces 'hs-fs' with 'gp' above.

U-Boot A53 Images

Optional - Modify :

$ cd $WORKDIR/
$ 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/
$ 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- \
     ATF=$TFA_DIR/build/k3/lite/release/bl31.bin \
     TEE=$OPTEE_DIR/out/arm-plat-k3/core/tee-pager_v2.bin \ 
     DM=$DMFW_DIR/ipc_echo_testb_mcu1_0_release_strip.xer5f \
     O=$UBOOT_DIR/out/a53 

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):

$K3IG_DIR/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
7e239550b6cce59e690397fbffd75e9c0b986f57

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 $K3IG_DIR/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 DART-MX8M-PLUS 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 $K3IG_DIR/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 $K3IG_DIR/tiboot3.bin $UBOOT_DIR/out/a53/tispl.bin $UBOOT_DIR/out/a53/u-boot.img root@<ip address>:/mnt/
  • Reboot the DART-MX8M-PLUS and verify the R5 SPL, A53 SPL, and A53 U-Boot match the output of git rev-parse HEAD