背景
使用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,应用程和使用正常串口相同。