从零开始:利用Petalinux为Zynq平台构建定制化Linux系统

一文说清PetaLinux如何适配Zynq-7000架构 深入讲解PetaLinux在Zynq-7000架构上的完整适配流程,涵盖工程创建、配置裁剪与系统构建等关键步骤,帮助开发者高效掌握PetaLinux定制化开发技巧。 阅读详情

1. 环境准备:搭建你的Petalinux“厨房”

想给Zynq开发板“烹饪”一套专属的Linux系统,第一步不是直接开火,而是要把“厨房”——也就是你的开发环境——给收拾利索。这就像做菜前得先备齐锅碗瓢盆和食材一样。很多新手朋友一上来就卡在环境配置上,其实没那么复杂,跟着我一步步来,踩过的坑我都帮你填平了。

首先,你得有一台运行Linux的电脑。我强烈推荐使用Ubuntu 20.04 LTS,这是经过Xilinx官方验证、社区支持最广泛的版本,能最大程度避免一些稀奇古怪的依赖问题。别用太新的发行版,比如Ubuntu 22.04,有时候工具链兼容性会出问题,折腾起来很费时间。电脑配置上,内存建议16GB以上,硬盘空间至少留出100GB。别嫌多,Petalinux编译过程中会产生大量的中间文件,而且后续的工程文件也不小,空间不足会导致编译直接失败,那感觉就像炒菜炒到一半没气了。

接下来就是安装Petalinux工具本身。你需要去Xilinx官网下载对应版本的安装包,比如2021.1或者2022.1。这里有个关键点:Petalinux的版本必须和你的Vivado设计套件版本严格匹配。如果你用Vivado 2021.1设计的硬件,那么Petalinux也必须用2021.1。版本不匹配就像用螺丝刀去拧六角螺母,根本对不上。下载完那个巨大的.run文件后,给它加上执行权限,然后运行安装脚本。我建议你把它安装到/opt/pkg/petalinux这样的目录下,方便管理。

安装完成后,最重要的一步来了:设置环境变量。每次打开新的终端窗口,想要使用Petalinux命令,都必须先“激活”它的环境。命令很简单:

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

请把路径换成你自己的实际安装路径。这个命令的作用,是告诉系统:“嘿,Petalinux的工具链都在这里,请把它们加入到当前可用的命令列表中。” 你可以把这条命令加到你的~/.bashrc文件末尾,这样每次打开终端就自动设置好了,省去每次手动输入的麻烦。不过,对于初学者,我建议先手动执行几次,熟悉这个过程。

最后,检查一下依赖包是否齐全。Petalinux安装脚本通常会帮你安装大部分依赖,但有时网络或系统原因会导致遗漏。你可以运行Petalinux安装目录下的petalinux-util工具来检查,或者手动安装一些常见的库,比如build-essential, libncurses5-dev, flex, bison等。确保这些基础“食材”都到位,我们才能开始真正的“烹饪”。

2. 工程创建与硬件描述导入:给你的系统“定个基调”

环境准备好了,现在可以动手创建我们的第一个Petalinux工程了。这个过程就像是决定要做什么菜系,川菜、粤菜还是西餐?不同的硬件平台(模板)决定了系统的基础风味。

创建工程的命令核心是petalinux-create。对于Zynq-7000系列芯片,我们使用zynq模板:

petalinux-create -t project --template zynq -n my_first_linux

这里的-n后面跟着的就是你的工程名字,比如my_first_linux。执行成功后,当前目录下会生成一个同名文件夹,里面就是工程的“骨架”。进去看看,你会发现几个关键目录:components存放各种软件包,project-spec存放工程的具体配置,images未来会存放编译生成的镜像文件。这个结构很清晰,Xilinx已经帮你规划好了。

但是,光有骨架不行,你得告诉Petalinux,这个系统是要跑在哪块具体的板子上。这就是导入硬件描述文件(.hdf或.xsa文件)的作用。这个文件是从你的Vivado工程里导出的,它包含了Zynq芯片PS(处理器系统)的配置、PL(可编程逻辑)中设计的IP核信息、内存地址分配、外设引脚定义等等。简单说,它就是你这块开发板的“数字身份证”和“电路蓝图”。

导入命令如下:

cd my_first_linux
petalinux-config --get-hw-description /path/to/your/hardware_description_file.xsa

请将/path/to/your/替换成你.xsa文件的实际路径。执行这个命令后,Petalinux会做几件重要的事:首先,它会解析这个硬件文件,获取所有硬件信息;然后,它会启动一个图形化的配置界面(基于menuconfig);最重要的是,它会根据硬件信息,自动生成一个基础的设备树(Device Tree)。设备树是Linux内核用来识别硬件的关键文件,有了这个自动生成的底子,我们后续修改起来就轻松多了。

