Last edited 3 months ago

How to build bootloaders for Android

Applicable for STM32MP25x lines

This article explains how to build the Android™ bootloader binaries for a selected STM32 device. It is intended for Distribution Package users.

This article explains how to rebuild the primary and the secondary bootloaders for the STM32 device families. It is intended for Distribution Package users.

1. Prerequisites[edit | edit source]

The environment must be installed using the Distribution Package adapted to the selected microprocessor device.

To be able to execute following instructions, work from the distribution root directory and initialize the environment with the following instructions:

 source build/envsetup.sh
 lunch aosp_<BoardId>-userdebug
 bspsetup
Info white.png Information
The bspsetup instruction only needs to be run once for each distribution

2. Partition layout[edit | edit source]

The Trusted Firmware (TF-A) is used as the primary bootloader in the OpenSTDroid distribution. The TF-A binary file is part of the fsbl partition.

The Universal Bootloader (U-Boot) is used as the secondary bootloader in the OpenSTDroid distribution. The U-Boot binary file is part of the fip partition.

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

Info white.png Information

For information on the complete partition layout for the corresponding development platform, refer to the corresponding Flash mapping article named Your_development_platform Flash mapping for Android™. Example: STM32 MPU Flash mapping for Android for the STM32MP25 boards.

All Flash mapping for Android™ articles belong to the Category:Flash mapping for Android.

3. Load the bootloader sources[edit | edit source]

By default, the bootloader sources are not part of the OpenSTDroid distribution. To load the sources, execute the following instruction:

 load_bootloader

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

Info white.png Information

The load_bootloader script uses the configuration file android_fsbl.config (resp. android_ssbl.config) available in the device/stm/<STM32Series>-bootloader/source/patch/<fsbl-version>/ (resp. .../<ssbl-version>/) directory.

The bootloader sources are located in:

  • TF-A: device/stm/<STM32Series>-bootloader/tf-a-<STM32Series>
  • U-Boot: device/stm/<STM32Series>-bootloader/u-boot-<STM32Series>
Info white.png Information

As soon as possible, only the archive is loaded from the remote repository (reducing size). This means that you need to configure your environment to ensure that you can download via http from GitHub. If required the remote repository with all the git history can be cloned instead.

For that purpose, BOOTLOADER_ARCHIVE_PATH must be replaced by BOOTLOADER_GIT_PATHin the file android_fsbl.config (resp. android_ssbl.config) . Then execute load_bootloader again with -f option if previously loaded sources have to be replaced.

4. Build the bootloaders[edit | edit source]

To build both the FSBL and the SSBL, run:

 build_bootloader
Warning white.png Warning
The build script is only compatible with x86_64 host machine. The arm64 host machine compatible version will arrive soon.

This instruction generates both the TF-A and the U-Boot for every available board, memory and boot mode in the optee configuration.

To get back more details on available options, run:

 build_bootloader -h

Here after, this the result for the version 1.8:

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

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

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)

  -p / --programmer: build dedicated programmer version (-i option forced)
  -g/--gdb: generate .elf files useful for debug purpose
  -t / --tools: generate fiptool for the HOST machine

Board options: (default = all possibilities)
  -b <name> / --board=<name>: set board name from following list = eval (default: all)
  -m <config> / --mem=<config>: set memory configuration from following list = sd emmc (default: all)

5. Integrate the bootloaders[edit | edit source]

To update prebuilt images add -i option:

 build_bootloader -i

To integrate the updated prebuilt images, execute from the root directory:

 make -j

Then update associated partitions on your device. Refer to How to populate boards for Android