ZYNQ #0 petalinux的使用与工程建立

2 篇文章 6 订阅

对了,我最近开通了微信公众号,计划是两边会同步更新,并逐步的会将博客上的文章同步至公众号中。
感兴趣的朋友可以扫描下方的二维码或者搜索“里先森sements”来关注,欢迎来玩~!
 


目录

1 - petalinux 2018.3版本

1.1 - 前言

1.2 - 建立petalinux工程

1.3 - petalinux读取 *.sdk 文件夹硬件信息

1.4 - 设置SD根文件系统从SD卡载入

1.5 - 使用外部的linux源码进行编译

1.6 - 配置Linux内核

1.7 - 编译

1.8 - 生成BOOT.BIN及image.ub文件

1.9 - TF卡制作备用

1.10 - 在板上运行

1.X - 附录(一些可能碰到的问题)

2 - petalinux 2020.1

2.1 - 导入硬件配置

 2.2 - 使用外部linux源码进行编译

参考


1 - petalinux 2018.3版本

1.1 - 前言

手头有块黑金AX7010的板子,这个板子附带的资料里面带有的kernel和uboot(黑金针对自己的开发板修改过的)版本实在太老,全是2017年的版本,在学习按照给的PDF里的流程,利用其提供的kernel和uboot进行编译的时候各种报错。9102年了,如果还要我去想办法去换开发环境兼容老东西来进行学习实在是太头疼了,于是转而使用xilinx官方的petalinux进行zynq7000上的linux环境搭建。