第一次进入这个配置界面,你可能会觉得眼花缭乱。别慌,我们一步步来。界面主要靠方向键和回车操作。这里我分享几个初期必须关注的配置项:

  • Subsystem AUTO Hardware Settings:这里能看到从硬件文件导入的配置,比如处理器时钟、DDR内存大小和地址。通常不需要动,除非你确信硬件设计有改动。
  • Image Packaging Configuration:这里选择根文件系统的存储位置。默认是INITRAMFS,意思是将根文件系统打包进内核镜像(image.ub)里。这对于初期调试非常方便,因为只需要一个文件就能启动。等系统稳定后,你可以考虑改成从SD卡或网络挂载(SD card或NFS),这样可以获得更大的根文件系统空间。
  • Serial Settings:设置用于控制台输出的串口。这里必须和你硬件设计中使用的UART端口号匹配(通常是ps7_uart_1)。波特率一般保持默认的115200即可。

配置完成后,选择Save保存,然后退出。至此,你的Petalinux工程就已经和具体的硬件绑定好了,有了一个非常可靠的起点。这一步的自动配置功能是Petalinux最大的优势之一,它把最繁琐、最容易出错的硬件适配工作帮你完成了大半。

3. 深度定制Linux内核:打造系统的“核心引擎”

如果说硬件描述文件定义了身体的骨架,那么Linux内核就是系统的大脑和中枢神经。Petalinux允许我们对这个“大脑”进行深度定制,决定它支持哪些功能、驱动哪些设备、采用何种调度策略。定制内核的命令是:

petalinux-config -c kernel

这会进入内核的menuconfig配置界面。这里的选项多达几千个,对新手来说确实是个挑战。我的建议是:第一次,什么都不要改,直接保存退出。因为Petalinux根据你的硬件描述,已经预设了一套能保证基本启动的合理配置。先让系统跑起来,获得正反馈,这比一开始就深陷配置海洋重要得多。

当你成功启动过一次之后,就可以开始尝试一些定制了。内核配置主要分为几个大类:

  • 通用设置(General setup):可以设置本地版本号,这样编译出的内核版本信息会带有你的自定义后缀,便于区分。
  • 处理器类型与特性(Processor type and features):对于Zynq,这里主要是ARM相关的配置,比如是否启用高级SIMD(NEON)扩展以加速浮点运算,内核的虚拟地址空间大小等。通常保持默认即可。
  • 设备驱动(Device Drivers):这是最庞大、也最常修改的部分。你可以在这里启用或禁用特定的硬件驱动。比如,如果你的板子上有额外的以太网PHY芯片、音频编解码器、特定的传感器等,就需要在这里找到对应的驱动并编译进内核(*)或编译为模块(M)。
  • 文件系统(File systems):决定内核支持读写哪些格式的磁盘。例如,如果你希望系统能挂载Windows格式的U盘,就需要勾选VFAT (Windows-95) fs support。对于嵌入式系统,CRAMFS、SQUASHFS这些只读压缩文件系统也很有用,可以节省存储空间。
  • 网络支持(Networking support):配置网络协议栈、防火墙、无线网络等。

如何找到需要的配置项?menuconfig界面顶部有一个搜索功能,按/键,然后输入关键词,比如USB、I2C,它能帮你快速定位。一个实用的技巧是:当你不确定某个驱动是否被需要时,可以将其编译为模块(M),而不是直接编译进内核(*)。模块是可以在系统启动后动态加载和卸载的驱动,这样既能保持内核精简,又保证了灵活性。编译出的模块文件(.ko)会放在根文件系统中。

修改配置时一定要小心,禁用某些关键选项(比如对应你存储设备的块设备驱动、串口驱动)会导致系统根本无法启动。每次修改前,最好能记录下更改了哪些地方,方便出问题时回溯。内核定制是个需要反复尝试和积累经验的过程,别怕失败,多编译几次就熟悉了。

4. 构建根文件系统与设备树:填充系统的“血肉与感知”

内核是引擎,但一个完整的系统还需要应用程序、库文件、配置脚本等,这些共同构成了根文件系统(Rootfs)。同时,系统如何“感知”到具体的硬件设备,就需要设备树(Device Tree)来描述了。

