說明
個人還是比較喜歡靈活去管理各個部分的源碼。
有關文章:
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
將kernel
、dtb
、rootfs.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.elf
、zynq_fsbl.elf
、bootgen.bif
、system.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]"