Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Custom_table_size_100

Introduction

Expand
titleStarting with Petalinux Version 2020.1...

, the industry standard "distro boot" boot flow for U-boot has been implemented as default by Xilinx. (see xilinx-wiki.atlassian "Using Distro Boot With Xilinx U-Boot")

The distro boot functionality is implemented as an extension of the existing U-Boot bootcmd functionality in U-Boot. It extends its functionality by redirecting the call to bootcmd to a call to the distro_bootcmd variable.

Code Block
languagebash
themeMidnight
bootcmd=run distro_bootcmd


The distro_bootcmd variable typically contains a sequence of commands that scans a pre-defined list of potential boot targets in search of boot collateral as shown below.

Code Block
languagebash
themeMidnight
scriptaddr=0x3000000
script_offset_f=fc0000
script_size_f=0x40000

boot_targets=qspi jtag mmc0 mmc1 qspi nand nor usb0 usb1 pxe dhcp
distro_bootcmd=for target in ${boot_targets}; do run bootcmd_${target}; done

bootcmd_qspi=sf probe 0 0 0 && sf read ${scriptaddr} ${script_offset_f} ${script_size_f} && echo QSPI: Trying to boot script at ${scriptaddr} && source ${scriptaddr}; echo QSPI: SCRIPT FAILED: continuing...;
bootcmd_mmc0=devnum=0; run mmc_boot
mmc_boot=if mmc dev ${devnum}; then devtype=mmc; run scan_dev_for_boot_part; fi

The boot_targets list is defined in the platform definition in the U-The boot_targets list is defined in the platform definition in the U-Boot source tree.

Depending on the specifics of the target platform, the distro boot infrastructure can either use the boot_targets list to explicitly find specific boot collateral (eg. hard-coded loading once a valid boot target is located) or it can be used to locate some kind of decoupled configuration information.

Boot Method Precedence

The order of precedence for searching for boot components is as follows

  1. extlinux.conf file (located in /extlinux/ or /boot/extlinux/)
  2. boot.scr file + image.ub file
  3. boot.scr file + individual files (Image, system.dtb, etc.)

In absence of a valid extlinux.conf file, U-Boot will scan the boot_targets list looking for a file named boot.scr.uimg or boot.scr (in that order) and run any commands located in the script file. If your environment requires a different sequence of commands or behaviour, you can edit the boot.scr file to suit your needs.

Using the boot.src method

Install u-boot-tools on Linux OS

Before using the mkimage function, the u-boot-tools needs to be installed.

Code Block
languagebash
themeMidnight
sudo apt-get update
sudo apt install u-boot-tools
Modifying an existing

Generate boot.script file from boot.scr file

For the modification of the boot.scr file convert the existing boot.scr file into an boot.script file:

Code Block
languagebash
themeMidnight
dd if=boot.scr of=boot.script bs=72 skip=1

Modifying boot.script file

Modify Than modify the boot.script file based on your needs. For example, when booting image.ub from SD card, USB or QSPI flash, the following boot.script file should work after conversion into an boot.scr file. The boot.scr file could be located on all working boot_targets.

Code Block
language
Code Block
languagebash
themeMidnight
titleexample boot.script file
# This is a boot script for U-Boot
# Generate boot.scr:
# mkimage -c none -A arm -T script -d boot.script boot.scr
#
# Generate boot.script (for modifications in boot.scr):
# dd if=boot.scr of=boot.script bs=72 skip=1
#
################
imageub_addr=0x10000000
# 
imageub_flash_addr=0x200000
imageub_flash_size=0xD90000

echo [TE_BOOT-01] Trenz Boot-file version 1.0 (development);
echo [TE_BOOT-10] Found boot.scr in device: ${target}
echo [TE_BOOT-11] Chosen Bootmode is ${modeboot} from boot_targets=${boot_targets};
echo [TE_BOOT-11] Use RAM Address ${imageub_addr} for linux image;


