How to manually update bootloaders

Revision as of 09:58, 26 July 2019 by Registered User

This page explains how to manually update the U-Boot binaries on an SD Card.

1. Copying a binary to an SD card with the Linux dd command[edit source]

When you have access to the device (with the card reader of a PC, or the UMS command on a target), the 3 first partitions on the SDCard are:

  1. FSBL1
  2. FSBL2
  3. SSBL

See Boot_chains_overview, for the bootloader definitions.

You can use the Linux dd command to copy the FSBL and SSBL directly to the correct partition:

   dd if=<file> of=/dev/<dev> conv=fdatasync

<dev> is:

  • mmcblk<X>p<n> : PC-embedded card reader case
  • sd<X><N> : USB-connected SD card reader case

where <X> is the ID of the device, and <n> the ID of the partition.

Note: the dd option conv=fdatasync is used to force synchronous copying.

2. Trusted boot chain update example[edit source]

The internal card reader is /dev/mmcblk0, partition <n> is /dev/mmcblk0p<n>:

   dd if=tf-a.stm32 of=/dev/mmcblk0p1 conv=fdatasync
   dd if=tf-a.stm32 of=/dev/mmcblk0p2 conv=fdatasync
   dd if=u-boot.stm32 of=/dev/mmcblk0p3 conv=fdatasync

3. Basic boot chain udpate example[edit source]

The USB card reader is /dev/sdb, partition <n> is /dev/sdb<n>

   dd if=u-boot-spl.stm32 of=/dev/sdb1 conv=fdatasync
   dd if=u-boot-spl.stm32 of=/dev/sdb2 conv=fdatasync
   dd if=u-boot.img of=/dev/sdb3 conv=fdatasync

4. update of eMMC[edit source]

The same command dd can be used to update eMMC with UMS command, but the SSBL = TF-A (or SPL) can't be saved directly in the cached boot partitions and the index of other partitions need to be adapted.

For user area , we are using GPT partionning; SSBL is the first user partition in eMMC memory mapping :

 > ums 0 mmc 1
   dd if=u-boot.stm32 of=/dev/sdb1 conv=fdatasync

For boot partition, the user needs to select the targeted partition with the third parameter partition_access of command mmc partconf:

  • 0: user data partition
  • 1: boot partition 1
  • 2: boot partition 2
 >  help mmc 
 ...
 mmc bootbus dev boot_bus_width reset_boot_bus_width boot_mode
- Set the BOOT_BUS_WIDTH field of the specified device
 mmc bootpart-resize <dev> <boot part size MB> <RPMB part size MB>
- Change sizes of boot and RPMB partitions of specified device
 mmc partconf dev [boot_ack boot_partition partition_access]
- Show or change the bits of the PARTITION_CONFIG field of the specified device
 ..
 

For example,

  • dev = 1 (eMMC device on ST Microelectronics board)
  • boot_ack=1 (Boot Acknowledge is needed by ROM code)
  • boot_partition = 1 (Boot partition 1 enabled for boot)
  • partition_access = 0 (No access to boot partition - default)
  • or partition_access = 1 (R/W boot partition 1)

And to copy FSBL with a ums command and come back to the user area, we have:

 > mmc dev 1
 > mmc partconf 1 1 1 1
 > ums 0 mmc 1
   dd if=tf-a.stm32 of=/dev/mmcblk0p1 conv=fdatasync
 > mmc partconf 1 1 1 0