近来尝试了一下Xilinx的PetaLinux,感觉十分好用,不到半个小时就可以生成带rootfs的所有文件(包括PMUFW、ATF、bitstream、U-boot、Linux kernel和busybox)并打包,不过在其中也遇到了一些问题,故在此记录移植过程。
本次移植使用的PetaLinux版本是2019.2,软件和相关文档的地址见PetaLinux工具,下文基本是按照文档所述方法进行的。
本次移植是在EdgeBoard Lite FX3开发板上实现的,见收到EdgeBoard Lite了,简单地开个箱。
最近编辑记录 metro (2019-12-28 18:01:18)
离线
首先,当然是需要先安装PetaLinux。安装包有点大,达到了近8个G。在下载的同时,可以根据PetaLinux工具文档的记述安装所有依赖软件。
安装的方式很简单,直接运行即可,注意文档要求不能以root权限执行安装程序。安装的目标文件夹可以自由指定,命令如下:
./petalinux-v2019.2-final-installer.run <install-path>
之后根据提示完成安装即可。
PS:PetaLinux对Vivado/Vitis的要求并不是必需的,但可以安装Vivado/Vitis以实现完整功能,例如JTAG启动等。
离线
接下来是编译PetaLinux。
首先是新建工程,在目标文件夹下运行:
petalinux-create --type project --template zynqMP --name demo
这样就会在当前文件夹下新建一个名为demo的文件夹。之后项目的默认名称均为demo。
在开始下一步操作之前,需要切换到项目文件夹:
cd demo
接下来需要从工程中导入配置文件。在最新的Vivado/Vitis中,导出的配置文件已经从HDF变更为XSA。可以在Vivado中通过File - Export - Export Hardware导出XSA文件。之后在PetaLinux中导入XSA文件:
petalinux-config --get-hw-description=<PATH-TO-HDF/XSA DIRECTORY>
稍等片刻之后,将会弹出menuconfig,这里可以简单地修改配置。特别需要注意的是串口的选择,我们这里需要选择ps_uart_1,以对应板子上的USB UART接口。
在配置完毕后,开始正式编译文件:
petalinux-build
之后等待编译完成即可。在我的笔记本(i5 8300H)上需要10分钟左右。
最后,如果需要在SD卡上执行,需要打包BOOT.bin文件:
petalinux-package --boot --format BIN --fsbl images/linux/zynqmp_fsbl.elf --u-boot --fpga <BITSTREAM-PATH>
之后将images/linux文件夹下的BOOT.bin和image.ub文件复制到SD卡的第一个分区(需要格式化为FAT 16/32),之后将拨码开关调整为SD1,插入SD卡启动即可。
如果需要JTAG启动,则需要将拨码开关调整为JTAG,上电并连接好调试器后执行下面命令即可:
petalinux-boot --jtag --uboot --kernel --fpga
JTAG启动的时间比较长,需要耐心等待。
最近编辑记录 metro (2019-12-28 18:32:45)
离线
最后提一下遇到的问题。
第一次移植的时候,我发现USB功能无法正常使用,表现是找不到USB控制器,并且对于U-boot和Linux都是如此。
之后搜索了一下,发现问题是没有正确配置USB所致。USB驱动需要指定dual role的具体使用方式,但是默认的设备树没有配置。其实在U-boot启动时也会报错找不到dr_mode。
解决方案是修改设备树。打开项目文件夹下的project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi文件,在末尾添加以下代码即可:
&dwc3_0 {
dr_mode = "host";
};
之后重新执行petalinux-build和petalinux-package,即可正常使用USB。
离线
上传一个自己编译好的版本,只添加了一些基本的接口,欢迎大家测试
EdgeBoard_20191228-1853.zip
离线
又尝试了一下QSPI Flash的编译,又遇到了一些问题,不过最后还是解决了。
根据PetaLinux工具文档,QSPI Flash的编译需要修改以下配置(还是运行petalinux-config进行修改):
Subsystem AUTO Hardware Settings - Advanced Bootable Images Storage Settings,选择JFFS2,并且进行相关配置(主要是把各种device都改成primary flash)。
Subsystem AUTO Hardware Settings - Flash Settings,修改分区表信息,需要在boot、bootenv、kernel之后再建立一个jffs2分区,并分配合适的空间。
Image Packaging Configuration,确保Root filesystem type为JFFS2,并且调整jffs2 erase block size(本例为64 KiB)。
在修改并重新编译后,将BOOT.bin、image.ub和rootfs.jffs2文件按照分区表拼接在一起,并且通过SD卡写入到QSPI Flash中。
但是,重启之后发现,在Linux启动的时候,将会弹出大量的jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at ...的错误。
搜索了一下,发现是因为内核默认使用了4K大小的erase sector,但当前的QSPI Flash不支持,因此出现此错误。
知道了问题,解决方法就简单了。运行petalinux-config -c kernel进行内核配置,进入到Device Driver - Memory Technology Device (MTD) support - SPI-NOR device support,关闭Use small 4096 B erase sectors即可。
最后同样上传一下编译好的flash镜像:flash.zip
最近编辑记录 metro (2019-12-28 22:45:29)
离线
自己找到办法了。这个问题比较典型,网上资料也比较少,贴出来可能其他人会有用。我自己折腾了好几天。
主要参考了这个帖子:http://www.zedboard.org/content/ultrazed-iocc-sd-card-ro简单说一下原因。SD卡是有写保护的,但是TF卡是没有写保护的。根据AR#61064 (https://www.xilinx.com/support/answers/61064.html),硬件设计的时候应该把SDIO的WP脚拉低,但是EdgeBoard并没有这么做。
解决办法是在project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi文件中增加以下内容:
&sdhci1 {
status = "okay";
max-frequency = <50000000>;
no-1-8-v; /* for 1.0 silicon */
disable-wp;
};
感谢分享,不过我还没试过把rootfs放在SD卡。。
不过如果我没记错的话,应该是可以在Vivado关闭WP的,不需要在设备树进行额外操作。所以要么是原本的Vivado工程有问题,要么就是PetaLinux的bug了。
最近编辑记录 metro (2020-01-29 00:16:08)
离线
你说的对,我也觉得Vivado项目里应该有办法。但是我本人是软件背景的,Vivado不大会用,做这个用的Vivado项目是淘宝卖家给的。网上找的的资料也是改设备树的,就这样先这样绕过这个问题。
如果有人只读怎么怎么改Vivado,在这里讲一下。
在Vivado的Block Diagram中双击Zynq的IP核,按照图示关闭SD1的WP即可。
如果不介意的话,也可以用我之前做好的xsa和bit。不过现在板子不在身边,没法测试是否有你说的问题。
注明一下,xsa和bit是用最新的Vivado 2019.2生成的,不知道会不会有兼容性问题。
最近编辑记录 metro (2020-01-29 10:22:27)
离线
谢谢回复。SD1的WP本来就是关闭的。
今天看了下面这个帖子,还是不知道改怎么做。
https://forums.xilinx.com/t5/Processor-System-Design/Zynq-SDIO-via-EMIO/td-p/327479
还好现在这个问题已经绕过了,不会block下一步,可以慢慢想办法。
昨天有其他人反应了相同的问题,这可能确实是PetaLinux的bug。可能暂时也没有什么好的解决方法,只能像USB部分一样手动修改吧。
离线