W03-petalinux_build.md

W03-petalinux_build.md

社蕙 952 2022-08-28

petalinux 工作流

请先根据E02配置好petalinux工作环境,并下载bsp

我的虚拟机上petalinux安装于/opt/pkg/petalinux
bsp文件放置在/opt/pkg/petalinux/bsp/xilinx-zcu106-v2019.2-final.bsp
xsa文件放置在~/xilinx-zcu106-2019.2/,工程也是这个文件夹

1. 工程流

project是一切工作的起始点。

petalinux-create -t project -s /opt/pkg/petalinux/bsp/xilinx-zcu106-v2019.2-final.bsp

1.1. 加载硬件平台

一般来说只需要指定到目录,不需要指定到.xsa文件。

petalinux-config --get-hw-description=./

1.2. kernel设定

petalinux-config -c kernel

将打开一个GUI,在里面对kernel需要包含的module进行启用与禁用。修改完后记得保存为默认名.config,否则可能编辑无效。

可以通过再召唤GUI进行确认,也可以查看
./build/tmp/work/zcu106_zynqmp-xilinx-linux/linux-xlnx/4.19-xilinx-v2019.2+git999-r0/defconfig来进行确认。
或者
/home/megumism/xilinx-zcu106-2019.2/project-spec/meta-plnx-generated/recipes-kernel/linux/configs
我不确定这两个文件是否具有一致性,最好的办法是二次打开kernel确认

1.3. app

参考两种构建Petalinux下应用程序的方法

1.3.1. petalinux自带工具编译

下述以AXI DMA Linux user space application on Zynq MPSoC platform下附的dmatest.c为例,尽管此程序并不能很好地运行。

1.3.1.1. 创建模板app

据说只能单文件编译,更复杂的app待研究,模板默认是一个hello world文件。

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

编辑c程序不表。

1.3.1.2. 编译app

单独编译app:

petalinux-build -c dmatest

安装应用程序:

petalinux-bulid -c dmatest -x do_install
petalinux-build -c rootfs
petalinux-build -x package
1.3.1.3. 删除app

参考about delete apps in petalinux,可以直接修改<plnx-proj-root>/project-spec/meta-plnx-generated/recipes-core/images/petalinux-image.bbappend,将不需要的app从文件中排除。

1.4. 交叉编译

1.4.1. 安装交叉编译工具

Target Architecturex-tool prefix
Zynq-7000 (CodeSourcery - soft float)arm-xilinx-linux-gnueabi-
Zynq-7000 (Linaro - hard float)arm-linux-gnueabihf-
Zynq UltraScale+ MPSoC (ZynqMP)aarch64-linux-gnu-
Microblaze little endianmicroblazeel-xilinx-linux-gnu-
Microblaze big endianmicroblaze-xilinx-linux-gnu-
PowerPCpowerpc-eabi-

以zcu106编译c程序为例

sudo apt-get install gcc-aarch64-linux-gnu

1.4.2. 编译

对于一般的程序,与正常交叉编译方式无异

aarch64-linux-gnu-gcc test.c -o test

对于更复杂的有Makefile与config.mk的编译,可以参考W04-petalinux_axidma_build,这里需要指出的是,对于选定的编译器,需要有对应的架构,比如:

CROSS_COMPILE = aarch64-linux-gnu-
ARCH = arm64

1.5. 设备树

1.5.1. 编辑设备树

参考开发者分享 | Petalinux 工程中设备树的介绍,petalinux有两部分时钟树:

第一个是在 ./components/plnx_workspace/device-tree/device-tree/*.dtsi 路径下,这个路径下主要保存的都是基于你导入的hdf/xsa后,自动生成的设备树信息。通常包括PS的设备树,时钟的设备树,PL 部分 IP 的设备树(Xilinx发布的包含驱动的IP),以及设备树头文件。

事实上来说,这里面的dtsi都是不能改也改不了的,它基于xsa。

第二个可以修改的设备树位于./project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi,来实现对之前已经定义的设备树节点中的属性进行变更,也可以添加没有自动生成的设备树节点。

更复杂的包括完全自定义设备树、多用户设备树、反编译设备树,请参考上述链接

反编译(查看)设备树

参考How to decompile a device tree in PetaLinux,在images/linux找到system.dtb

参考petalinux 修改设备树,在
\build\tmp\sysroots-components\x86_64\dtc-native\usr\bin\dtc中找到dtc应用程序,将system.dtb复制进来,执行:

./dtc -I dtb -O dts -o system.dts system.dtb

得到可以打开的dtc文件。

1.5.2. 清理设备树状态

petalinux-build -c device-tree -x cleansstate

1.5.3. 重新编译设备树

petalinux-build -c device-tree

1.6. 全局编译

推荐上板之前做一次全局编译,以防忘记了什么。

petalinux-build

1.7. 生成镜像文件

cd ./image/linux
petalinux-package --boot --fsbl zynqmp_fsbl.elf --u-boot u-boot.elf --pmufw pmufw.elf --fpga system.bit --force

1.8. 烧写SD卡

~/xilinx-zcu106-2019.2/image/linux下的 BOOT.binboot.scrimage.ub这三个文件拷贝到SD卡中,然后调整器件为以SD卡模式启动。

上板测试参考G02-zcu106_startupG03-linux_on_board_operation

2. 其他问题

2.1. Worker process (xxxxx) exited unexpectedly (-9)

ERROR: Worker process (15212) exited unexpectedly (-9), shutting down...
ERROR: Worker process (15212) exited unexpectedly (-9), shutting down...

参考error when i petalinux-build,原因在于Vmware给的内存太小了,进程被系统杀掉。如果给每个cpu分配2GB内存,实测可以解决问题。

2.2. Bitbake build fails because of a python function

参考Bitbake build fails because of a python function,执行

sudo apt-get install gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev

将py3的组件安装一下。

2.3. mmc0: Tuning failed / I/O error, dev mmcblk0

参考73079 - 2019.2 Zynq UltraScale+ MPSoC: PetaLinux ZCU106 BSP fails to detect SD Card FAT32 or EXT4 partition when booting Linux,如果SD卡发生错误,那么dmesg将会有如下输出:

[   10.152655] mmc0: Tuning failed, falling back to fixed sampling clock
[   10.160348] print_req_error: I/O error, dev mmcblk0, sector 1
[   10.202351] mali: loading out-of-tree module taints kernel.
[   10.210174] mmc0: Tuning failed, falling back to fixed sampling clock
[   10.217865] print_req_error: I/O error, dev mmcblk0, sector 2
[   10.268400] mmc0: Tuning failed, falling back to fixed sampling clock
[   10.276136] print_req_error: I/O error, dev mmcblk0, sector 3
[   10.326186] mmc0: Tuning failed, falling back to fixed sampling clock
[   10.333920] print_req_error: I/O error, dev mmcblk0, sector 4
[   10.383793] mmc0: Tuning failed, falling back to fixed sampling clock
[   10.391570] print_req_error: I/O error, dev mmcblk0, sector 5
[   10.441422] mmc0: Tuning failed, falling back to fixed sampling clock
[   10.449138] print_req_error: I/O error, dev mmcblk0, sector 6
[   10.499709] mmc0: Tuning failed, falling back to fixed sampling clock
[   10.507459] print_req_error: I/O error, dev mmcblk0, sector 7
[   10.513231] Buffer I/O error on dev mmcblk0, logical block 0, async page read
[   10.564688] mmc0: Tuning failed, falling back to fixed sampling clock
[   10.616289] mmc0: Tuning failed, falling back to fixed sampling clock

需要在设备树中添加补丁:

"/include/ "system-conf.dtsi"
/ {
};

&sdhci1 {
        no-1-8-v;
};

并重新编译设备树。

2.4. aarch64-linux-gnu-gcc: error: unrecognized argument in option'-mabi=apcs-gnu

参考Katastros

aarch64-linux-gnu-gcc: error: unrecognized argument in option'-mabi=apcs-gnu'
aarch64-linux-gnu-gcc: note: valid arguments to'-mabi=' are: ilp32 lp64
aarch64-linux-gnu-gcc: error: unrecognized argument in option'-mabi=apcs-gnu'
aarch64-linux-gnu-gcc: note: valid arguments to'-mabi=' are: ilp32 lp64
aarch64-linux-gnu-gcc: error: unrecognized argument in option'-mabi=apcs-gnu'
aarch64-linux-gnu-gcc: note: valid arguments to'-mabi=' are: ilp32 lp64

Solution:

make ARCH=arm64 CROSS_COMPILE=$(CROSS_COMPILE_721) -C $(PF_LINUX_SRC) M=$(PWD) modules -j10

也就是配置架构为arm64.