本文讲介绍如何使用PetaLinux来定制ZCU106的SDSoc Platform,包括带有xfce和opencv等第三方软件的rootfs。文章的后半部分也提供了如何将ubuntu运行在ZCU106中的方法。
SDSoC包含了zcu102的SDSoC Platform,该Platform提供了三种运行环境————Standalone,FreeRTOS,Linux。Platform提供的Linux只能用来运行SDSoC编译出来的elf文件,断电之后丢失全部数据,没有图形界面,也不能从板上接口(如USB)获取数据,功能十分有限。为了解决这个问题,我们要重新编译zcu102的内核,使能USB接口等外设以及mali的GPU,并使用Ubuntu的rootfs而非Petalinux产生的rootfs。
来自 lulugay的csdn博客
本文主要参考lulugay的文章,不过文章中有一小部分没有讲述(也可能是在其他文章中提到了),遂在这里补充一小部分细节和遇到的一些问题,作为个人的记录。(为“借鉴”找借口,逃
流程
- 使用Vivado综合DSA为Petalinux。
DSA文件定义了Zynq的PL部分
- 使用Petalinux编译Linux内核以及根文件系统
- 替换SDSoc中的文件
- 制作SD卡
综合DSA
- 新建Vivado工程,命名为zcu106,新建一个bd命名为zcu106,并照此图进行搭建。
- 其中ZYNQ进行了重命名为ps_e
- 其中clk_wiz_0的输出时钟频率为75、100、150、200、300、400、600,Output Clocks中Reset Type设置为Active Low
- 配置属性
在tcl console中输入
set_property PFM_NAME "xilinx.com:zcu106:zcu106:1.0" [get_files zcu106.bd]
set_property PFM.CLOCK { \
clk_out1 {id "0" is_default "false" proc_sys_reset "proc_sys_reset_0" } \
clk_out2 {id "1" is_default "false" proc_sys_reset "proc_sys_reset_1" } \
clk_out3 {id "2" is_default "false" proc_sys_reset "proc_sys_reset_2" } \
clk_out4 {id "3" is_default "true" proc_sys_reset "proc_sys_reset_3" } \
clk_out5 {id "4" is_default "false" proc_sys_reset "proc_sys_reset_4" } \
clk_out6 {id "5" is_default "false" proc_sys_reset "proc_sys_reset_5" } \
clk_out7 {id "6" is_default "false" proc_sys_reset "proc_sys_reset_6" } \
} [get_bd_cells /clk_wiz_0]
set_property PFM.AXI_PORT { \
M_AXI_HPM0_FPD {memport "M_AXI_GP"} \
M_AXI_HPM1_FPD {memport "M_AXI_GP"} \
M_AXI_HPM0_LPD {memport "M_AXI_GP"} \
S_AXI_HPC0_FPD {memport "S_AXI_HPC" sptag "HPC0" memory "ps_e HPC0_DDR_LOW"} \
S_AXI_HPC1_FPD {memport "S_AXI_HPC" sptag "HPC1" memory "ps_e HPC1_DDR_LOW"} \
S_AXI_HP0_FPD {memport "S_AXI_HP" sptag "HP0" memory "ps_e HP0_DDR_LOW"} \
S_AXI_HP1_FPD {memport "S_AXI_HP" sptag "HP1" memory "ps_e HP1_DDR_LOW"} \
S_AXI_HP2_FPD {memport "S_AXI_HP" sptag "HP2" memory "ps_e HP2_DDR_LOW"} \
S_AXI_HP3_FPD {memport "S_AXI_HP" sptag "HP3" memory "ps_e HP3_DDR_LOW"} \
} [get_bd_cells /ps_e]
set intVar []
for {set i 0} {i<8} {incr i} {
lappend intVar Ini {}
}
set_property PFM.IRQ intVar [get_bd_cells /xlconcat_0]
set_property PFM.IRQintVar [get_bd_cells /xlconcat_1]
注意命令中的名称要与bd对应
- 生成hdf、bit文件
- 点击Generate Bitstream
- 完成后点击File->Export->Export Hardware,勾选Include Bitstream点击OK
- 然后Launch SDK后,可以在工程路径下的zcu106.sdk中找到hdf和bit
如果是Vivado2018.3版本,如果报错可以尝试输入以下命令,限制Vivado为单线程综合。
set_param general.maxThreads 1
- 打包dsa文件
在tcl console中输入
write_dsa –force <path_to_project>/zcu106.dsa -include_bit
validate_dsa <path_to_project>/zcu106.dsa
编译Linux内核以及根文件系统
- 去Xilinx官网下载Petalinux与板子相对应的bsp文件
PetaLinux - Installation Files
如果你还没有安装PetaLinux也可以在这里下载
- 在Bash中输入以下命令
petalinux-create -t project -s xilinx-zcu106-v2018.3-final-v2.bsp --name zcu106
cd zcu106
- 将dsa文件复制到该目录下,执行以下命令
petalinux-config --get-hw-description ./
- 此时弹出的界面,配置参数
- DTG Settings->Kernel Bootargs->取消Generate boot args automatically
- 在user set kernel bootargs 输入
earlycon clk_ignore_unused earlyprintk root=/dev/mmcblk0p2 rw rootwait cma=1024M
- Image Packaging Configurations->Root filesystem type->SD card
- 在
/project-spec/metauser/recipes-kernel/linux/linux-xlnx/bsp.cfg添加
# CONFIG_BLK_DEV_INITRD is not set
CONFIG_XILINX_APF=y
CONFIG_XILINX_DMA_APF=y
CONFIG_CMA_SIZE_MBYTES=1024
CONFIG_STAGING=y
# CONFIG_CPU_IDLE is not set
# CONFIG_CPU_FREQ is not set
CONFIG_EDAC_CORTEX_ARM64=y
- 在
/project-spec/metauser/recipes-bsp/device-tree/files/system-user.dtsi添加
/{
xlnk {
compatible = "xlnx,xlnk-1.0";
};
};
- 将0001-Fix-for-gtr_sel0-polarity-correct-for-dual-lane-DP.patch复制到与system-user.dtsi同路径,device-tree-generation_%.bbappend改为
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI += "file://system-user.dtsi\
file://0001-Fix-for-gtr_sel0-polarity-correct-for-dual-lane-DP.patch"
0001-Fix-for-gtr_sel0-polarity-correct-for-dual-lane-DP.patch下载地址
- 保存并退出
- 配置rootfs
输入以下命令配置rootfs
petalinux-config -c rootfs
- 勾选自己需要安装的软件
如x11、xfce、opencv等,均可在Package Group中找到
- 编译
petalinux-build
替换SDSoc文件
- 文件均在< path to plnx>/images/linux/路径下
- 将u-boot.elf, bl31.elf, pmufw.elf, zynqmp_fsbl.elf, 替换掉SDSoC自带的zcu106/sw/a53_linux/boot下的对应文件, zynqmp_fsbl.elf需要改名为fsbl.elf;
- 将image.ub替换掉SDSoC自带的zcu106/sw/a53_linux/a53_linux/image下的对应文件
- 将综合步骤产生的.hdf和.bit文件替换掉SDSoC自带的zcu106/sw/a53_linux/a53_linux/prebuilt下的对应文件,注意改名。
以上操作推荐复制一份SDSoc自带的platform文件夹,进行替换。
制作SD卡
- 分区格式化
将SD分为两个区,一个大小为2048mb、格式为Fat32的BOOT分区,另一个为剩余空间大小、格式为ext4的ROOT分区。 - 解压rootfs至SD卡
sudo tar xvf rootfs.tar.gz -C /media/ROOT
#如果需要测试Linux可以在这里将BOOT.BIN和image.ub拷贝至BOOT分区下
sudo cp images/linux/BOOT.BIN /media/BOOT/
sudo cp images/linux/image.ub /media/BOOT/
Ubuntu 的移植
在这一步可以使用Xilinx为ZCU102提供的镜像来进行完成,之前我使用过Ubuntu官方的源码进行移植,x11出现了不少问题。
Xilinx Ubuntu Desktop Image
下载好之后可以使用Win32DiskImager对ZCU102_UbuntuDesktop_2018_3.img进行烧写
烧写完毕后可以将在上一步生成的BOOT.BIN 和 image.ub复制到/boot分区中
此时的Ubuntu还不能运行SDSoc编译出的二进制文件
还需要将libsds_lib.so(从原始的SDSoc产生的镜像中考出)拷贝至/usr/lib中