for boot_target in ${boot_targets};
do

	#echo [TE_BOOT-11] currently trying to load from ${target};
	#echo [TE_BOOT-12] boot_target = ${boot_target};
	#echo [TE_BOOT-13] devtype = ${devtype}; 
	#echo [TE_BOOT-14] devnum = ${devnum}; 
	#echo [TE_BOOT-15] distro_bootpart = ${distro_bootpart}; 
	#echo [TE_BOOT-16] boot_prefixes = ${boot_prefixes}; 
	#echo [TE_BOOT-17] source =  ${prefix}${script};
	
	# Boot target is mmc0 or usb0: image.ub on mmc0 or usb0
	if test "${boot_target}" = "${devtype}0"; then
		if test -e ${devtype} 0:${distro_bootpart} /image.ub; then
			echo [TE_BOOT-20] boot_target is ${boot_target}. Found image.ub on ${devtype}0:${distro_bootpart} ;
			fatload ${devtype} 0:${distro_bootpart} ${imageub_addr} image.ub;
			bootm ${imageub_addr};
		fi
	fi
	# Boot target is mmc1 or usb1: image.ub on mmc1 or usb1
	if test "${boot_target}" = "${devtype}1"; then
		if test -e ${devtype} 1:${distro_bootpart} /image.ub; then
			echo [TE_BOOT-21] boot_target is ${boot_target}. Found image.ub on ${devtype}1:${distro_bootpart};
			fatload ${devtype} 1:${distro_bootpart} ${imageub_addr} image.ub;
			bootm ${imageub_addr};
		fi
	fi
	# Boot target is qspi: image.ub on qspi; image.ub is included in BOOT.bin
	if test "${boot_target}" = "qspi"; then
		echo [TE_BOOT-30] Try to use image.ub from ${boot_target}, load image.ub from qspi-flash address ${imageub_flash_addr}; 
		echo [TE_BOOT-30] max. image.ub size is ${imageub_flash_size} ;
		sf probe 0 0 0;
		sf read ${imageub_addr} ${imageub_flash_addr} ${imageub_flash_size};
		bootm ${imageub_addr};
	fi
done


Info
titleNote

The alias name ${devnum}, used in Xilinx default files, does not work in all variants tested, therefore the ${devtype} boot_targets were split up

Generate boot.scr file from boot.script file

Please remember that the boot.script file needs to be converted back into the boot.scr file after the edits are complete

Code Block
languagebash
themeMidnight
mkimage -c none -A arm -T script -d boot.script boot.scr

Distro Boot in SD-Boot mode

bootcmd_mmc0=devnum=0; run mmc_boot mmc_boot=if mmc dev ${devnum}; then devtype=mmc; run scan_dev_for_boot_part; fi

Variant 2 (Boot.bin on SD card, image.ub and boot.scr on USB):

  1. Copy image.ub on SD-Card.
    • use files from (<project folder>/_binaries_<Article Name>)/boot_linux from generated binary folder,see: Get prebuilt boot binaries
    • or use prebuilt file location, see <design_name>/prebuilt/readme_file_location.txt
  2. Copy boot.scr and Boot.bin on USB Stick
  3. Set Boot Mode to SD-Boot.
    • Depends on Carrier, see carrier TRM.
  4. Insert SD-Card in SD-Slot.
  5. Insert USB-Stick in USB-Slot


Expand
titleTested Boot combinations with example boot script file for TE0715


Scroll Title
title-positiontop
titleTable of possible boot variants in SD-Boot mode


Boot VariantsSD-Card
(mmc0)
USB-Stick (usb0)QSPI-FlashComments
Variant 1

BOOT.

bin^1

bin1

image.ub

boot.scr

Init.sh


--


--

recommended workflow

Variant 2

BOOT.

bin^1

bin1

image.ub

Init.sh


BOOT.
bin^2
bin2used boot.scr from QSPI-Flash and image.ub from SD card
Variant 3

BOOT.

bin^1

bin1

boot.scr

Init.sh


BOOT.
bin^2
bin2used boot.scr from SD card and image.ub from QSPI-Flash
Variant 4

BOOT.

bin^1

bin1

image.ub

Init.sh


BOOT.
bin^3
bin3used boot.scr from QSPI-Flash and image.ub from SD card




Scroll Title
title-positiontop
anchorBOOT.bin in SD-Boot
titlePossible content of BOOT.bin files for qspi flash or sd/usb devices