根文件系统定制:运行petalinux-config -c rootfs,你会进入根文件系统的配置界面。这里你可以选择需要安装的软件包,比如:

  • 基础工具:busybox提供了大部分常用命令(ls, cp, mkdir等),这是必须的。
  • 网络工具:dropbear(轻量级SSH服务器),这样你就可以通过网络登录开发板了;iperf3用于测试网络带宽。
  • 调试工具:gdb(调试器)、strace(系统调用跟踪器),这些对后期调试程序非常有帮助。
  • 语言支持:比如python3,如果你需要在板子上运行Python脚本。
  • 自定义软件包:你甚至可以把自己编写的应用程序添加到这个列表中,让Petalinux在构建时一并编译和打包进去。

我的经验是,初期不要贪多,只选择必要的包,让根文件系统尽可能小,这样编译快,启动也快。等系统稳定后,再按需添加。Petalinux使用Yocto/OpenEmbedded作为其构建系统的基础,所以软件包的管理非常强大和灵活。

设备树定制:设备树是连接硬件描述和Linux内核驱动的桥梁。Petalinux已经根据你的.xsa文件生成了一个基础的设备树(.dts文件),它位于project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi。我们所有的自定义设备树修改,都应该写在这个文件里,而不是去修改自动生成的文件。因为自动生成的文件在每次重新导入硬件描述时都可能被覆盖,而system-user.dtsi中的内容会被自动追加进去,受到保护。

什么时候需要修改设备树?常见场景有:

  1. 添加自定义IP核:你在PL(FPGA)部分设计了一个自定义的AXI接口IP,比如一个LED控制器或ADC采集器。你需要在这里为这个IP添加一个设备节点,指定它的寄存器地址范围、中断号等信息。
  2. 修改外设参数:比如调整I2C总线速率、修改SPI模式、或者为某个GPIO引脚指定一个更有意义的名称(如&gpio0 12 -> “led0-gpio”)。
  3. 禁用或启用某些外设:硬件设计中有某个外设,但你暂时不想在Linux中使用,可以在这里将其状态(status)设置为“disabled”。

一个简单的添加LED设备节点的例子:

/ {
    my_leds {
        compatible = "gpio-leds";
        led0 {
            label = "heartbeat";
            gpios = <&gpio0 55 0>; /* 使用GPIO bank 0的第55个引脚,低电平有效 */
            linux,default-trigger = "heartbeat";
        };
    };
};

修改完设备树后,无需单独编译,在后续的整体工程编译(petalinux-build)中,Petalinux会自动处理设备树的编译和打包。

5. 编译、打包与启动测试:见证系统“诞生”的时刻

经过前面的配置,终于到了最激动人心的编译和启动环节。这个过程虽然耗时,但每一步都有明确的意义。

编译工程:在工程根目录下,执行petalinux-build。这个命令会依次执行以下工作:

  1. 编译你定制的Linux内核。
  2. 根据根文件系统配置,构建或交叉编译所有选中的软件包。
  3. 编译U-Boot引导程序。
  4. 编译First Stage Bootloader(FSBL)。
  5. 编译设备树源文件(.dts)为二进制文件(.dtb)。
  6. 将所有组件打包成最终的可启动镜像。

第一次编译可能会花费30分钟到2小时不等,取决于你的电脑性能和选择的软件包数量。泡杯咖啡,耐心等待。编译成功后,所有生成的文件都会放在images/linux/目录下。这里有几个关键文件:

  • image.ub:这是一个FIT(Flattened Image Tree)镜像,它内部打包了内核镜像(Image)、设备树二进制文件(system.dtb)以及初始内存盘(rootfs.cpio.gz.u-boot,即根文件系统)。这是Petalinux默认生成的、最常用的启动镜像。
  • BOOT.BIN:Zynq芯片上电后,首先由固化在芯片内部的BootROM加载执行的文件。它内部又包含了FSBL、FPGA的比特流文件(.bit)和U-Boot。它的制作我们稍后专门讲。
  • u-boot.elf:U-Boot引导加载程序的ELF文件。
  • zynq_fsbl.elf:第一级引导加载程序。

制作BOOT.BIN:虽然petalinux-build会生成BOOT.BIN,但有时我们需要手动指定不同的组件。例如,你想使用一个自己修改过的U-Boot,或者更新了PL端的比特流文件。手动打包命令如下:

petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/system.bit --u-boot images/linux/u-boot.elf

这个命令会读取指定的fsbl、bit和u-boot文件,将它们打包成一个BOOT.BIN。--force参数可以强制覆盖已存在的文件。

启动测试:将SD卡格式化为FAT32格式(注意,Zynq的BootROM只支持从FAT分区读取BOOT.BIN)。然后,把images/linux/目录下的BOOT.BIN和image.ub两个文件拷贝到SD卡的根目录。把SD卡插入开发板,设置启动模式为SD卡启动(通过开发板上的跳线帽设置),最后上电。

