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
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 Architecture | x-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 endian | microblazeel-xilinx-linux-gnu- |
Microblaze big endian | microblaze-xilinx-linux-gnu- |
PowerPC | powerpc-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.bin
、boot.scr
、image.ub
这三个文件拷贝到SD卡中,然后调整器件为以SD卡模式启动。
上板测试参考G02-zcu106_startup与G03-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
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.