zoukankan      html  css  js  c++  java
  • 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、需要3个文件:u-boot.elfzynq_fsbl.elfbootgen.bif

    • u-boot.elf:就是uboot编译生成的
    • bootgen.bif:可以自己手写。
    • zynq_fsbl.elf:Vivado创建PS以后,在SDK中创建File-New-Application Project-Zynq FSBL以后Build Project生成的。

    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                                        |
    ------------------------------------------------------------------------------+
    

    编译脚本

    编译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]"
    
  • 相关阅读:
    Hackers' Crackdown UVA
    Sequence II HDU
    To the moon HDU
    Dynamic Rankings ZOJ
    google vimium插件的一些简单命令
    关于datatable转换datatime类型的问题
    服务器无法播放flv格式的视频解决办法
    DTCMS 新建下拉列表控件
    ajax 返回数据 无法得到其属性的解决办法
    关于IIS中WEB网站访问弹“验证输入框”及“401限制访问”的解决办法
  • 原文地址:https://www.cnblogs.com/schips/p/xilinx-petalinux-package-boot_bin_and_image_ub.html
Copyright © 2011-2022 走看看