How to build bootloaders for Android

Revision as of 13:00, 8 August 2019 by Registered User


1. Article purpose[edit source]

This article is intended for Distribution Package users (see Which Package better suits your needs for more information).

The Trusted Firmware (TF-A) is used as the primary bootloader in the STM32MPU distribution for Android™.

The TF-A binary file is part of the fsbl partition.

The Universal Bootloader (U-Boot) is used as the secondary bootloader in the STM32MPU distribution for Android™. The U-Boot binary file is part of the ssbl partition.

The STM32MPU distribution for Android™ includes prebuilt bootloader binaries used to generate the partition images (fsbl and ssbl).

The binaries are available in device/stm/<SocId>-bootloader/prebuilt.

This page explains how to rebuild the primary and/or the secondary bootloaders if needed.


2. Prerequisites[edit source]

The environment must be installed using the Distribution Package adapted to your selected microprocessor device. See the list of Android distribution Packages STM32MP1 Distribution Package for Android.


To be able to execute following instructions you need to work from your distribution root directory STM32MP1 Distribution Package for Android, initialise your environment and then run lunch:

 source build/envsetup.sh
 lunch aosp-<BoardId>-userdebug.


3. Loading the bootloader source[edit source]

By default, the bootloader sources are not part of the STM32MPU distribution for Android. To load the sources, execute the following command:

 load_bootloader

It will load both the TF-A and U-Boot sources.

Info white.png Information

The load_bootloader script uses the configuration files available in the device/stm/<SocId>-bootloader/source/patch/<fsbl-xxx>

The bootloader sources can then be found at:

  • TF-A: device/stm/<SocId>-bootloader/tf-a-<SocId>
  • U-Boot: device/stm/<SocId>-bootloader/u-boot-<SocId>


4. Building the bootloaders[edit source]

To build both the FSBL and the SSBL, run:

 build_bootloader
Usage: build_bootloader [Options] [Mode options] [Board options]

  This script allows building the bootloaders source (TF-A and/or U-Boot)

{{ReviewsComments| N. Louboutin: it's only TF-A and U-Boot here, no possibility to build only one}}
{{ReviewsComments| N. Louboutin: add explanation of default build configiguration (all boards (eval and disco), all kind of memory (sd or emmc), all kind of boot mode (optee or trusted) }}

Options:
  -h/--help: print this message
  -v/--version: get script version
  -i/--install: update prebuilt images
  --verbose <level>: enable verbosity (1 or 2 depending on level of verbosity required)

Mode options (exclusive, default = both optee and trusted):
  -o/--optee: set optee mode for bootloaders
  or
  -t/--trusted: set trusted mode for bootloaders (non op-tee option)
  or
  -p/--programmer: build dedicated programmer version (-i option is mandatory)

Board options: (exclusive, default = all possibilities)
  -c/--current: build only for current configuration (board and memory)
  or
  -b/--board <name>: set board name = eval or disco (default: all)
  -m/--mem <name>: set memory configuration = sd or emmc (default: all), ignored if board = disco

5. Generating distribution without the prebuilt bootloaders[edit source]


In order to compile and generate a distribution image with your custom bootloader(s) built-in, you need to change the device/stm/<SocId>/BoardConfigCommon.mk file and comment those lines:

TARGET_PREBUILT_PBL #FSBL, TF-A
TARGET_PREBUILT_SBL #SSBL, U-boot

Then you need to rebuild distribution:

 make -j

6. Replacing prebuilt bootloader images[edit source]

Once you have compiled your new bootloader and your changes are validated, you can generate prebuilt images and easily integrate them by doing:

 build_bootloader -i