文章目录
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工程
- 进入“Subsystem AUTO Hardware Settings”菜单下,配置调试串口为ps7_uart_0。
- 进入“Advanced bootable images storage Settings”菜单中,进入“dtb image settings”选项并将 image storage media 设置为 primary sd,然后返回最初的配置界面。
- 进入到“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 文件路径
- 编译uboot:
petalinux-build -c u-boot
二、1. 输入
hsi
进入到hsi命令模式
- 执行下面命令得到新的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 设备树文件存放路径
- 执行
exit
退出hsi。
3.编译kernel
添加设备树文件
-
将生成的设备树文件pcw.dtsi、pl.dtsi、system-top.dts 以及 zynq-7000.dtsi直接拷贝到内核源码目录下的 arch/arm/boot/dts 目录中。
-
修改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>;
};
};
};
- 修改 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工程目录下
配置根文件系统免密登录:
petalinux-config -c rootfs
- 进入“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 目录下)
-
执行
sudo tar -xzf rootfs.tar.gz -C /media/zr/rootfs
,该路径为SD启动卡对应的 EXT4 分区的挂载点。 -
执行
sync
,将数据同步到SD卡中。 -
执行
umount /dev/sdb*
,卸载SD启动卡。
启动开发板
设置ZYNQ的启动模式为SD卡启动:
- 在 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
- 执行
saveenv
,保存环境变量到QSPI flash,这样下次就不用再设置了。 - 执行
boot
,启动内核。
6.tcl脚本
把命令添加进去一块执行
- 创建一个.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 设备树文件存放路径
- 执行tcl脚本:
xsct xx.tcl