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中的内容会被自动追加进去,受到保护。
什么时候需要修改设备树?常见场景有:
- 添加自定义IP核:你在PL(FPGA)部分设计了一个自定义的AXI接口IP,比如一个LED控制器或ADC采集器。你需要在这里为这个IP添加一个设备节点,指定它的寄存器地址范围、中断号等信息。
- 修改外设参数:比如调整I2C总线速率、修改SPI模式、或者为某个GPIO引脚指定一个更有意义的名称(如
&gpio0 12->“led0-gpio”)。 - 禁用或启用某些外设:硬件设计中有某个外设,但你暂时不想在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。这个命令会依次执行以下工作:
- 编译你定制的Linux内核。
- 根据根文件系统配置,构建或交叉编译所有选中的软件包。
- 编译U-Boot引导程序。
- 编译First Stage Bootloader(FSBL)。
- 编译设备树源文件(
.dts)为二进制文件(.dtb)。 - 将所有组件打包成最终的可启动镜像。
第一次编译可能会花费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等命令,感受这个属于你自己的微小世界。
344



被折叠的 条评论
为什么被折叠?



