zynqMP zcu111使用内核源码编译设备树及内核

本文详细描述了在ZynqMP平台上使用uartliteIP进行FPGA与ARM交互的过程,包括配置SDK、编译Petelinux、制作BOOT.BIN以及解决内核和设备树匹配问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

使用zynqMP平台,大都是这个过程。本人主要是使用uartlite,fpga端提供xsa、bit文件(fpga需要生成uartliteIP核提供给ARM使用)。使用xsa文件配置好sdk包,使用petalinux-build指令编译出boot、内核、文件系统、设备树。下到板子里之后,就可以看见/dev/ttyULx设备,这个设备就是使用的uartlite。

过程

fpga端本人不懂,所以只针对arm端说明。
## 编译过程
	0、配置好编译环境:
		下载petalinux-v2022.2-10141622-installer.run,然后再ubuntu下运行,安装好后会有个settings.sh脚本,source settings.sh,环境就配置好了,可以使用petalinux指令了。下载xilinx-zcu111-v2022.2-10141622.bsp,petalinux-create -t project -s xilinx-zcu111-v2022.2-10141622.bsp。准备工作就做好了。这些步骤在ug1144-petalinux-tools-reference-guide-en-us-2022.2文档中都有。
	1、根据xsa配置sdk包,指令如下:
		petalinux-config --get-hw-description *./system_wrapper.xsa*(两个星号间的根据自己存放的xsa路径自由替换)
	2、编译SDK
		petalinux-build 。编译好之后,在<SDK>/ images/linux路径下,就会生成boot、内核(image.ub是最终下载到板子上的文件,这个文件里包含了Image和dtb)、文件系统等文件。注意此时是没有BOOT.BIN(也需要下载到板子上)文件的,BOOT.BIN需要自己生成。
	3、制作BOOT.BIN
		petalinux-package --boot --format BIN --fsbl images/linux/zynqmp_fsbl.elf --u-boot images/linux/u-boot.elf --pmufw images/linux/pmufw.elf --fpga images/linux/system.bit --force
		执行完之后,<SDK>/ images/linux路径下就生成了BOOT.BIN。

在这里插入图片描述
4、下载
我使用的SD卡启动。把BOOT.BIN、image.ub拷贝到SD卡的fat32分区,上电,就看到了/dev/ttyULx设备了。注意,SD卡需要提前制作好,分成两个分区,一个放内核、boot,一个放文件系统。

这是使用的petalinux指令编译,如果不想使用petalinux指令编译,想使用make单独编译内核,设备树怎么办呢?内核及设备树源码在/build/tmp/work-shared/xilinx-zcu111/kernel-source目录,和普通内核没有区别。编译的使用make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j4,需要指定ARCH和CROSS_COMPILE。内核、设备树都可以正常编译出来,如下图位置:

在这里插入图片描述
下面遇到第一个问题,因为板子上内核是image.ub,我们编译出来的是Image,image.ub应该怎么生成呢?百度吧,最后在https://blog.csdn.net/weixin_42963900/article/details/129818796这篇帖子上找到了答案并且成功合成image.ub,感谢这位道友。

用我们自己编译的image.ub替换使用petalinux指令编译出来的image.ub,发现/dev下的设备缺了,原来arm端有uart1,现在没有了,说明设备树不对啊,和使用petalinux指令编译出来的设备树不一样,使用petalinux指令编译出来的设备树可是根据fpga生成的xsa编译出来的,肯定是对的,而且包含了uartlite设备节点,所以必须得和这个设备树保持相同。回过头查看image/linux文件夹,有个system.dtb,使用这个dtb制作image.ub下载到板子上就和使用petalinux指令编译出来的image.ub一样了,说明这个system.dtb是对的。所以还需要把dts找出来,这样才方便单独编译内核和设备树。在
/components/plnx_workspace/device-tree/device-tree目录里有dts和dtsi文件,
在这里插入图片描述
可以对比内核源码下对应zcu111板子得dts,发现有同名的,对比了下内容,zcu111-reva.dtsi、zynqmp.dtsi里相差不大,zynqmp-clk-ccf.dtsi则完全相同,差异就在pl.dtsi(这个dtsi里涉及得就是fpga端生成得IP供arm使用)、system-conf.dtsi、system-top.dts,所以把这些差异在内核源码得dts中修改,然后再编译,下载到板子上就相同了。最终我是使用uartlite,应用程和使用正常串口相同。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值