File nameBOOT.
bin^1
bin1BOOT.
bin^2
bin2BOOT.
bin^3
bin3QSPI Flash
Offset Address
RAM
Load Address
fsbl.elfxxx--NA
test_board.bitxxx--NA
u-boot.elfxxx--NA
image.ub
x
0x2000000x10000000
boot.scr
xx0xfc00000x3000000



Info
titleNote

When booting from a QSPI device, care must be taken to maintain a very specific scheme for where files are located both in the nonvolatile flash device as well as where they are loaded into DDR prior to hand-off to the robust operating system.

Booting from SD card as described in

Variant 1

Copy

(Boot.bin, image.ub

,

and boot.scr on SD card):

  1. Copy image.ub, boot.scr and Boot.bin on SD-Card.
    • use files from (<project folder>/_binaries_<Article Name>)/boot_linux from generated binary folder,see: Get prebuilt boot binaries
    • or use prebuilt file location, see <design_name>/prebuilt/readme_file_location.txt
  2. Set Boot Mode to SD-Boot.
    • Depends on Carrier, see carrier TRM.
  3. Insert SD-Card in SD-Slot.
Code Block
languagebash
themeMidnight
titleexample: u-boot printenv for TE0715


Distro Boot in QSPI-Boot mode

USB-
Expand
titleTested Boot combinations with example boot script file for TE0715


Scroll Title
title-positiontop
titleTable of possible boot variants in QSPI-Boot mode


Boot VariantsSD-Card (mmc0)USB-
SD-Card (mmc0)
Stick (usb0)QSPI-FlashComments
Variant 1

--


BOOT.bin2

zynq_fsbl_flash

Boot only from QSPI flash
Variant 2

image.ub

boot.scr


BOOT.bin1

zynq_fsbl_flash

used boot.scr and image.ub from SD card
Variant 3

BOOT.bin1

image.ub


BOOT.bin3

zynq_fsbl_flash

used boot.scr from QSPI-Flash and image.ub from SD card




Scroll Title
title-positiontop
anchorBOOT.bin in QSPI-Boot
titlePossible content of BOOT.bin files for qspi flash or sd/usb devices


File nameBOOT.bin1BOOT.bin2BOOT.bin3QSPI Flash
Offset Address
RAM
Load Address
fsbl.elfxxx--NA
test_board.bitxxx--NA
u-boot.elfxxx--NA
image.ub
x
0x2000000x10000000
boot.scr
xx0xfc00000x3000000




Info
titleNote

When booting from a QSPI device, care must be taken to maintain a very specific scheme for where files are located both in the nonvolatile flash device as well as where they are loaded into DDR prior to hand-off to the robust operating system.

Booting from SD card as described in Variant 1


Variant 1 (Boot.bin on QSPI Flash and image.ub and boot.scr on SD):

  1. Connect JTAG and power on carrier with module (boot mode set to SD boot and no SD card is inserted)
  2. Open Vivado Project with "vivado_open_existing_project_guimode.cmd" or if not created, create with "vivado_create_project_guimode.cmd"
  3. Type on Vivado TCL Console: TE::pr_program_flash -swapp u-boot
    Note: To program with SDK/Vivado GUI, use special FSBL (zynq_fsbl_flash) on setup
             optional "TE::pr_program_flash -swapp hello_te0715" possible
  4. Copy boot.scr and image.ub on SD-Card
    • use files from (<project folder>/_binaries_<Article Name>)/boot_linux from generated binary folder,see: Get prebuilt boot binaries
    • or use prebuilt file location, see <design_name>/prebuilt/readme_file_location.txt
  5. Set boot mode to QSPI-Boot mode and insert SD card.
    • Depends on Carrier, see carrier TRM.


