In this brief tutorial I will show how to create the FSBL and PMUFW for a Zynq Ultrascale device:
proc generate_fsbl {} { if {[file exists zynqmp_fsbl/executable.elf] != 1} { set fsbl_design [hsi::create_sw_design fsbl_1 -proc psu_cortexa53_0 -app zynqmp_fsbl] common::set_property APP_COMPILER "aarch64-none-elf-gcc" $fsbl_design common::set_property -name APP_COMPILER_FLAGS -value "-DRSA_SUPPORT -DFSBL_DEBUG_INFO -DXPS_BOARD_ZCU111" -objects $fsbl_design hsi::add_library libmetal hsi::generate_app -dir zynqmp_fsbl -compile } return "zynqmp_fsbl/executable.elf" } |
proc generate_pmufw {} { if {[file exists pmu_fw/executable.elf] != 1} { set pmufw_design [hsi::create_sw_design pmu_1 -proc psu_pmu_0 -app zynqmp_pmufw] hsi::add_library libmetal hsi::generate_app -dir pmu_fw -compile return "pmu_fw/executable.elf" } return "pmu_fw/executable.elf" } |
In order to call these procs, the user needs to open the hdf (hsi::open_hw_design):
proc create_apps {hdf} { hsi::open_hw_design $hdf set pmufw [generate_pmufw] set fsbl [generate_fsbl] hsi::close_hw_design [hsi::current_hw_design] } |
proc board_bringup {hdf} { hsi::open_hw_design $hdf set pmufw [generate_pmufw] set fsbl [generate_fsbl] connect #Add the Microblaze PMU to target targets -set -nocase -filter {name =~ "PSU"} mwr 0xFFCA0038 0x1FF # Download PMUFW to PMU target -set -filter {name =~ "MicroBlaze PMU"} dow $pmufw con #Program PL with bitstream set fpga_programmed 0 set bit [glob -nocomplain -directory [pwd] [file rootname $hdf].bit] if {$bit != ""} { fpga -f $bit set fpga_programmed 1 puts "PL is programmed" } targets -set -nocase -filter {name =~ "PSU"} # write bootloop and release A53-0 reset mwr 0xffff0000 0x14000000 mwr 0xFD1A0104 0x380E # Download FSBL to A53 #0 targets -set -filter {name =~ "Cortex-A53 #0"} dow fsbl con after 500 stop } |