打开串口终端软件(如minicom或picocom),设置好正确的串口设备和波特率(115200)。如果一切顺利,你将看到U-Boot的启动信息飞快地滚动,紧接着Linux内核开始解压、初始化,最后出现登录提示符。Zynq Petalinux工程的默认用户名和密码都是root。当看到root@my_first_linux:~#这样的命令行提示符时,恭喜你,一个完全由你定制的Linux系统已经在Zynq平台上成功运行了!这一刻的成就感,是驱动我们继续深入探索嵌入式Linux世界的最佳动力。你可以尝试运行ls、ifconfig等命令,感受这个属于你自己的微小世界。

从零开始:基于Petalinux的ZYNQ嵌入式Linux系统定制指南 本文详细介绍了从零开始基于Petalinux定制ZYNQ嵌入式Linux系统的完整流程,包括环境准备、硬件工程创建、Petalinux工程配置、内核定制、根文件系统定制、设备树修改、系统编译与打包等关键步骤。通过实战案例演示如何添加自定义驱动,帮助开发者快速掌握ZYNQ嵌入式Linux系统开发的核心技术。 阅读详情

相关推荐

从零开始:用PetaLinux为Zynq-7000创建你的第一个‘Hello World’ Linux系统镜像

本文详细介绍了如何使用PetaLinux为Xilinx Zynq-7000开发板创建并运行一个包含‘Hello World’程序的最小Linux系统镜像。从项目初始化、用户态程序添加、系统配置到构建验证,提供了全流程的实战指导,帮助开发者快速入门嵌入式Linux开发。

weixin_30905133的博客 344

ZYNQ实战:Petalinux定制化Linux系统开发全流程解析

本文详细解析了基于Xilinx ZYNQ平台,使用Petalinux工具进行定制化Linux系统开发的全流程实战。从开发环境搭建、硬件描述文件导入,到内核配置、根文件系统定制、设备树修改,再到最终的系统编译、打包与SD卡部署,提供了完整的步骤指南和实用技巧,帮助开发者高效构建与专属硬件匹配的嵌入式Linux系统。

red88的博客 1109

ZYNQ平台Linux环境下的AXI-CAN驱动开发全流程解析

本文详细解析了在ZYNQ异构平台上进行AXI-CAN驱动开发的完整流程。从Vivado硬件IP核配置、Petalinux工程搭建与内核驱动使能,到设备树节点编写、系统镜像构建,最后在Linux环境下完成接口配置与通信测试。重点阐述了如何利用FPGA的灵活性实现多路CAN通道,并提供了从硬件设计到软件调试的全链路实战指南,帮助开发者高效完成工业控制与汽车电子领域的CAN总线通信系统开发。

zz67890的博客 1113

从零开始:Petalinux与ZYNQ设备树深度定制指南

本文是一份针对ZYNQ平台的Petalinux设备树深度定制实战指南。文章从工程创建、基础语法入手,详细讲解了如何为GPIO外设、I2C设备及自定义PL IP添加设备树节点,并提供了编译调试与常见问题排查方法,旨在帮助开发者彻底掌握ZYNQ硬件与Linux内核的配置桥梁,实现真正的软硬件协同设计。

salt9的博客 729

Vitis中构建Zynq Linux系统的超详细版教程

手把手教你使用vitis搭建Zynq平台的Linux系统,涵盖从工程创建到镜像生成的每一步操作细节,适合嵌入式开发者快速掌握vitis在实际项目中的应用。

weixin_36212459的博客 611

PetaLinux下Zynq-7000 PS端外设配置超详细版教程

深入讲解PetaLinux环境下Zynq-7000系列芯片PS端外设的完整配置流程,涵盖从工程创建到外设启用的每一步操作细节,帮助开发者高效掌握petalinux在嵌入式开发中的实际应用。

weixin_36289742的博客 1236

Petalinux实战:从零开始为Zynq-7000定制Linux系统(附完整命令清单)

本文提供了一份详尽的Petalinux实战指南,手把手教你从零开始为Zynq-7000平台定制Linux系统。内容涵盖环境部署、硬件描述文件导入、内核与根文件系统深度定制,并附有完整的命令清单和SD卡启动配置技巧,旨在帮助开发者高效完成系统构建,避开常见陷阱。

nginx7reverse的博客 426

PetaLinux新手入门:用Zynq-7000开发板创建你的第一个Linux系统镜像(含QEMU仿真)