Variant 2 (Boot.bin

with

, image.ub and boot.scr on QSPI Flash):

  1. Connect JTAG and power on carrier with module (boot mode set to SD boot and no SD card is inserted)
  2. Open Vivado Project with "vivado_open_existing_project_guimode.cmd" or if not created, create with "vivado_create_project_guimode.cmd"
  3. Type on Vivado TCL Console: TE::pr_program_flash -swapp u-boot
    Note: To program with SDK/Vivado GUI, use special FSBL (zynq_fsbl_flash) on setup
             optional "TE::pr_program_flash -swapp hello_te0715" possible
  4. Set boot mode to QSPI-Boot mode and start the board.
    • Depends on Carrier, see carrier TRM.

Note: When booting from a QSPI device, care must be taken to maintain a very specific scheme for where files are located both in the nonvolatile flash device as well as where they are loaded into DDR prior to hand-off to the robust operating system.

ComponentFlash AddressLoad AddressU-Boot combined image file (image.ub)0x200000

0x10000000

Boot.scr0xfc00000x3000000



Code Snippets for Boot.scr file

Expand
titleimage.ub on sd card


Code Block
languagebash
themeMidnight
title
example: u-boot printenv for TE0715
scriptaddr=0x3000000
script_offset_f=fc0000
script_size_f=0x40000
bootcmd_qspi=sf probe 0 0 0 && sf read ${scriptaddr} ${script_offset_f} ${script_size_f} && echo QSPI: Trying to boot script at ${scriptaddr} && source ${scriptaddr}; echo QSPI: SCRIPT FAILED: continuing...;

Code Snippets for Boot.scr file

image.ub on sd card
	# Boot target is mmc0: image.ub on mmc0
	if test "${boot_target}" = "mmc0"; then
		mmc dev 0
		if test -e mmc 0:${distro_bootpart} /image.ub; then
			echo [TE_BOOT-20] boot_target is ${boot_target}. Found image.ub on mmc0:${distro_bootpart} ;
			fatload mmc 0:${distro_bootpart} ${imageub_addr} image.ub;
			bootm ${imageub_addr};
		fi
	fi
	# Boot target is mmc1: image.ub on mmc1
Expand
titleboot.scr and image.ub on sd card
Code Block
languagebash
themeMidnight
titleimage.ub on sd card
	if test "${boot_target}" = "mmc0mmc1"; then
		mmc dev 01
		if test -e ${devtype} 0mmc 1:${distro_bootpart} /image.ub; then
			#fatloadecho [TE_BOOT-21] boot_target is ${devtypeboot_target} 0. Found image.ub on mmc1:${distro_bootpart} ${imageub_addr} image.ub;
			fatload mmc 0;
			fatload mmc 1:${distro_bootpart} ${imageub_addr} image.ub;
			bootm ${imageub_addr};
		fi
	fi
	if test "${boot_target}" = "mmc1"; then
		mmc dev 1
		if test -e ${devtype} 1:${distro_bootpart} /image.ub; then
			#fatload ${devtype} 0:${distro_bootpart} ${imageub_addr} image.ub;
			fatload mmc 1:${distro_bootpart} ${imageub_addr} image.ub;
			bootm ${imageub_addr};
		fi
	fi


Info
titleNote

The alias name ${devnum}, used in Xilinx default files, does not work in all variants tested, therefore the ${devtype} boot_targets were split up



Expand
titleimage.ub on sd card or usb


Code Block
languagebash
themeMidnight
titleimage.ub on sd card
	# Boot target is mmc0 or usb0: image.ub on mmc0 or usb0
	if test "${boot_target}" = "${devtype}0"; then
		if test -e ${devtype} 0:${distro_bootpart} /image.ub; then
			echo [TE_BOOT-20] boot_target is ${boot_target}. Found image.ub on ${devtype}
Expand
titleboot.scr and image.ub on sd card or usb
Code Block
languagebash
themeMidnight
titleimage.ub on sd card
	if test "${boot_target}" = "mmc0"; then
		mmc dev 0
		if test -e ${devtype} 0:${distro_bootpart} /image.ub; then
			#fatloadfatload ${devtype} 0:${distro_bootpart} ${imageub_addr} image.ub;
			fatload mmc 0:${distro_bootpart} ${imageub_addr} image.ub;
			bootm ${imageub_addr};
		fi
	fi
	if# testBoot "${boot_targettarget is mmc1 or usb1: image.ub on mmc1 or usb1
	if test "${boot_target}" = "mmc1${devtype}1"; then
		mmc dev 1
		if test -e ${devtype} 1:${distro_bootpart} /image.ub; then
			#fatloadecho [TE_BOOT-21] boot_target is ${devtypeboot_target} 0. Found image.ub on ${devtype}1:${distro_bootpart} ${imageub_addr} image.ub;
			fatload mmc${devtype} 1:${distro_bootpart} ${imageub_addr} image.ub;
			bootm ${imageub_addr};
		fi
	fi


