1. 设备树生成
将 前 面 生 成 的 设 备 树 文 件 ( 笔 者 这 里 生 成 的 设 备 树 文 件 在Petalinux 工 程 的components/plnx_workspace/device-tree/device-tree/ 目 录 下 ) pcw.dtsi 、 pl.dtsi 、system-top.dts 以 及 zynq-7000.dtsi 四 个 文 件 直 接 拷 贝 到 内 核 源 码 目 录 下 的arch/arm/boot/dts 目录中。如图所示:
在该Petalinux 工程下使用“petalinux-config --get-hw-description hdf 文件路径”命令即可。 hdf 文件导入成功之后会自动弹出 petalinux 工程配置窗口,进入“Subsystem AUTO Hardware Settings”菜单下,首先按照配置调试串口,配置完成后,进入“Advanced bootable images storage Settings”菜单中,移动到“dtb image settings”选项,进入“dtb image settings”选项并将 image storage media 设置为 primary sd,如下图所示:
配置完成后,返回到最初的配置界面,进入到“Image Packaging Configuration”菜单下的“Root filesystem type (INITRAMFS)”子菜单下,选择EXT模式。
配置完成后,编译 fsbl 和 uboot,及生成 BOOT.BIN 文件,命令如下:
petalinux-build -c bootloader
petalinux-build -c u-boot
petalinux-package --boot --fsbl --u-boot --force
在 Petalinux 工 程 中 执 行 编 译 uboot 后 , 会 在 工 程compo-nents/plnx_workspace/device-tree/device-tree/目录下生成设备树文件。将 生 成 的 设 备 树 文 件 ( 笔 者 这 里 生 成 的 设 备 树 文 件 在 Petalinux 工程的 components/plnx_workspace/device-tree/device-tree/ 目 录 下 ) pcw.dtsi 、 pl.dtsi 、 system-top.dts 以 及 zynq-7000.dtsi 四 个 文 件 直 接 拷 贝 到 内 核 源 码 目 录 下 的
arch/arm/boot/dts 目录中。
接下来我们需要对system-top.dts文件进行一个简单地修改,打开system-top.dts文件,修改之前内容如下:
修改完成之后,我们还需要修改 arch/arm/boot/dts 目录下的 Makefile 文件,将设备树添加上去,如下:
在内核源码目录下执行下面这条命令对内核进行 defconfig 配置:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig
执行下面这条命令编译内核源码
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j10
编译完成之后会在 arch/arm/boot/目录下生成一个名为 zImage 的内核镜像文件,后面我们在用。
2. 编译设备树
在内核里边我们需要单独编译出设备树的 dtb 文件,前面已经将我们所需要的设备树文件拷贝到内核的 arch/arm/boot/dts 目录下了,接下来执行下面这条命令编译 system-top.dtb文件:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- system-top.dtb -j10
3. 生成ROOTFS
根文件系统我们直接使用 petalinux 进行编译即可。进入到 Petalinux 工程目录下,为了免去后面每次启动 linux 都要手动输入密码进入系统,所以我们先配置根文件系统免密码登录,进入根文件系统配置界面的命令如下
petalinux-config -c rootfs
进入“Image Features --->”菜单下,使能“debug-tweaks”,如下图所示:
这样配置后,会自动登录,不用再手动输入用户名和密码,方便调试。 配置完成后,保存退出。接下来直接编译根文件系统:
petalinux-build -c rootfs
将前面过程当中生成的各种镜像文件拷贝到 SD 启动卡的 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)。大家根据自己前面步骤当中文件存放的目录去找到相应的这些镜像文件。
4. 启动系统
将内核镜像文件 zImage、内核设备树文件以及根文件系统从image.ub 文件中分离出来;而将 bit 文件从 BOOT.BIN 文件中分离出来,这样做之后我们的 SD卡中将会存在 5 部分内容:zImage、dtb、rootfs、bit 以及 BOOT.BIN(fsbl 镜像与 u-boot镜像的集合体),明确之后我们将他们拷贝到我们的 SD 卡中。将前面过程当中生成的各种镜像文件拷贝到 SD 启动卡的 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)。大家根据自己前面步骤当中文件存放的目录去找到相应的这些镜像文件。
接下来我们需要将这些文件拷贝到 FAT 分区,接下来我们需要将之前编译的根文件系统压缩包文件解压到 SD 启动卡的 EXT4 分区。
在 U-Boot 启动 2 秒倒计时之前,按回车或者是空格键停止启动,进入到 U-Boot 的命令行模式,因为现在不能直接启动,我们需要对 U-Boot 环境变量进行修改:
在 U-Boot 命令行下执行下面这些命令设置环境变量,如下所示:
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'
变量设置完成之后,执行 saveenv 命令保存环境变量到 QSPI Flash 中,那么下次就不用再设置了。
保存完成后执行 boot 命令启动内核或者执行 reset 重启开发板:
可按下列代码在u-boot中修改
env default -a
setenv bitstream_load_address 0x100000
setenv bitstream_image system.bit
setenv bitstream_size 0x2000000
setenv kernel_img zImage
setenv dtbnetstart 0x3000000
setenv netstart 0x3080000
setenv cp_dtb2ram 'mmcinfo &&fatload mmc 0:1 ${dtbnetstart} ${dtb_img}'
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'
setenv dtb_img system-top.dtb
setenv ipaddr 192.168.1.11
setenv ethaddr ca:0a:35:00:1e:53
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.1
setenv dns-nameservers 192.168.30.254
saveenv
如遇问题,请将环境变量配置与我一致。
setenv cp_dtb2ram 'mmcinfo &&fatload mmc 0:1 ${dtbnetstart} ${dtb_img}'
上电成功示意图: