zynq Linux 启动之后动态布署PL方法摸索

简介:在使用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工程

  1. 打开vivado, 选择好工程文件路径,芯片型号等。

  2. Create Block Design 本次修改"Design name" 为system。

  3. 添加zynq,axi uartlite(波特率可设置。默认9600), 连接框图,注意中断需要手动连接。FCLK_CLK0:100M。zynq PS 的配置,根据你使用的板子情况而定。QSPI flash, SD0, UART0/UART1,等。连接框图如下。                                         

  4. genertate output products

  5. create HDL Wrapper

  6. 添加xdc约束,配置uart lite 的TX和RX引脚。

  7. 生成bit

  8. 导出硬件文件。勾选包含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

借助官方文档,截了个图如下:

 总之将先前拷贝到文件系统中的pl.dtbo,system_wrapper.bit.bin 拷贝到 在/lib/firmware下,没有就新建。使用上图 中步骤 1), 3)就可在/dev下看到ttyUL0设备。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值