简介:在使用zynq 运行Linux时,如何在Linux启动之后,再布署PL,本教程在参考了正点原子领航者ZYNQ之嵌入式Linux开发指南第二十章,开源平台创龙的部分教程,结合Xilinx wiki官方教程。初步实现了zynq在Linux启动之后再加载PL。纯属摸索实现,有什么描述不正确的地方或者有更好的方法可以留言。
一、前期准备
xilinx wiki 参考地址
Xilinx GitHub,源码下载
注:本次实验均在Ubuntu1804.1下完成,vivado,petalinux 版本都是2019.1。
下载生成设备树源码,用于PL和PS端设备树生成是使用。
下载Linux内核源码,内核编译使用。
注意源码版本要和你使用的vivado版本一致。
将下载的生成设备树源码和Linux内核源码解压到自定义文件夹。以下是本次实验的文件夹介绍。
本次实验,使用zynq7020,PL端实现软串口,PS启动Linux后,动态部署PL。
axi-uart-peta:petalinux工程文件夹。
axi-uart-vivado:vivado 工程文件夹。
devicetree-xlnx:下载的生成设备树源码解压到本文件夹下。
hdf:存放vivado工程生成的硬件hdf文件。
linux-kernel:下载的linux内核源码加压到此文件夹。
pl-devicetree:PL 端动态设备树文件。
SD:此文件夹放最终要部署在SD卡中的文件。
二、创建vivado工程
-
打开vivado, 选择好工程文件路径,芯片型号等。
-
Create Block Design 本次修改"Design name" 为system。
-
添加zynq,axi uartlite(波特率可设置。默认9600), 连接框图,注意中断需要手动连接。FCLK_CLK0:100M。zynq PS 的配置,根据你使用的板子情况而定。QSPI flash, SD0, UART0/UART1,等。连接框图如下。
-
genertate output products
-
create HDL Wrapper
-
添加xdc约束,配置uart lite 的TX和RX引脚。
-
生成bit
-
导出硬件文件。勾选包含bitstream。
将生成的hdf文件拷贝到hdf文件夹下。备用。
9. 不要关闭vivado。在当前vivado工程下,生成(.bit)对应的(.bit.bin)文件.
下图对应的路径,是本教程生成(.bit)所在文件夹下。创建Full_Bitstream.bif文件,
其中Full_Bitstream.bif内容如下:
注:使用(.bit)的完整路径。
在vivado的Tcl Console下输入生成(.bit.bin)的命令:
bootgen -image /home/guozd/zynq/axi-uart/axi-uart-vivado/axi-uart.runs/impl_1/Full_Bitstream.bif -arch zynq -process_bitstream bin
生成的(.bit.bin)文件如下如:
将(system_wrapper.bit.bin)拷贝到SD(自定义)文件夹下,待用。
三、生成PL端动态设备树 等等再编译。
添加设备树源码。
在vivado中。file--> Launch SDK .
创建动态设备树bsp
详细设置
允许动态设备树布署。
生成的可动态布署的设备树文件(PL端),如下图
将生成的pl.dtsi文件拷贝到 pl-devicetree文件夹下。待用,等待编译完Linux内核,再编译设备树文件。
四、创建petalinux工程,生成BOOT.BIN文件。
zynq的启动,分为两部分ps和pl(如果使用了pl),ps的启动依赖(fsbl, uboot, dtb, kernel, rootfs), pl是(bit)。一般情况下,使用petalinux生成BOOT.BIN,其包含(fsbl, uboot, dtb)。本次将dtb(设备树)文件从BOOT.BIN中分离出来,在Linux启动后动态布署;
注:对于设备树作简单描述,ps端的基本配置使用设备树来描述,pl作为ps的外设,也是作为设备树中的一部分,本文动态布署的是pl这一部分。
使用petalinux生成BOOT.BIN基本步骤如下
//之前将vivado生成的hdf文件已经拷贝到本实验xx/zynq/axi-uart/hdf下
source /opt/pkg/petalinux/2019.1/setting.sh //根据你自己的情况
petalinux-create -t project --template zynq -n axi-uart-peta
cd axi-uart-peta
petalinux-config --get-hw-description ../hdf/
//进入配置界面
Subsystem AUTO Hardware Settings
Advanced bootable images storage Settings
dtb image settings
如下图
主要目的是将设备树从BOOT.BIN 文件中分离出来,涉及到ps的配置的设备树单独编译,设计pl动态布署的设备树单独编译,单独布署(以上“三”生成的)。
再修改Linux启动打印log串口,我自己的开发板是uart0。
设置Root filesystem type (INITRAMFS) 为SD启动。
接下来save , exit。
//编译fsbl,uboot, 生成BOOT.BIN,命令如下。
petalinux-build -c bootloader
petalinux-build -c u-boot
petalinux-package --boot --fsbl --u-boot --force
生成结果如下。拷贝BOOT.BIN 到SD文件夹中。
五、编译Linux kernel
下载的内核源码已经解压到本实验的linux-kernel文件夹中,可在前面项目文件夹介绍查看。编译步骤如下:
//编译内核源码为uImage
cd /home/guozd/zynq/axi-uart/linux-kernel/linux-xlnx-xilinx-v2019.1
source /tools/Xilinx/Vivado/2019.1/settings64.sh //根据你vivado安装的情况选择
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig //添加axi-uartlite官方驱动,下图
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- UIMAGE_LOADADDR=0x02080000 uImage -j16
添加axi-uartlite驱动:
Device Drivers --> Character devices -->Serial drivers --> Xilinx uartlite serial port support
注:
在Solution Zynq PL Programming With FPGA Manager文中,动态布署PL需要开启的配置已经默认开启。
编译完成之后再一下路径将Linux内核文件uImage 拷贝到SD文件夹中。
linux-kernel/linux-xlnx-xilinx-v2019.1/arch/arm/boot/ uImage
编译完Linux内核之后,可以借助Linux内核文件中的dtc工具编译,编译ps和pl的设备树了。
六、编译设备树
1.编译涉及pl的设备树。
cd /home/guozd/zynq/axi-uart/pl-devicetree
/home/guozd/zynq/axi-uart/linux-kernel/linux-xlnx-xilinx-v2019.1/scripts/dtc/dtc -O dtb -o pl.dtbo -b 0 -@ pl.dtsi
//编译完成后会在本文件夹下生成pl.dtbo 拷贝到SD文件夹中
2.编译ps端设备树
进入之前axi-uart-peta工程的指定目录下如下图
修改system-top.dts,
修改前:
修改后:(再本此文件下下翻翻,打开看看,有惊喜)
编译命令如下:
//编译命令
/home/guozd/zynq/axi-uart/linux-kernel/linux-xlnx-xilinx-v2019.1/scripts/dtc/dtc -O dtb -o system-top.dtb -b 0 -@ system-top.dts
//将生成的system-top.dtb 改名为devicetree.dtb。 拷贝到SD文件中
//为什么不在生成时,名字设置为devicetree.dtb呢?可以自己尝试下。
此时SD文件夹中有如下那些文件呢?
其中将BOOT.BIN,devicetree.dtb,uImage拷贝到SD卡的BOOT分区;pl.dtbo,system_wrapper.bit.bin 拷贝到SD的文件系统下。
七、启动开发板
设置uboot环境
setenv bootcmd 'run $modeboot'
setenv bootdelay 2
setenv devicetree_image devicetree.dtb
setenv devicetree_load_address 0x2000000
setenv devicetree_size 0x20000
setenv kernel_image uImage
setenv kernel_load_address 0x2080000
setenv kernel_size 0x500000
setenv modeboot sdboot
setenv sdboot 'if mmcinfo; then run uenvboot; echo Copying Linux from SD to RAM... && load mmc 0 ${kernel_load_address} ${kernel_image} && load mmc 0 ${devicetree_load_address} ${devicetree_image} && bootm ${kernel_load_address} - ${devicetree_load_address}; fi'
saveenv
boot
注释:保存环境变量到QSPI flash中,万一你的开发板没有QSPIflash,那别保存了,直接boot。
没有flash,会将uboot环境变量保存到SD卡中,可私信,感谢。
启动Linux之后,接下来,动态布署PL
八、动态布署PL
借助官方文档,截了个图如下:
文章来源:https://www.toymoban.com/news/detail-402945.html
总之将先前拷贝到文件系统中的pl.dtbo,system_wrapper.bit.bin 拷贝到 在/lib/firmware下,没有就新建。使用上图 中步骤 1), 3)就可在/dev下看到ttyUL0设备。文章来源地址https://www.toymoban.com/news/detail-402945.html
到了这里,关于zynq Linux 启动之后动态布署PL方法摸索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!