ZYNQ:使用PetaLinux打包 BOOT.BIN、image.ub

说明

个人还是比较喜欢灵活去管理各个部分的源码。

有关文章:
ZYNQ:PetaLinux提取Linux和UBoot配置、源码

编译Linux

取得Linux源代码和配置后,可以在其中执行make,编译Linux。

注意,编译前请导入PetaLinux环境变量:

  • 设置和导出ARCH为arm或者arm64;
  • 设置和导出CROSS_COMPILE,比如aarch64-linux-gnu-。

编译(通过,但是diff 有差异):

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_peta_defconfig
# xilinx_peta_defconfig 是 我们前文拷贝 .config 得来的。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j 2

编译后得到vmlinux

打包 image.ub

kerneldtbrootfs.img打包成image.ub

  • kernel:一般就是linux生成的elf文件。
  • dtb:设备树,与驱动有关。
  • rootfs.img:编译完成的文件系统。

所以,image.ub 没有那么神秘,就是一个包。

使用以下命令:

#!/bin/sh
CROSS_COMPILE=arm-linux-gnueabihf-

${CROSS_COMPILE}-objcopy -O binary -R .note -R .comment -S vmlinux linux.bin

gzip -9 linux.bin

mv -f linux.bin.gz linux.bin

#需要修改 .its
mkimage -f fit-image-petalinux-user-image.its image.ub 

编译 UBoot

取得UBoot源代码和配置后,需要有工具链的环境,编译:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_peta_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j 2

得到u-boot(实际上就是u-boot.elf

打包 BOOT.BIN

1、需要4个文件:u-boot.elfzynq_fsbl.elfbootgen.bifsystem.bit

  • u-boot.elf :就是uboot编译生成的
  • bootgen.bif :可以自己手写。
  • zynq_fsbl.elf :Vivado创建PS以后,在SDK中创建File-New-Application Project-Zynq FSBL以后Build Project生成的。
  • system.bit :FPGA工程师生成的二进制流,用于PL端烧写的(可以没有)

2、修改bif文件,或者自己搞一个。

#cat build/bootgen.bif
//arch = zynq; split = false; format = BIN
the_ROM_image:
{
  [bootloader] /tmp/tmp.SXFL3UZOJ7/zynq_fsbl.elf
  /tmp/tmp.SXFL3UZOJ7/system.bit
  /tmp/tmp.SXFL3UZOJ7/u-boot.elf
}

3、使用下列命令创建BOOT.BIN

bootgen -arch zynq -image bootgen.bif -o BOOT.BIN -w on


$ bootgen -help


****** Xilinx Bootgen v2018.3
  **** Build date : Nov 15 2018-19:22:29
    ** Copyright 1986-2018 Xilinx, Inc. All Rights Reserved.

------------------------------------------------------------------------------+
                       COMMAND LINE OPTIONS                                   |
-------------------------------+----------------------------------------------+
 -arch              [options]  | Xilinx Architecture                          |
                               | options: [zynq, zynqmp, fpga]                |
-------------------------------+----------------------------------------------+
 -image            <filename>  | Input Boot Image File (.bif)                 |
-------------------------------+----------------------------------------------+
 -o                <filename>  | Output filename in MCS/BIN format            |
-------------------------------+----------------------------------------------+
 -w                 [options]  | Overwrite mode                               |
                               | options: [on, off]                           |
-------------------------------+----------------------------------------------+
 -encrypt           [options]  | AES Key storage in chip (Zynq only)          |
                               | options: [bbram, efuse]                      |
-------------------------------+----------------------------------------------+
 -p                  <string>  | Part name                                    |
-------------------------------+----------------------------------------------+
 -efuseppkbits     <filename>  | Generate PPK hash for e-fuse                 |
-------------------------------+----------------------------------------------+
 -generate_hashes              | Generate SHA hashes (PKCS#1v1.5)             |
-------------------------------+----------------------------------------------+
 -spksignature     <filename>  | Generate SPK signature file                  |
-------------------------------+----------------------------------------------+
 -fill             <hex-byte>  | Fill byte for padding                        |
-------------------------------+----------------------------------------------+
 -split             [options]  | Split partitions to diff files               |
                               | options: [bin, mcs]                          |
-------------------------------+----------------------------------------------+
 -padimageheader    [options]  | Pad header tables                            |
                               | options: [0, 1]                              |
-------------------------------+----------------------------------------------+
 -process_bitstream [options]  | Outputs bitstream in bin/mcs format          |
                               | options: [bin, mcs]                          |
-------------------------------+----------------------------------------------+
 -generate_keys     [options]  | Generate authentication keys                 |
                               | options: [pem, rsa, obfuscatedkey]           |
-------------------------------+----------------------------------------------+
 -dual_qspi_mode    [options]  | Generate 2 output files for Dual QSPI        |
                               | options: [parallel, stacked <size>]          |
-------------------------------+----------------------------------------------+
 -log               [options]  | Generate log file                            |
                               | options: [error, warning, info, debug, trace]|
-------------------------------+----------------------------------------------+
 -zynqmpes1                    | Generate boot image for (1.0)ES1             |
-------------------------------+----------------------------------------------|
 -nonbooting                   | Generate an intermediate boot image          |
-------------------------------+----------------------------------------------|
 -encryption_dump              | Generate encryption log file                 |
-------------------------------+----------------------------------------------+
 -h | -help                    | Print the help summary                       |
-------------------------------+----------------------------------------------+
 -bif_help                     | Print the BIF help summary                   |
-------------------------------+----------------------------------------------+
 Note     : For more info on bootgen options, use the command                 |
            bootgen -help <option>                                            |
 Example  : bootgen -help efuseppkbits                                        |
------------------------------------------------------------------------------+

bootgen 打包脚本

#/* @file         package_BOOT.BIN.sh
#*  @brief        打包BOOT.BIN
#*  @author       Schips
#*  @date         2020-10-31 09:04:43
#*  @version      v1.0
#*  @copyright    Copyright By Schips, All Rights Reserved
#*
#**********************************************************
#*
#*  @par 修改日志:
#*  <table>
#*  <tr><th>Date       <th>Version   <th>Author    <th>Description
#*  <tr><td>2020-10-31 <td>1.0       <td>Schips    <td>创建初始版本
#*  </table>
#*
#**********************************************************
#*/

#!/bin/sh

BIF=/tmp/.bif
help () {
    echo "Error : need \$fsbl.elf \$system.bit \$u-boot.elf BOOT.BIN"
    echo "  eg :"
    echo "      $0  fsbl.elf system.bit u-boot.elf BOOT.BIN"
    exit 1
}

if [ -z "$1" ]; then
	help
fi
if [ -z "$2" ]; then
	help
fi
if [ -z "$3" ]; then
	help
fi
if [ -z "$4" ]; then
	help
fi

FSBL=$1
PL_BIT=$2
UBOOT=$3
BOOT_BIN=$4

TMP_FSBL=/tmp/fsbl.elf
TMP_PL_BIT=/tmp/system.bit
TMP_UBOOT=/tmp/u-boot.elf

cp -v $FSBL 	$TMP_FSBL
cp -v $PL_BIT  $TMP_PL_BIT
cp -v $UBOOT   $TMP_UBOOT

require () {
    command -v $1 >/dev/null 2>&1 || { echo >&2 "Aborted : Require \"$1\" but not found."; exit 1;   }
}

# 文件内容追加
append_line_into_file ()
{
    if [[ $# -lt 2 ]]; then
        return
    fi
    FILE=$1
    LINE=$2
    echo $LINE >> $FILE
}

make_bif () {
    rm ${BIF} -rf
    echo "Making BIF for bootgen : \n\n"
    append_line_into_file ${BIF} "//arch = zynq; split = false; format = BIN"
    append_line_into_file ${BIF} "the_ROM_image:"
    append_line_into_file ${BIF} "{"
    append_line_into_file ${BIF} "    [bootloader] $TMP_UBOOT"
    append_line_into_file ${BIF} "    $TMP_PL_BIT"
    append_line_into_file ${BIF} "    $TMP_UBOOT"
    append_line_into_file ${BIF} "}"
    echo "\n\n"
    cat ${BIF}
}

make_boot_bin () {
    echo "Making BOOT.BIN: \n\n"
    bootgen -arch zynq -image $BIF -o $BOOT_BIN -w on
    ls $BOOT_BIN -l
}

require bootgen 
make_bif
make_boot_bin
exit $?

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842056/FPGA+Manager+ZCU102
http://www.uisrc.com/forum.php?mod=viewthread&tid=2334

#cat build/bootgen.bif

the_ROM_image:
{
  [bootloader] /tmp/tmp.SXFL3UZOJ7/zynq_fsbl.elf
  /tmp/tmp.SXFL3UZOJ7/system.bit
  /tmp/tmp.SXFL3UZOJ7/u-boot.elf
}

patelinux-package 打包 BOOT.BIN

使用bootgen好像有问题,总是提示u-boot文件出现问题:

[ERROR]  : Multiple executable program sections in /tmp/u-boot.elf

因此,还是推荐使用这个方法,但是这个方法需要在petalinux工程中进行。

petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga ./images/linux/system.bit --u-boot --force && cp images/linux/BOOT.BIN /tftpboot/BOOT.BIN_for_emmc

编译uboot、Linux

编译uboot、kernel方法很常见,这里介绍我自己使用的方法。

思路:先把通用的配置保存起来,编译uboot、kernel的时候只需要读取配置就可以了

配置

##
#    Copyright By Schips, All Rights Reserved
#
#    File Name:  init.sh
#    Created  :  2020-07-21 09:12:10
#
##
#!/bin/sh

XLNX_SDK_CONFIG=~/.sdk_xlnx_config

cd `dirname $0`
SDKTOP=`cd ../../ && pwd`
TC=${SDKTOP}/toolchain
if [ ! -d "$TC" ]; then
    TC=`cd ${SDKTOP}/../toolchain&& pwd`
fi

add_to_config () {
    echo "$1" >> $XLNX_SDK_CONFIG 
}

echo "Initializing [$XLNX_SDK_CONFIG]"

rm  $XLNX_SDK_CONFIG 2>/dev/null
add_to_config "## For All"
add_to_config "export ARCH=arm"
add_to_config "export ARM_GCC_PATH=${TC}/petalinux_2018.3/gcc-arm-linux-gnueabi/bin"
add_to_config "export BUILD_CORE=4"
add_to_config ""
add_to_config "## app, kernel" 
add_to_config "export APP_CROSS    ?= arm-linux-gnueabihf-" 
add_to_config "export KERNEL_CROSS ?= arm-linux-gnueabihf-"
add_to_config "export KERNEL_CFGDIR ?= arch/arm/configs"
add_to_config "export KERNEL_CONFIG ?= xilinx_zynq7000_peta_defconfig"
add_to_config ""
add_to_config "## Uboot"
add_to_config "export UBOOT_CROSS  ?= arm-linux-gnueabihf-"
add_to_config "export UBOOT_CFGDIR  ?= configs"
add_to_config "#export UBOOT_CROSS?=  arm-none-eabi-"
add_to_config "export UBOOT_CONFIG ?= xilinx_zynq7000_peta_defconfig"

echo "============================="
cat $XLNX_SDK_CONFIG
echo "============================="
echo "Initalized   [$XLNX_SDK_CONFIG]"

uboot

#==============================================
##
#    Copyright By Schips, All Rights Reserved
#
#    File Name:  build_uboot.sh
#    Created  :  2020-07-13 10:49:24
#
##
#!/bin/sh
BASE=`pwd`
XLNX_SDK_CONFIG=~/.sdk_xlnx_config

get_config_from_sdk_config ()
{
    ret=`cat $XLNX_SDK_CONFIG  | grep -v "#" | grep -E '\=|\?\=' | grep "$1" | grep "export" | awk -F= '{print $2}'`
    echo $ret
}

ARM_GCC_PATH=`get_config_from_sdk_config ARM_GCC_PATH`
export PATH=$PATH:$ARM_GCC_PATH

echo "Building [$BASE]"

BUILD_ARCH=`get_config_from_sdk_config ARCH`
BUILD_CROSS=`get_config_from_sdk_config UBOOT_CROSS`
CONFIG=`get_config_from_sdk_config UBOOT_CONFIG`
CORE=`get_config_from_sdk_config BUILD_CORE`

rebuild () {
    make ARCH=${BUILD_ARCH} CROSS_COMPILE=$BUILD_CROSS clean
    make ARCH=${BUILD_ARCH} CROSS_COMPILE=$BUILD_CROSS $CONFIG
    make ARCH=${BUILD_ARCH} CROSS_COMPILE=$BUILD_CROSS -j $CORE
}

rebuild
echo "Built [$BASE]"

kernel

与uboot类似,配置项有一些小差异而已。

##
#    Copyright By Schips, All Rights Reserved
#
#    File Name:  build_kernel.sh
#    Created  :  2020-08-06 14:19:04
#
##
#!/bin/sh
BASE=`pwd`
XLNX_SDK_CONFIG=~/.sdk_xlnx_config
date_time=`date +%0m%0d-%0k:%0M`

get_config_from_sdk_config ()
{
    ret=`cat $XLNX_SDK_CONFIG  | grep -v "#" | grep -E '\=|\?\=' | grep "$1" | grep "export" | awk -F= '{print $2}'`
    echo $ret
}

ARM_GCC_PATH=`get_config_from_sdk_config ARM_GCC_PATH`
export PATH=$PATH:$ARM_GCC_PATH

BUILD_ARCH=`get_config_from_sdk_config ARCH`
BUILD_CROSS=`get_config_from_sdk_config KERNEL_CROSS`
CONFIG=`get_config_from_sdk_config KERNEL_CONFIG`
CORE=`get_config_from_sdk_config BUILD_CORE`
SRCCONFIGDIR=`get_config_from_sdk_config KERNEL_CFGDIR`

help () {
    echo "Use following cmd : "
    echo "     help  : For help"
    echo "   config  : Memuconfig based on present config"
    echo " deconfig  : Reset config as [$CONFIG]"
    echo "    build  : Build based on present config"
    echo "    clean  : Clean object built"
    echo "  rebuild  : Reset config, clean and  build"
    echo "     dtbs  : Build dtbs"
}

if [ -z "$1" ]; then
    help
    exit 1
fi

config() {
    make ARCH=${BUILD_ARCH} CROSS_COMPILE=$BUILD_CROSS menuconfig 

    echo "Do you want to save this config as [${CONFIG}] ?"
    echo "  [yy/n], default [n] in 5 seconds."
    read -t 5 answer

    if [  "$answer" ==  "yy"  ]; then
        echo "Saving .config as default"
        cp -v ${SRCCONFIGDIR}/${CONFIG} .${CONFIG}_backup_${date_time}
        cp -v .config ${SRCCONFIGDIR}/xilinx_zynq7000_peta_defconfig
        echo "Saved .config as default"
    fi
}

deconfig () {
    make ARCH=${BUILD_ARCH} CROSS_COMPILE=$BUILD_CROSS clean
    cp .config .config_backup_${date_time} -v 2>/dev/null
    make ARCH=${BUILD_ARCH} CROSS_COMPILE=$BUILD_CROSS $CONFIG
    echo "Configed with [$CONFIG]"
}

rebuild () {
    make ARCH=${BUILD_ARCH} CROSS_COMPILE=$BUILD_CROSS clean
    make ARCH=${BUILD_ARCH} CROSS_COMPILE=$BUILD_CROSS $CONFIG
    make ARCH=${BUILD_ARCH} CROSS_COMPILE=$BUILD_CROSS -j $CORE
    make ARCH=${BUILD_ARCH} CROSS_COMPILE=$BUILD_CROSS dtbs -j $CORE
}

build () {
    make ARCH=${BUILD_ARCH} CROSS_COMPILE=$BUILD_CROSS -j $CORE
}

dtbs () {
    make ARCH=${BUILD_ARCH} CROSS_COMPILE=$BUILD_CROSS -j $CORE dtbs
}

clean () {
	make ARCH=${BUILD_ARCH} CROSS_COMPILE=$BUILD_CROSS clean
}

command -v $1 >/dev/null 2>&1 || { help && exit 1;  }
echo "Doing [$1]"
$1
echo "Done with [$1]"
posted @   schips  阅读(12868)  评论(2编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示