petalinux是xilinx官方推出的一个快速便利的搭建zynq系列fpga片上ps(processing system)端的linux环境搭建的软件,在官网上可以免费的下载安装(https://china.xilinx.com/support/download/index.html/content/xilinx/zh/downloadNav/embedded-design-tools.html)。这篇博文将介绍一下如何使用petalinux进行工程建立(不会介绍如何进行petalinux的安装)。环境的搭建和一些必要的资源如下所示:

  • ubuntu 16.04.4         (安装在vmplayer虚拟机中,petalinux对系统版本有严格要求
  • petalinux 2018.3      (安装在/opt/pkg/petalinux文件夹下)
  • UG1144 - PetaLinux Tools Documentation: Reference Guide (v2018.3)   (参考文档,可以下载下来备用)
  • linux_rtc.sdk               (vivado工程生成比特流文件,并导出硬件【export hardware】生成的*.sdk文件夹,在本文中依此建立后面的petalinux)

安装完petalinux后的磁盘占用

1.2 - 建立petalinux工程

载入petalinux环境

$ source /opt/pkg/petalinux/settings.sh

建立petalinux工程,命名为lee_linux

$ petalinux-create --type project --template zynq --name lee_petalinux

完毕后,工程目录如下所示

1.3 - petalinux读取 *.sdk 文件夹硬件信息

进入lee_linux目录,让petalinux读取 *.sdk 文件夹,自动载入硬件信息,这里 *.sdk 文件夹就在上一级目录

$ cd lee_petalinux/
$ petalinux-config --get-hw-description=/home/sements/Desktop/developArea/FPGA/workspace/linux_rtc.sdk

1.4 - 设置SD根文件系统从SD卡载入

执行上面命令后,会自动打开配置窗口,在 Image Packaging Configuration --> Root filesystem type 选项中选择 SD card,把根文件系统放在 SD 卡中,方向键选择下方保存,然后退出。

注意,这里保存不要修改其默认文件名

1.5 - 使用外部的linux源码进行编译

除了让petalinux自动联网到xilinx的github上下载linux源码,我们也可以指定一个linux源码。但是注意,目前版本的petalinux对于下载的linux源码版本检测十分严格,请在下载时根据petalinx的版本下载对应的linux源码(在xilinx的linux-xlnx的github页面,选择tag,选择你需要的版本。或者使用git)

解压linux源码,普通用户

$ unzip -o linux-xlnx-xlnx_rebase_v4.14_2018.3.zip -d /home/sements/Desktop/developArea/FPGA/xilinx-official/

在petalinux-config中进行配置,选用外部linux源码进行编译,

Linux Components Selection -> linux-kernel选择ext-local-src。

新增的External linux-kernel local source settings选项内填入你的linux源码完整路径

1.6 - 配置Linux内核

执行指令,配置linux内核

$ petalinux-config -c kernel
  • 配置CH340、CP210X串口驱动

- Device Drivers → USB support → USB Serial Converter support按y,回车进入。在CP210x和ch341前面按y。

  • 配置USB摄像头驱动

- 选项 Device Drivers ---> Multimedia support ---> Media USB Adapters ---> 中使能 USB Video Class (UVC)

保存退出

注意,这里保存不要修改默认的 .config 文件名

1.7 - 编译

$ petalinux-build

1.8 - 生成BOOT.BIN及image.ub文件

$ petalinux-package --boot --fsbl --fpga --u-boot --force

petalinux-package --boot  用于打包生成BOOT.BIN文件

--fsbl  指令指定加入FSBL(First Store Block Load)文件,其默认指定文件路径是 images/linux/zynq_fsbl.elf,这个文件是petalinux执行编译命令后自动生成的

--fpga  指令指定加入FPGA比特流文件(bitstream image),其默认指定文件路径是 images/linux/*.bit , 这个文件是前面vivado编译生成比特流文件并在导出硬件时一同导入到 *.sdk 文件夹中的 *.bit 文件。在petalinux-config --get-hw-description时会从 *.sdk 文件夹中复制到默认路径并重命名为system.bit

--u-boot 指令指定将u-boot文件打包到BOOT.BIN中,其默认指定文件路径是 images/linux/u-boot.elf 这个文件是petalinux执行编译命令后自动生成的

--force  指令指定允许覆盖之前已生成过的BOOT.BIN文件

更多的介绍可以通过 petalinux-package --boot --help查看

执行后我们可以在 images/linux文件夹下看到BOOT.BIN和image.ub文件了。

关于image.ub

image.ub文件是一个复合文件,其将设备树dtb文件包含在内部,故我们在拷贝文件时只需要拷贝BOOT.BIN与image.ub。BOOT.BIN是为PL启动时服务的,image.ub是PL启动完成,FSBL调用uboot启动后服务的。

详情可以参考:How do I create image.ub? - Community Forums:

摘录部分回答如下:

“image.ub = peta Linux image consists of kernel image, device tree blob and minimal rootfs”

"The image.ub is a FIT image which is documented in the u-boot tree (doc/uImage.FIT)"

关于 FIT 文件的介绍,可以参考 wowotech 的这篇文章:u-boot FIT image介绍

1.9 - TF卡制作备用

我的AX7010开发板能插入TF卡,并且在 linux_rtc.sdk的vivado工程中已经将tf卡连接到PS内核。

插入TF卡到开发机,在虚拟机上挂载TF卡

运行gparted工具,将全卡格式化。然后新建一个FAT32格式分区,命名为FAT,大小约1000M即可,用于存放BOOT.BIN及image.ub文件。再在FAT分区后新建EXT4格式分区,命名为EXT,大小占用剩余TF卡上空间,用于存放文件系统。

将BOOT.BIN文件和image.ub文件放到FAT分区中。

将根文件系统放入EXT分区中,这里我使用之前制作好的给IMX6用的ubuntu根文件系统(https://blog.csdn.net/sements/article/details/88086468

卸载TF卡

注意,这里卸载的时候会提示暂时无法弹出TF卡,因为从开发机复制文件到TF卡并没有实际写入TF卡上,而是直接写在磁盘缓存上,在卸载的时候会将这些磁盘缓存真正的写入TF卡上。可以使用sync命令来写入,写入完毕再卸载TF卡。这很耗时,具体时长取决于你自己放入TF卡的根文件系统大小

1.10 - 在板上运行

将TF卡插入FPGA开发板,插上调试串口(这里我vivado工程也已经连接好到PS核了),上电即可从tty调试窗口看到linux启动信息

1.X - 附录(一些可能碰到的问题)

  • 无论碰到什么问题,先看看log,方便快速定位

在编译失败时,会输出如上的提示信息,在编译错误时养成先查看log是一个快速定位问题的好习惯

  • petalinux-build时报错 set KERNEL_VERSION_SANITY_SKIP="1" in your recipe.。

这是由于petalinux版本与用户指定编译用的linux版本不匹配造成的(在本博文的流程中不会这样,因为按照的是默认设置,其会从网络上下载合乎版本的linux,这里是我安装petalinux 2018版本,指定用黑金提供的2017版本的linux源码时出现的问题)

解决方法有两种:

第一种,

在工程目录/project-spec/meta-plnx-generated/recipes-kernel/linux/ linux-xlnx_%.bbappend文件内加入KERNEL_VERSION_SANITY_SKIP="1"

参考https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-bsp/recipes-kernel/linux/linux-xlnx-dev.bb

第二种,其实应该是真正的根源解决,第一种方法中的/project-spec/meta-plnx-generated/recipes-kernel/linux/ linux-xlnx_%.bbappend文件是petalinux-build时生成的,其是根据/ project-spec/meta-user/recipes-kernel/linux/ linux-xlnx_%.bbappend文件生成的,所以只要在编译前在/ project-spec/meta-user/recipes-kernel/linux/ linux-xlnx_%.bbappend文件内加入KERNEL_VERSION_SANITY_SKIP="1"即可

  • do_populate_lic: QA Issue: linux-xlnx: The LIC_FILES_CHKSUM does not match

large?v=1.0&px=999

这也是由于petalinux版本与用户使用的linux版本不一致造成的,这里我是从xilinx的官方github下载的linux源码(https://github.com/Xilinx/linux-xlnx),可是我安装的petalinux是2018.3版本的,而我使用git clone直接获取到的源码版本并不是,所以需要对linux源码版本进行切换

git checkout xlnx_rebase_v4.14_2018.3
git pull  https://github.com/Xilinx/linux-xlnx.git xlnx_rebase_v4.14_2018.3

不通过git clone下载也可以,直接在github上先选择版本与你petalinux版本对应的linux branch,然后下载压缩包再到虚拟机中解压即可。

可以参考以下两个回答:

2 - petalinux 2020.1

相比于 2018 以及 2019 版本,petalinux 2020.1版本作为vitis套件中的一环,做出了部分改动,但是大致流程与前述版本基本一致。这里主要记录几点在petalinux 2020.1版本中需要注意的地方。

2.1 - 导入硬件配置

在2020.1版本中,petalinux接受的是 vivado 2020.1 导出的 .xsa(Xilinx Shell Archive)文件,关于vitis同一软件平台的概览,可以查看我的这篇博客(ZYNQ #6 - Vitis统一软件平台概览

petalinux-config --get-hw-description <.xsa文件目录>

 2.2 - 使用外部linux源码进行编译

petalinux 2020.1中,官方kernel源码升级到了linux 5.9版本,但是由于我使用的 digilent_encoder 驱动只支持4.x的版本,为此需要使用 xilinx的4.x版本源码进行编译。

通过 git clone 将赛灵思的linux复制到本地,使用 git checkout 切换至需要的分支,这里我使用的是 xlnx_rebase_4.19_2019.2分支。

为了避免校验文件出错等问题,建议使用 git clone 再 checkout分支的方式来切换源码,不建议直接在 github 上下载zip压缩包 

按照惯例,在 petalinux 中使用与当前版本不一致的源码前,需要在 project-spec/meta-user/recipes-kernel/linux 文件夹, linux-xlnx_%.bbappend 文件中添加

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"

KERNEL_VERSION_SANITY_SKIP = "1"

在 2020.1 版本的 petalinux 中,若你的 petalinux-config → DTG 配置保持默认的 template 选项,工具不会自动新建 project-spec/meta-user/recipes-kernel/linux 文件夹,我们需要手动创建、添加 linux-xlnx_%.bbappend 文件

可以查看 project-spec/meta-user/下的 config 文件,可以看到其默认将当前文件夹下的所有 recipes-* 格式的文件夹都纳入编译,因此我们新建的文件夹才可以被 bitbake 搜索到

参考

救救穷学生,5毛吃个辣条

  • 9
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
### 回答1: Zynq双核指的是Zynq系统中的两个处理器核心,一个是Arm Cortex-A9处理器核,另一个是可编程逻辑(FPGA)。Petalinux是一个基于Linux的操作系统,可用于Zynq系统的开发。裸机指的是没有操作系统的程序,只在硬件上运行。 在Zynq双核系统中,Petalinux和裸机可以通过多种方式通信: 1. 通过寄存器:Petalinux可以读取和写入FPGA寄存器,从而与裸机进行通信。 2. 通过内存映射:Petalinux和裸机可以共享相同的物理内存区域,从而进行通信。 3. 通过中断:Petalinux可以通过发送中断请求给裸机,从而与裸机进行通信。 4. 通过串口:Petalinux和裸机可以通过串口进行通信,Petalinux可以发送数据给裸机,裸机可以通过串口返回数据给Petalinux。 总的来说,Petalinux和裸机的通信方式取决于具体的应用场景和系统架构。 ### 回答2: Zynq是一款集成了ARM处理器和可编程逻辑的片上系统,使用Petalinux可实现对该芯片的Linux操作系统进行定制和开发。在Zynq双核系统中,可以使用Petalinux和裸机方式进行通信。 要在Petalinux和裸机之间进行通信,有多种方法可以选择。以下是一种常用的方法: 1. 通过共享内存(Shared Memory)进行通信:在Petalinux中,可以使用mmap函数将一块物理内存映射到用户空间,然后将这块内存的地址传递给裸机程序。裸机程序可以通过访问该地址来读写共享内存。这种方式可以实现高速的数据传输,但需要保证共享内存的同步和互斥机制,以避免数据冲突和竞争条件。 2. 通过中断(Interrupt)进行通信:Petalinux可以通过中断控制器向裸机程序发送中断请求。裸机程序需要编写中断服务程序来处理中断,并进行相应的数据处理或响应。通过中断方式可以实现异步的通信,但需要在裸机和Petalinux中进行中断控制和数据传输的协议设计。 3. 通过设备驱动程序进行通信:在Petalinux中编写设备驱动程序,将裸机中需要访问的硬件资源封装成设备节点,然后通过设备文件进行读写操作。裸机程序可以通过访问设备文件来与Petalinux进行通信。这种方式需要在Petalinux中编写设备驱动程序,并实现对硬件资源的访问和控制。 无论使用哪种通信方式,都需要在Petalinux和裸机程序中进行相应的配置和编程。同时,还需要考虑通信的同步、互斥和错误处理等方面,以保证通信的可靠性和稳定性。 ### 回答3: Zynq是一款由Xilinx开发的可编程SoC(系统级芯片),它集成了双核处理器和可编程逻辑电路,并支持多种外设接口和通信协议。Petalinux是一种基于Linux系统的嵌入式开发平台,可以在Zynq芯片上运行。 要实现Zynq双核与裸机之间的通信,可以通过以下几种方式: 1. 共享内存:在Petalinux系统中,可以通过在内存中定义一块共享区域,使双核处理器和裸机都能够访问此共享内存。双核处理器可以通过操作系统提供的共享内存接口进行读写,而裸机则需要通过硬件访问控制器来操作共享内存。 2. 中断:通过设置中断控制器,在Petalinux中,双核处理器和裸机都可以注册相应的中断处理函数。当需要通信的一方发生事件时,通过触发中断来通知另一方。中断处理函数中可以进行数据的读写操作。 3. 外设寄存器:Zynq芯片上的可编程逻辑部分可以通过外设寄存器与双核处理器和裸机进行通信。Petalinux系统中,双核处理器可以通过内核驱动来访问外设寄存器,而裸机则可以直接通过寄存器操作指令来读写外设寄存器。 需要注意的是,双核处理器和裸机之间的通信需要进行同步和互斥操作,以避免数据冲突和竞争条件的发生。在设计通信协议时,需要考虑数据格式、通信速率、错误处理等方面的问题,并进行相应的数据校验和纠错处理。 总的来说,Zynq双核与裸机之间的通信可以通过共享内存、中断和外设寄存器等方式实现。具体的实现方式要根据具体的应用场景和需求来选择和设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值