本文详细介绍了如何使用PetaLinux工具链在Zynq-7000开发板上创建和定制Linux系统镜像,包括开发环境准备、项目创建、系统组件定制以及QEMU仿真验证。通过实战步骤和常见问题解决方案,帮助嵌入式开发者快速上手Xilinx平台,实现高效的Linux系统开发与调试。

weixin_30247307的博客 420

从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析

ZYNQ系列芯片集成了ARM处理器和FPGA(可编程逻辑单元),正是因为由于ARM处理器的存在,所以我们可以在ZYNQ系列芯片上面运行Linux系统。在ZYNQ系列芯片上运行Linux会给我们带来很多优势:首先,我们可以将部分逻辑处理(比如信号处理、数据流控制等)放到FPGA中,剩下的操作交给ARM处理器执行。这样,硬件和软件可以无缝协同,优化整体系统效率;其次,运行Linux意味着可以使用Linux的丰富生态和开源资源。你可以利用大量的开源软件、驱动、工具和库,减少开发成本并加速开发周期。

weixin_55796564的博客 2865

PetaLinux新手教程:从安装到第一个项目的完整流程

手把手带你完成PetaLinux的安装配置,快速创建第一个嵌入式项目,深入掌握petalinux工具的核心操作流程,适合初学者快速上手Zynq开发。

weixin_42592399的博客 1252

PetaLinux超详细版教程:项目创建与配置入门

深入讲解PetaLinux项目从零开始的创建与系统配置流程,涵盖核心操作步骤与常见问题解决,帮助开发者快速掌握PetaLinux开发环境搭建的关键技术。

weixin_34511754的博客 951

从零到一:在PetaLinux上为ZYNQ 7020构建EPICS控制系统的避坑指南

本文详细介绍了在PetaLinux环境下为ZYNQ 7020平台构建EPICS控制系统的完整流程与关键注意事项。重点解析了静态链接库的创建与集成策略、EPICS IOC的配置编译技巧,以及系统集成调试中的常见问题解决方案,帮助开发者高效实现FPGA与ARM处理器的软硬件协同控制。

efc123456的博客 571

ZYNQ PS端开发全流程解析:从Vivado硬件配置到Linux系统构建

在嵌入式系统与异构计算领域,FPGA与处理器的协同设计已成为实现高性能、低功耗解决方案的关键技术。其核心原理在于通过软硬件协同,将复杂控制、操作系统任务交由处理系统(PS)处理,而将高速数据流、定制化算法交由可编程逻辑(PL)加速,从而充分发挥异构架构的优势。这种设计模式的技术价值在于显著提升了系统的实时性、能效比和灵活性,广泛应用于工业控制、通信基础设施、边缘AI等场景。本文聚焦于Xilinx ZYNQ平台的PS端开发,深入剖析其**工具链分工**与**完整开发链路**,涵盖从Vivado硬件定义、Vit

weixin_29168153的博客 227

ZYNQ学习之路13.创建PetaLinux工程

在前面的学习中,我们知道如何根据PetaLinux BSP设计去创建一个工程,现在,我们结合Vivado设计我们自己PetaLinux系统。 开发环境:Ubuntu16 64bit, PetaLinux 2018.2, Vivado 2018.2 硬件环境:米尔科技Zturn board(XC7Z010) 一、配置硬件环境 1.1 创建硬件工程 Zynq-7000运行嵌入式Linux系统要求至少包含以下硬件外设: 一个Triple Timer Counter(TTC) 至少32MB内存 串口

亦梦云烟的博客 3106

从零构建:AD9361与ZYNQ的SDR系统实战指南

本文详细介绍了如何从零构建基于AD9361与ZYNQ的软件无线电(SDR)系统,涵盖硬件选型、开发环境配置、信号处理算法实现及实战案例。AD9361与ZYNQ的组合为SDR应用提供了高性能射频前端和灵活的数字信号处理平台,适用于从FM收音到QPSK调制等多种无线通信场景。

win55的博客 695

从零到一:用PetaLinux为你的Zynq-7000开发板创建第一个可启动Linux镜像

本文详细介绍了如何使用PetaLinux工具为Xilinx Zynq-7000开发板创建可启动的Linux镜像。从环境准备、项目配置到系统构建和测试,提供了一步一步的指导,帮助开发者快速上手嵌入式Linux开发。特别适合初次接触Zynq平台的开发者,30分钟内即可完成首个可启动镜像的创建。

weixin_30321709的博客 361
上一篇: awk进阶指南:从基础语法到自定义函数,解锁文本处理的全新姿势
下一篇: MATLAB bar函数高级应用:从基础绘图到定制化美化
寂静夜空35
博客等级 码龄3年 59粉丝 1797原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值