另一种方式编译ZYNQ镜像

1.创建Petalinux工程,生成BOOT.BIN

编写 linux 驱动的时候,经常改动的要素有设备树文件、linux 内核、根文件系统、bit文件,将这些要素独立出来会方便修改。下面步骤是将 bit 文件从原先的 BOOT.BIN 文件独立出来,将 image.ub 文件分开为内核 zImage 和设备树 dtb,并将根文件系统放到 SD 卡的 EXT4 分区

创建Petalinux工程

source /opt/pkg/petalinux/2018.3/settings.sh //设置 petalinux 工作环境
petalinux-create -t project --template zynq -n project //创建 Petalinux 工程
cd project //进入到 petalinux 工程目录下
petalinux-config --get-hw-description ../hdf/xx.sdk/ //导入 hdf 文件

配置Petalinux工程

  1. 进入“Subsystem AUTO Hardware Settings”菜单下,配置调试串口为ps7_uart_0。

在这里插入图片描述

  1. 进入“Advanced bootable images storage Settings”菜单中,进入“dtb image settings”选项并将 image storage media 设置为 primary sd,然后返回最初的配置界面。
  2. 进入到“Image Packaging Configuration”菜单下的“Root filesystem type (INITRAMFS)”子菜单下,选择“SD card”,按键盘上的“Enter”键返回,保存并退出。

生成BOOT.BIN

编译 fsbl 和 uboot,生成 BOOT.BIN 文件。此时BOOT.BIN 文件仅包含 zynq_fsbl.elf 和 u-boot.elf 文件,而没有包含bit文件。

petalinux-build -c bootloader
petalinux-build -c u-boot
petalinux-package --boot --fsbl --u-boot --force

2.生成设备树文件

编译uboot后,会在工程的components/plnx_workspace/device-tree/device-tree/目录下生成设备树相关文件,红圈中的是需要用到的设备树文件,skeleton.dtsi一般不用。

在这里插入图片描述

重新生成设备树文件:

如果更改vivado工程,BOOT.BIN文件不需要变动,但需要重新生成设备树文件。

一、1.重新导入hdf:petalinux-config --get-hw-description hdf 文件路径

  1. 编译uboot:petalinux-build -c u-boot

二、1. 输入hsi进入到hsi命令模式

  1. 执行下面命令得到新的Vivado工程的设备树文件(device-tree-xlnx-xilinx-v2018.3是下载的设备树):
open_hw_design /xxx/xxxx/.../hdf/xx.sdk/xx.hdf
set_repo_path  /xxx/xxxx/.../device-tree-xlnx-xilinx-v2018.3
create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0
generate_target -dir 设备树文件存放路径
  1. 执行exit退出hsi。

3.编译kernel

添加设备树文件

  1. 将生成的设备树文件pcw.dtsi、pl.dtsi、system-top.dts 以及 zynq-7000.dtsi直接拷贝到内核源码目录下的 arch/arm/boot/dts 目录中。

  2. 修改system-top.dts文件:主要修改了 bootargs 属性、添加了 model 属性、网口 0 的 MAC 地址以及给 qspi 进行了分区操作。

/* 
 * CAUTION: This file is automatically generated by Xilinx. 
 * Version: HSI 
 * Today is: Mon Mar 16 02:51:23 2020 
 */ 
 
 
 /dts-v1/; 
 #include "zynq-7000.dtsi" 
 #include "pl.dtsi" 
 #include "pcw.dtsi" 
 / { 
 model = "Alientek ZYNQ Development Board"; 
 
 chosen { 
 bootargs = "console=ttyPS0,115200 earlyprintk   root=/dev/mmcblk0p2 rw rootwait"; 
 stdout-path = "serial0:115200n8"; 
 }; 
 aliases { 
 ethernet0 = &gem0; 
 i2c0 = &i2c2; 
 i2c1 = &i2c0; 
 i2c2 = &i2c1; 
 serial0 = &uart0; 
 serial1 = &uart1; 
 spi0 = &qspi; 
 }; 
 memory { 
 device_type = "memory"; 
 reg = <0x0 0x20000000>; 
 }; 
 }; 
 
 &gem0 {
 local-mac-address = [00 0a 35 00 1e 53]; 
 }; 
  
 &qspi { 
 #address-cells = <1>; 
 #size-cells = <0>; 
 flash0: flash@0 { 
 compatible = "n25q512a","micron,m25p80"; 
 reg = <0x0>; 
 #address-cells = <1>; 
 #size-cells = <1>; 
 spi-max-frequency = <50000000>; 
 partition@0x00000000 { 
 label = "boot"; 
 reg = <0x00000000 0x00500000>; 
 }; 
 partition@0x00500000 { 
 label = "bootenv"; 
 reg = <0x00500000 0x00020000>; 
 }; 
 partition@0x00520000 { 
 label = "kernel"; 
 reg = <0x00520000 0x00a80000>; 
 }; 
 partition@0x00fa0000 { 
 label = "spare"; 
 reg = <0x00fa0000 0x00000000>; 
 }; 
 }; 
 }; 
  1. 修改 arch/arm/boot/dts 目录下的 Makefile 文件, 将设备树添加上去:

defconfig配置

内核源码目录下执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig

不要漏掉空格!

在这里插入图片描述

menuconfig 配置

需要时再配,先默认。

编译内核源码

(此步骤需要先配置一下环境变量:sptl

输入make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j10

编译完成之后会在 arch/arm/boot/目录下生成一个名为 zImage 的内核镜像文件。

在这里插入图片描述

编译设备树

输入make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- system-top.dtb -j10

编译成功后会在 arch/arm/boot/dts 目录下生成 system-top.dtb 文件。

在这里插入图片描述

4.编译rootfs

进入到petalinux工程目录下

配置根文件系统免密登录:

  1. petalinux-config -c rootfs
  2. 进入“Image Features —>”菜单下,使能“debug-tweaks”

编译根文件系统:petalinux-build -c rootfs

编译完成后产生的根文件系统压缩包rootfs.tar.bz2、rootfs.tar.gz在工程目录下的images/linux 目录下。

5.启动开发板

制作SD启动卡

格式化为两个分区:FAT32和EXT4
参考:petalinux设计流程

拷贝镜像到FAT分区

包括 zImage(内核镜像,内核源码目录 arch/arm/boot/zImage)、system-top.dtb(内核设备树 dtb 文件,内核源码目录 arch/arm/boot/dts/system-top.dtb)、system.bit(pl 端 bitstream 文件,Petalinux 工程目录下的 images/linux/system.bit)。

然后将 BOOT.BIN 文件(petalinux工程目录下的images/linux/BOOT.BIN)拷贝到 FAT 分区

将根文件系统解压到 EXT4 分区

进入到 rootfs.tar.gz 压缩包文件所在目录(工程目录下的images/linux 目录下)

  1. 执行sudo tar -xzf rootfs.tar.gz -C /media/zr/rootfs ,该路径为SD启动卡对应的 EXT4 分区的挂载点。

  2. 执行sync,将数据同步到SD卡中。

  3. 执行umount /dev/sdb*,卸载SD启动卡。

启动开发板

设置ZYNQ的启动模式为SD卡启动:

在这里插入图片描述

  1. 在 U-Boot 启动 2 秒倒计时之前,按回车或者是空格键停止启动,进入到 U-Boot 的命令行模式,设置环境变量。
env default -a 
setenv bitstream_load_address 0x100000 
setenv bitstream_image system.bit 
setenv bitstream_size 0x300000 
setenv kernel_img zImage 
setenv dtbnetstart 0x2000000 
setenv netstart 0x2080000 
 
setenv default_bootcmd 'if mmcinfo; then run uenvboot; echo Copying Linux from SD to RAM... && 
load mmc 0 ${bitstream_load_address} ${bitstream_image} && 
fpga loadb 0 ${bitstream_load_address} ${bitstream_size} && 
run cp_kernel2ram && run cp_dtb2ram && bootz ${netstart} - ${dtbnetstart}; fi' 

U-Boot 启动内核或在命令行下执行 boot 命令时其实就是去执行 bootcmd,bootcmd 的内容其实就是运行 default_bootcmd
在这里插入图片描述

  1. 执行saveenv,保存环境变量到QSPI flash,这样下次就不用再设置了。
  2. 执行boot,启动内核。

6.tcl脚本

把命令添加进去一块执行

  1. 创建一个.tcl文件,将前面提到的命令写入
# tcl script test 
  
hsi::open_hw_design /home/zynq/hdf/xx.sdk/xx.hdf 
hsi::set_repo_path /home/device_tree_library/device-tree-xlnx-xilinx-v2018.3 
hsi::create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0 
hsi::generate_target -dir 设备树文件存放路径 
  1. 执行tcl脚本:xsct xx.tcl
  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hi小瑞同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值