搭建petalinux-从flash启动

  • 目录

先找一个准备存放工程的地方,(home/zhao/PDR),命令行cd home/zhao/PDR

  • 编译链

根据安装petalinux的路径:
source /home/zhao/PetaLinux2019.1/settings.sh

  • 创建工程

将在PRO目录下面,创建一个工程:
petalinux-create --type project --template zynq --name h2_petalinux_test
h2_petalinux_test是工程名,该命令会自动在PRO文件夹里创建h2_petalinux_test文件夹

  • 引用刚才输出的硬件描述文件

把之前导出的硬件描述文件system_wrapper.hdf拷贝到虚拟机中的h2_petalinux_test工程文件夹下,然后h2_petalinux_test工程文件夹:
petalinux-config --get-hw-description=/home/zhao/PDR/h2_petalinux_test

选择Subsystem AUTO Hardware Setting.更改为从flash中启动。

选择Advanced bootable images storage settings.

这里实际就是设置image.ub的存放区域。

默认是从SD启动,并且下一行指示出了文件名称是image.ub。我们点进去选择primary flash

之后就看到多了箭头所指示的这一行。说明image.ub是要存在qspi flash的kernel区。

把相应的选项都选择为primary flash,

qspi flash划分了多个区域,我们可以在Subsystem AUTO Hardware Setting -> Flash Setting里面看到QSPI FLASH 的分区(当然也可以修改)。

第一个区名称是boot,从地址0开始,长度是0x500000 .(是5M,7Z020的BITSTREAM是4M多一点,加上UBOOT,FSBL不到5M,因此足够)。

第二个区名称是bootnv,从地址0x500000开始,长度是0x20000 ,这里存放UBOOT启动参数或者命令。UBOOT启动后会检查这部分是否为有效的启动命令,如果是则执行这些有效的命令,如果不是则执行autoboot(32K)。我们现在接触到的都是不设置这部分而自动运行autoboot.

第三部分名称是kernel,从地址0x520000开始,长度可以32M-0x52000,长度大于26M的样子。当然这26M还可以继续划分成两个或者三个分区还可以继续划分分区。这里就是image.ub的。

回到主菜单那

选中第一行Linux Components Selection和下方的select,回车。出现下图:

由于我的电脑(6核8G内存)无法成功生成fsbl文件,所以需要取消在petalinux中生成fsbl的选项。选中第一行First Stage Bootloader和下方的select,按键盘上的N,取消选中;本例程没有PMU Fireware这一行,不用管。需要的fsbl文件可以通过XSDK生成

向下选择U-boot Configuration,选择第二项,修改u-boot模板,

关于不同平台对应的u-boot模板,可以参考xilinx wiki: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841973/Build+U-Boot。

  • 建立应用程序模板

petalinux-create -t apps --template c --name myapp --enable

注意:如果程序名字中含有_,则必须是myapp_1这样的形式,即_后跟数字,代表版本号。如果是myapp_led,则会报错。发生错误后,必须删除整个程序文件夹,通常是<plnx-proj-root>/project-spec/meta-user/recipes-apps/myapp这个文件夹;然后打开<plnx-proj-root>/project-spec/meta-user/recipes-core/images下的petalinux-image.bbappend文件,删除IMAGE_INSTALL_append = " myapp_led"这一行。再重新修改编译。

删除应用程序必须做两件事:1、删除程序文件夹,2、删除petalinux-image.bbappend文件对应行。

  • 获取文件夹权限

在上一步完成后,输入命令sudo chmod -R 777 /home/zhao/PDR获取文件夹权限(工程文件夹和petalinux的安装文件夹),否则编译的时候,会发生错误

目前为止,在shell中的命令既可以以超级用户su的身份运行也可以以普通用户的方式运行(建议全部都用普通用户的方式,免得切换),但是等下编译u-boot和kernel以及rootfs的时候,必须普通用户的身份运行命令行,否则会报错的

  • 编译u-boot

注意:到此处的时候,不能再用超级用户了,要切换到普通用户下,之后的所有操作都在普通用户下
普通用户的shell中输入petalinux-config -c u-boot,然后等待GUI出来,这里暂时不改动啥,直接save(save为u-boot.config,名字随便取但不要留空),然后继续等(新建工程要等的时间还是比较长的,后来就会好的)

  • 编译kernel

命令petalinux-config -c kernel,操作同上(save为kernel.config

  • 编译rootfs

命令petalinux-config -c rootfs,操作同上(save为默认即可)

  • 设备树配置

若要修改,直接在工程文件夹下,Ctr+F搜索.dts就可以找到相关文件,做出相应修改”
暂时默认吧,不修改,按照它自动生成的设备树

  • 编译工程

输入命令petalinux-build,等待即可,最后生成的文件在 image/linux

  • 报错

在配置文件中搜索 update_xxxx_cache 中的 xxxx,找到具体位置,然后 在 UI 界面打开相应功能即可

打开 ... / prj / build / misc / rootfs_config , 查找到 pixbuf ,定位在UI中的位置

filesystem packages下的libs的gdk-pixbuf

打开对应的开关,重新编译即可

2

 

  • 生成BOOT.BIN

把shell定位到image/linux目录下,执行命令
petalinux-package --boot --format BIN --fsbl zynq_fsbl.elf --fpga system.bit --u-boot,在文件夹下就可以发现,多了一个BOOT.BIN

我们在linux将文件a.bin拷贝到qspi flash 的kernel区的话,首先找到kernel 所在区为2,对应的linux设备是mtd2

之后执行flash拷贝命令

 flashcp a.bin /dev/mtd2

之后输入pealinux-build ,进行编译。

在image/linux目录下生成了u-boot.elf,zynq_fsbl,system.bin 以及image.ub。这些文件中实际上跟sd卡启动的petalinux设置唯一差别的文件就是u-boot.elf,而这个文件的差别也仅仅在于autobooting的脚本(是指示从qspi flash的指定地址0X52000获取image.ub而不是从sd卡的指定文件名)

生成boot.bin后,烧写到flash的0x0的boot分区(对应linux下的/dev/mtd0)。而将image.ub烧写到0x520000的kernel分区(对应/dev/mtd2)。这里烧写步骤有多种,可以用SDK,也可以用 tftp下载到SD卡启动好的板子linux上后使用flashcp烧写。

之后设置flash启动,将看到运行结果。这里面除了系统引导之前的fsbl和uboot能快一些之外(因此是从flash搬运到ocm或者DDR,而取代了从SD卡),运行linux的时间和结果没有任何的差别(因为LINUX 内核以及文件系统都在DDR内)。

  • 拷贝到flash里

 

  • 开机

将SD卡,插回,开机.

 

 

  • 实验结果对比
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值