Expandinfo
titleboot.scr and image.ub on sd card

Image Removed

Expand
titleboot.scr and image.ub on usb0

Image Removed

Note

The alias name ${devnum}, used in Xilinx default files, does not work in all variants tested, therefore the ${devtype} boot_targets were split up



Expand
title
Expand
titleboot.scr and image.ub on usb0


Code Block
languagebash
themeMidnight
titleimage.ub on usb0
	if test "${boot_target}" = "usb0"; then
		echo [TE_BOOT-40] Try to use: image.ub from ${boot_target};
		usb start
		#fatload ${devtype} 0:${distro_bootpart} ${imageub_addr} image.ub;
		fatload usb 0:1 ${imageub_addr} image.ub;
		bootm ${imageub_addr};
	fi

boot.scr and image.ub on mmc0

usb0
	# image.ub on usb0
	if test "${boot_target}" = "usb0"; then
		if test -e usb 0:${distro_bootpart} /image.ub
Code Block
languagebash
themeMidnight
titleexample boot.script file
# This is a boot script for U-Boot # Generate boot.scr: # mkimage -c none -A arm -T script -d boot.script boot.scr # ################ imageub_addr=0x10000000 # imageub_flash_addr=0x200000 imageub_flash_size=0xD90000 echo [TE_BOOT-01] Trenz Boot-file version 0.1 (development); echo [TE_BOOT-10] Chosen Bootmode is ${modeboot} from boot_targets=${boot_targets}; echo [TE_BOOT-11] Found boot.scr in device: ${target} for boot_target in ${boot_targets}; do # Boot target is sd card: image.ub on mmc0 if test "${boot_target}" = "mmc0"
; then
			echo [TE_BOOT-20] 
Try to use: image.ub from
boot_target is ${boot_target}
; mmc dev 0 if test -e ${devtype} 0
. Found image.ub on usb0:${distro_bootpart} 
/image.ub
;
then

			fatload 
${devtype}
usb 0:${distro_bootpart} ${imageub_addr} image.ub;
			bootm ${imageub_addr};
		fi
	fi
	# image.ub on usb1
	if test "${boot_target}" = "
mmc1
usb1"; then
		
echo [TE_BOOT-21] Try to use:
if test -e usb 1:${distro_bootpart} /image.ub
from ${boot_target};
; then
		
mmc dev 1 if test -e ${devtype} 1
	echo [TE_BOOT-21] boot_target is ${boot_target}. Found image.ub on usb1:${distro_bootpart}
/image.ub
;
then

			fatload 
${devtype}
usb 1:${distro_bootpart} ${imageub_addr} image.ub;
			bootm ${imageub_addr};
		fi
fi

	fi	



Expand
titleimage.ub on qspi flash


Code Block
languagebash
themeMidnight
titleimage.ub on usb0
	# Boot target is qspi: image.ub on qspi; image.ub is included in BOOT.bin
	if test "${boot_target}" = "qspi"; then
		echo [TE_BOOT-30] Try to use
:
 image.ub from ${boot_target}, load image.ub from qspi-flash address ${imageub_flash_addr}; 
		echo [TE_BOOT-30] max. image.ub size is ${imageub_flash_size} ;
		sf probe 0 0 0;
		sf read ${imageub_addr} ${imageub_flash_addr} ${imageub_flash_size};
		bootm ${imageub_addr};
	fi
done


References

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/749142017/Using+Distro+Boot+With+Xilinx+U-Boot#UsingDistroBootWithXilinxU-Boot-BootTargets

https://wiki.ubuntu.com/ARM/EditBootscr











Custom_fix_page_content

Table of Contents