1)实验平台:正点原子领航者V2 ZYNQ开发板
2) 章节摘自【正点原子】《领航者ZYNQ之嵌入式Linux开发指南_V2.0》
3)购买链接:https://detail.tmall.com/item.htm?id=609032204975
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-329957-1-1.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子FPGA技术交流QQ群:90562473
第六章 Petalinux设计流程实战
PetaLinux工具提供了在Xilinx处理系统上自定义、构建和部署嵌入式Linux解决方案所需的一切。该解决方案旨在提高设计生产力,可与Xilinx硬件设计工具一起使用,以简化针对Zynq-7000 SoC的Linux系统的开发。本章我们以使用Petalinux定制Linux系统为例,实战Petalinux的设计流程,看下Petalinux如何简化Linux系统的开发。
1.1Petalinux的设计流程概述
通常PetaLinux工具遵循顺序设计流程模型,如下表所示:
表 6.1.1 设计流程表 从上表可以看到,使用Vivado搭建好硬件平台后,通过几个命令就完成了Linux系统的定制,极其方便。
需要说明的是以上设计流程不是按部就班的每一步都执行一遍,可以根据使用场景有选择的执行。一般的设计流程如下:
1.通过Vivado创建硬件平台,得到hdf硬件描述文件;
2.运行source <petalinux安装路径>/settings.sh,设置Petalinux运行环境
3.通过petalinux-create -t project创建petalinux工程;
4.使用petalinux-config --get-hw-description,将hdf文件导入到petalinux工程当中并配置petalinux工程;
5.使用petalinux-config -c kernel配置Linux内核;
6.使用petalinux-config -c rootfs配置Linux根文件系统;
7.配置设备树文件;
8.使用petalinux-build编译整个工程;
9.使用petalinux-package --boot制作BOOT.BIN启动文件;
10.制作SD启动卡,将BOOT.BIN和image.ub以及根文件系统部署到SD卡中;
11.将SD卡插入开发板,并将开发板启动模式设置为从SD卡启动;
12.开发板连接串口线并上电启动,串口上位机打印启动信息,登录进入Linux系统。
1.2使用Petalinux定制Linux系统
现在我们以使用Petalinux定制Linux系统为例,来实战下Petalinux的设计流程,体验Petalinux对Linux系统开发的简便之处。
1.2.1创建Vivado硬件平台
在《领航者ZYNQ之嵌入式开发指南》中我们创建了很多Vivado工程,相信大家对vivado工程的创建已经非常熟悉了,为了节省时间,这里我们统一使用正点原子为领航者开发板配置的vivado工程,该工程在开发板资料包中已经给大家提供了,路径为:4_SourceCode\3_Embedded_Linux\vivado_pro,在该目录下有两个.zip压缩文件Navigator_7010.zip和Navigator_7020.zip,分别对应领航者7010和领航者7020的vivado工程,这里大家根据自己所使用的开发板来选择,笔者以领航者7020开发板为例,将Navigator_7020.zip在Windows系统下解压得到vivado工程目录Navigator_7020,进入到该目录下,如下所示:
图 6.2.1 vivado工程目录 该目录下有一个.sdk文件夹Navigator_7020.sdk,同样对于领航者7010来说,对应的vivado工程目录下也有一个.sdk文件夹Navigator_7010.sdk;将该文件夹拷贝到Ubuntu系统下,譬如笔者在Ubuntu系统用户家(home)目录创建了一个名为petalinux的目录,并在petalinux目录下创建了hdf目录用于存放这个sdk文件夹,将sdk文件夹拷贝到用户家目录下的petalinux/hdf目录,如下所示:
图 6.2.2 将sdk文件夹拷贝到Ubuntu系统 1.2.2设置Petalinux环境变量
在Ubuntu系统中需要先设置petalinux工作环境,也就是对petalinux工作环境进行初始化,在终端输入如下命令即可:
- source /opt/pkg/petalinux/2018.3/settings.sh
复制代码 就是通过source来运行petalinux安装目录下的settings.sh脚本文件,如果读者的安装目录跟笔者不一样,请自行修改路径。
执行结果如下图所示:
图 6.2.3 设置petalinux工作环境 1.2.3创建petalinux工程
为了方便工程的管理,我们在用户家目录下的petalinux目录中创建petalinux工程,进入到用户家目录下的petalinux/目录中,现在我们创建一个名为“ALIENTEK-ZYNQ”的Petalinux工程,在终端中输入如下命令:
- petalinux-create -t project --template zynq -n ALIENTEK-ZYNQ
复制代码 template参数表明创建的petalinux工程使用的平台模板,此处的zynq表明使用的是zynq平台模板的petalinux工程,用于zynq-7000系列的芯片。name参数(此处简写为“-n”)后接的是petalinux工程名,如此处的“ALIENTEK-ZYNQ”,大家可以根据自己的喜好修改;执行结果如下图所示:
图 6.2.4 创建Petalinux工程 可以看到该命令执行完成之后会自动在当前目录下创建一个名为ALIENTEK-ZYNQ的文件夹,也就是我们新建的petalinux工程对应的工程目录。
1.2.4配置petalinux工程
首次配置Petalinux工程是将hdf硬件描述文件文件导入到Petalinux工程中,Petalinux工具会解析hdf文件并弹出配置窗口。在终端中输入如下命令配置Petalinux工程:
- cd ALIENTEK-ZYNQ //进入到petalinux工程目录下
- petalinux-config --get-hw-description ../hdf/Navigator_7020.sdk/ //导入hdf文件
复制代码 即进入到petalinux工程文件夹,并配置petalinux工程。“petalinux-config --get-hw-description”命令后面的文件夹就是我们复制到Ubuntu系统中的Navigator_7020.sdk文件夹,大家根据自己的实际路径填写。如果后面修改了Vivado工程,重新生成hdf文件后,可以重新执行“petalinux-config --get-hw-description <hdf文件目录>”命令以重新配置Petalinux工程。
执行结果如下图所示:
图 6.2.5 导入hdf文件 Hdf文件导入成功之后会自动弹出petalinux工程配置窗口,如下图所示:
图 6.2.6 petalinux工程配置窗口 需要注意的是该窗口不可以使用鼠标操作,只能通过键盘操作,界面上方的英文就是简单的操作说明,操作方法如下:
通过键盘上的“↑”和“↓”键来选择要配置的菜单,按下“Enter”键进入子菜单。菜单中高亮的字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单。选中子菜单以后按下“Y”键就会将相应的配置选项写入配置文件中,菜单前面变为“< * >”。按下“N”键不编译相应的代码,按下“M”键就会将相应的代码编译为模块,菜单前面变为“< M >”。按两下“Esc”键退出,也就是返回到上一级,按下“?”键查看此菜单的帮助信息,按下“/”键打开搜索框,可以在搜索框输入要搜索的内容。
在配置界面下方会有五个按钮,这五个按钮的功能如下:
<Select>:选中按钮,和“Enter”键的功能相同,负责选中并进入某个菜单。
<Exit>:退出按钮,和按两下“Esc”键功能相同,退出当前菜单,返回到上一级。
<Help>:帮助按钮,查看选中菜单的帮助信息。
<Save>:保存按钮,保存修改后的配置文件。
<Load>:加载按钮,加载指定的配置文件。
本实验我们无需更改该窗口的配置信息。不过由于该窗口菜单不多,我们就从上到下的简单地介绍下这些菜单。
首先按键盘上的下方向键移动到“Linux Components Selection”,然后按键盘上的“Enter”进入子菜单,子菜单内容如下图所示:
图 6.2.7 Linux Components Selection子菜单 中括号里的“*”表示为已使能配置。前两个选项表示会自动生成我们在《领航者ZYNQ之嵌入式开发指南》程序固化实验中的fsbl.elf文件和自动更新ps_init。下面两个选项用来配置u-boot和linux-kernel的来源,本实验保持默认来源配置,不做改动,后面的实验需要更改的时候再做介绍。按键盘上的“Esc”按键连按两次退出该子菜单。
“Auto Config Settings”菜单主要就是选择是否使能fsbl、Device tree、Kernel和u-boot的自动配置,默认为自动配置,无需更改,就不多做介绍了。
“Subsystem AUTO Hardware Settings”子菜单的内容如下图所示:
图 6.2.8 Subsystem AUTO Hardware Settings子菜单 进入到该界面的各个外设子菜单中,可以发现都已经有了默认配置,这些默认配置是根据hdf文件的信息自动配置的,基本上无需我们手动修改;“Serial Settings”配置项用于配置开发板的调试串口和串口波特率等参数,对于领航者开发板来说,这里需要修改一下,首先光标移动到该配置项按回车进入,如下所示:
图 6.2.9 配置调试串口 因为领航者开发板有两个串口外设,USB串口和RS232、RS485(RS232和485共用),而板子的调试串口是USB串口,所以在“Primary stdin/stdout”配置项中需要将其修改为ps7_uart_0,ps7_uart_0对应的就是USB串口。修改完成之后连按两次ESC键回到上一级菜单。
在“Advanced bootable images storage Settings”菜单中可配置启动引导镜像和内核镜像的存储媒介,默认为sd卡,这里保持默认即可。
图 6.2.10 Advanced bootable images storage Settings菜单 返回到主界面(按四次“ESC”按键),设备树设置菜单“DTG Settings”和u-boot配置菜单“u-boot Configuration”一般保持默认即可。我们进入“Image Packaging Configuration”子菜单,如下图所示:
图 6.2.11 Image Packaging Configuration子菜单 第一个选项便是根文件系统的类型的配置,默认为INITRAMFS,也可以选择SD card,这里我们保持默认。另外从该界面我们可以看到,有“Copy final images to tftpboot”选项,当在Ubuntu的根文件下创建一个名为tftpboot的文件夹时,工程生成镜像后会自动将相关文件复制到/tftpboot目录中。
回到主界面,“Firmware Version Configuration”可以用来修改定制的linux系统的主机名和产品名,默认与该Petalinux工程同名,如果需要可修改。“Yocto Settings”进行与Yocto相关的设置,这里就不做介绍了。
按键盘上的右方向键(即右箭头),移动到底部的“Save”,按键盘上的“Enter”键,进入如下图所示的保存配置文件界面:
图 6.2.12 保存petalinux工程配置信息 按键盘上的“Enter”键确认,进入下图所示界面:
图 6.2.13 退出保存配置界面 再次按键盘上的“Enter”键确认,返会到原界面,接着按两次键盘上的“Esc”退出配置窗口。
如果后面想重新配置,只需输入“petalinux-config”命令即可重新配置。
这一步可能需要几分钟才能完成。这是因为PetaLinux会根据“Auto Config Settings --->”和“Subsystem AUTO Hardware Settings --->”来解析硬件描述文件,以获取更新设备树、U-Boot配置文件和内核配置文件所需的硬件信息。
例如,如果选择ps7_ethernet_0作为主以太网,并且启用了内核配置和U-Boot配置的自动更新,那么PetaLinux将自动启用其内核驱动程序,并更新U-Boot的配置文件以使用选择的以太网控制器。
等待一段时间后,完成petalinux工程的配置,如下图所示:
图 6.2.14 完成petalinux工程的配置 1.2.5配置Linux内核
现在我们开始定制Linux内核,在终端输入如下命令:
- petalinux-config -c kernel
复制代码 执行结果如下:
图 6.2.15 配置Linux内核 等一段时间后会弹出Linux内核的配置界面,如下图所示:
图 6.2.16 内核配置界面 可以看到Petalinux默认使用的内核版本为4.14.0,当然也可以换成其它版本的内核,不过修改起来比较麻烦,Petalinux对内核版本有要求,读者如需使用其他的内核版本可以在网上查找关于Petalinux使用非默认内核版本的方法。一般使用默认内核版本就可以了。
这里使用的内核Xilinx官方已经做好了基础配置,如无特需要求,无需更改。另外关于Linux内核的配置在后面的Linux内核移植章节进行讲解,此处就不多做介绍了。这里采用Xilinx官方的默认配置即可,保存配置并退出。
1.2.6配置Linux根文件系统
在终端输入下面的命令可配置根文件系统,如果不需要配置可不执行该命令。
- petalinux-config -c rootfs
复制代码 下图就是根文件系统的配置界面:
图 6.2.17 根文件系统的配置界面 默认配置可满足一般使用,也可以根据需求来定制根文件系统,本实验保持默认配置。需要说明的是“PetaLinux RootFS Settings”可以用来设置root用户的密码,默认为“root”。后面登录的时候会用到。
保存配置并退出。
1.2.7配置设备树文件
关于设备树的概念。这里先不给大家进行介绍,设备树的概念源自于Linux内核当中,当然其实在U-Boot当中也已经使用了。如果需要配置设备树,可以编辑当前petalinux工程目录下的project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi文件。
我们可以打开这个文件进行编辑,将一些简单外设添加到系统当中,譬如按键、led、蜂鸣器和IIC设备;设备树用于保存Linux系统中的各种设备信息,内核在启动过程当中会去解析设备树文件,获取设备所需的配置信息完成设备的初始化工作。
设备树的概念以及相关配置、语法涉及到了Linux内核驱动相关知识,并不是本篇学习的重点,所以这里并不会去深入给大家介绍,将会在Linux驱动部分的章节做详细解说。
使用vi命令打开system-user.dtsi文件,如下所示:
- vi project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
复制代码 默认的文件内容如下,可见该文件需要我们自己手动配置。
图 6.2.18 system-conf.dtsi文件初始内容 我们把按键、led、蜂鸣器、USB和IIC设备的EEPROM和RTC添加到system-user.dtsi设备树当中,system-user.dtsi文件内容如下:
- /include/ "system-conf.dtsi"
- #include <dt-bindings/gpio/gpio.h>
- / {
- model = "Navigator Development Board";
- compatible = "alientek,zynq-7020","xlnx,zynq-7000";
- leds {
- compatible = "gpio-leds";
- gpio-led1 {
- label = "led1";
- gpios = <&gpio0 54 GPIO_ACTIVE_HIGH>;
- linux,default-trigger = "heartbeat";
- };
- gpio-led2 {
- label = "pl_led0";
- gpios = <&gpio0 55 GPIO_ACTIVE_HIGH>;
- default-state = "on";
- };
- gpio-led3 {
- label = "pl_led1";
- gpios = <&gpio0 56 GPIO_ACTIVE_HIGH>;
- default-state = "on";
- };
- gpio-led4 {
- label = "ps_led0";
- gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
- default-state = "on";
- };
- gpio-led5 {
- label = "ps_led1";
- gpios = <&gpio0 8 GPIO_ACTIVE_HIGH>;
- default-state = "on";
- };
- gpio-led6 {
- label = "led2";
- gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>;
- default-state = "on";
- };
- };
- keys {
- compatible = "gpio-keys";
- autorepeat;
- gpio-key1 {
- label = "pl_key1";
- gpios = <&gpio0 57 GPIO_ACTIVE_LOW>;
- linux,code = <105>; // Right
- debounce-interval = <20>; // 20ms
- };
- gpio-key2 {
- label = "pl_key2";
- gpios = <&gpio0 58 GPIO_ACTIVE_LOW>;
- linux,code = <106>; // Left
- debounce-interval = <20>;
- };
- gpio-key3 {
- label = "ps_key1";
- gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
- linux,code = <103>; // Up
- debounce-interval = <20>;
- };
- gpio-key4 {
- label = "ps_key2";
- gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
- linux,code = <108>; // Down
- debounce-interval = <20>;
- };
- touch-key {
- label = "touch_key";
- gpios = <&gpio0 59 GPIO_ACTIVE_HIGH>;
- linux,code = <28>; // ENTER
- gpio-key,wakeup;
- debounce-interval = <20>;
- };
- };
- beeper {
- compatible = "gpio-beeper";
- gpios = <&gpio0 60 GPIO_ACTIVE_HIGH>;
- };
- usb_phy0: phy0@e0002000 {
- compatible = "ulpi-phy";
- #phy-cells = <0>;
- reg = <0xe0002000 0x1000>;
- view-port = <0x0170>;
- drv-vbus;
- };
- };
- &i2c0 {
- clock-frequency = <100000>;
- eeprom@50 {
- compatible = "24c64";
- reg = <0x50>;
- pagesize = <32>;
- };
- rtc@51 {
- compatible = "nxp,pcf8563";
- reg = <0x51>;
- };
- };
- &usb0 {
- dr_mode = "otg";
- usb-phy = <&usb_phy0>;
- };
复制代码 该文件中的配置内容比较长,大家可以将system-user.dtsi文件中原有内容删除,然后直接copy上面的内容,粘贴到system-user.dtsi文件即可。
设备树文件当中配置了6个gpio led灯,5个按键、一个蜂鸣器、eeprom、RTC以及USB0接口,下面简单的讲解下gpio led的配置。
6个gpio led灯分别对应开发板的6个led灯,配置信息主要包括compatible(用于与内核驱动匹配的名字)、label(名字)、gpios(对应的GPIO管脚)、默认状态以及触发状态,内容编辑完成之后保存退出即可。
1.2.8编译Petalinux工程
现在我们就可以编译整个Petalinux工程了,在终端输入如下命令:
该命令将生成设备树DTB文件、fsbl文件、U-Boot文件,Linux内核和根文件系统映像。编译完成后,生成的映像将位于工程的images目录下。需要说明的是fsbl、U-Boot这两个我们在工程中并没有配置,这是因为Petalinux会根据hdf文件和6.2.4节的配置petalinux工程自动配置fsbl和uboot,如无特需要求,不需要再手动配置。
执行结果如下图所示:
图 6.2.19 编译整个Petalinux工程 其中有一个WARNING警告,这是Petalinux版本的问题,不影响实际使用,也不会对结果产生影响。
1.2.9制作BOOT.BIN启动文件
Petalinux提供了petalinux-package命令将PetaLinux项目打包为适合部署的格式,其中“petalinux-package --boot”命令生成可引导映像,该映像可直接与Zynq系列设备(包括Zynq-7000和Zynq UltraScale + MPSoC)或基于MicroBlaze的FPGA设计一起使用。对于Zynq系列设备,可引导格式为BOOT.BIN,可以从SD卡引导。对于基于MicroBlaze的设计,默认格式为MCS PROM文件,适用于通过Vivado或其他PROM编程器进行编程。
ZYNQ的启动文件BOOT.BIN一般包含fsbl文件、bitstream文件和uboot文件。使用下面命令可生成BOOT.BIN文件:
- petalinux-package --boot --fsbl --fpga --u-boot --force
复制代码 选项“--fsbl”用于指定fsbl镜像文件所在位置,后面接文件对应的路径信息,如果不指定文件位置,默认对应的是images/linux/zynq_fsbl.elf;选项“--fpga”用于指定bitstream文件所在位置,后面接该文件对应的路径信息,默认对应的是images/linux/system.bit;选项“--u-boot”用于指定U-Boot镜像所在位置,后面接该文件所在路径信息,默认为images/linux/u-boot.elf。这里笔者均没有指定对应的文件的路径信息,那么Petalinux会自动使用默认文件。执行结果如下图所示:
图 6.2.20 生成 BOOT.BIN文件 1.2.10制作SD启动卡
如果使用SD卡引导linux系统启动,一般需要在SD卡上有2个分区。一个分区使用FAT32文件系统,用于放置启动镜像文件(如BOOT.BIN,linux镜像等),另一分区使用EXT4文件系统,用于存放根文件系统。
需要说明的是在6.2.4节配置petalinux工程中,“Image Packaging Configuration”子菜单根文件系统的类型的配置使用的是默认的INITRAMFS,所以只需要一个使用FAT32文件系统的分区就可以了。当设置为“SD card”则需要另一个存放根文件系统的EXT4文件系统分区。
本小节先讲解SD卡的分区和格式化,然后说明将哪些文件复制到SD卡中。此处的SD卡指的是那种小卡,也称为TF卡。
注:在使用SD卡前需要先将sd卡中的数据做备份,否则会丢失SD卡中的数据。
将SD卡插入到读卡器中、并将读卡器插入电脑并连接到Ubuntu系统,在Ubuntu系统中找到SD卡所对应的设备节点,笔者插入的SD卡对应的设备节点为/dev/sdb。现在我们先给SD卡分区。在终端中输入如下命令:
- umount /dev/sdb*
- sudo fdisk /dev/sdb
复制代码 执行后输入“p”,执行结果如下图所示:
图 6.2.21 给SD卡分区 可以看到SD卡目前的分区表,笔者的SD卡有一个FAT32的分区,在开始新分区之前需要将以前的分区删除,键入“d”,删除该分区,再次键入“d”时会出现下图所示的红色字体提示,表明已无存在的分区;如果大家的SD卡存在多个分区,需要全部删除,存在多个分区的情况下,键入“d”时会提示选择需要删除的分区编号。
图 6.2.22 将以前的分区删除 下面开始新建分区。输入“n”创建一个新分区。通过选择'p'使其为主,使用默认分区号1和第一个扇区2048。设置最后一个扇区,也就是设置第一个分区的大小,这里我们设置100M就行了,通过输入“+100M”,为该分区预留100MB,如下图所示:
图 6.2.23 创建第一个新分区 现在设置分区类型,输入“t”,然后输入“c”,设置为“W95 FAT32 (LBA)”,如下图所示:
图 6.2.24 设置分区类型 输入“a”,设为引导分区,如下图所示:
图 6.2.25 设为引导分区 第一个分区就创建好了,开始创建第二个分区。
通过键入“n”来创建根文件系统分区。后面一路默认就可以了,如下图所示:
图 6.2.26 创建第二个分区 如果现在输入“p”检查分区表,会看到刚刚创建的2个分区。如果没问题,键入“w”以写入到SD卡并退出。
图 6.2.27 写入分区表信息到SD卡 完成了分区创建后,就可以格式化分区了。在终端输入如下命令:
- sudo mkfs.vfat -F 32 -n boot /dev/sdb1
- sudo mkfs.ext4 -L rootfs /dev/sdb2
复制代码 将第一个分区格式化成FAT32分区并命名为boot,将第二个分区格式化成ext4分区并命名为rootfs。
图 6.2.28 格式化分区 格式化完成之后,在Ubuntu系统桌面的左边会出现两个USB U盘类设备图标,分别点击两个图标即可自动将这两个分区挂载到Ubuntu系统,如下所示:
图 6.2.29 挂载分区 当然大家也可以使用mount命令进行挂载,挂载完成后,使用df命令来查看SD卡的两个分区所对应的挂载目录,如下所示:
图 6.2.30 查看分区的挂载目录 接下来我们将petalinux工程目录image/linux目录下的BOOT.BIN和image.ub文件拷贝到名为boot的分区也即/dev/sdb1分区中。
本实验只需要这两个文件即可,拷贝完成之后就可以卸载SD卡了。
1.2.11开发板启动模式设置
将SD卡插入领航者开发板的SD卡槽,然后使用USB Type-C连接线将开发板左侧的USB_UART接口与电脑连接,用于串口通信。领航者开发板连接SD(TF)卡的正面图如图 6.2.31所示:
图 6.2.31 开发板连接TF卡正面图 接下来将领航者底板上的启动模式开关BOOT_CFG的两个开关均拨到下面(都置为OFF),即设置为从SD卡启动。不同的启动方式与两个拨码开关的状态对应关系如下图所示:
图 6.2.32 启动模式设置 最后连接开发板的电源线,并打开电源开关。
1.2.12打开串口上位机,进入Linux系统
打开MobaXterm串口终端上位机软件或其它串口上位机、并连接开发板USB串口。串口终端软件会打印出Linux启动信息:
图 6.2.33 打印Linux启动信息 停留在登录处,此处使用root用户登录,登录密码为“root”(去掉双引号),登录进去后,界面如下:
图 6.2.34 使用root用户登录 我们可以插入网线到GE_PS网口,另一端连接路由器等设备,执行udhcpc命令自动获取ip(需要路由器支持DHCP服务)如下:
图 6.2.35 自动获取IP地址 如果我们把视线移到开发板,会看到板上的LED灯全都是亮的,其中核心板上的LED1处于心跳灯模式。
至此我们就走完了Petalinux开发Linux的整个流程。正如俗语所说师傅领进门,修行靠个人,Petalinux的功能远不止如此,其他功能读者有兴趣可进行探索,建议参考ug1144参考手册,也就是Xilinx官方编写的PetaLinux工具使用说明文档,已提供在开发板光盘资料:领航者ZYNQ开发板资料盘(A盘)\8_ZYNQ&FPGA参考资料\Xilinx\User Guide\ug1144-petalinux-tools-reference-guide.pdf。
特别说明:以后我们使用主机终端指代电脑上Ubuntu系统的终端,串口终端指代通过串口线连接到领航者开发板显示在串口上位机中的终端。
1.2.13从QSPI Flash中启动Linux
在本章前面小节中,我们成功的从SD卡中启动Linux系统,本节我们来教大家,如何从QSPI Flash中启动Linux。ZYNQ核心板板载的QSPI Flash芯片是Winbond公司生产的W25Q256FV,其容量为256Mbit。需要说明的是,尽管核心板板载的QSPI Flash容量为256Mbit,但是ZYNQ支持该公司的Flash芯片容量最大为128Mbit,因此Linux系统的文件不能太大,否则无法从QSPI Flash中启动Linux。
首先进入到petalinux工程目录下,大家可以先把petalinux工程目录images/linux目录下的BOOT.BIN文件和image.ub文件做一个备份,以免后面自己还会需要避免重新配置编译。
在petalinux工程目录下,执行如下命令对petalinux工程进行配置:
接下来会弹出petalinux工程配置窗口,如下图所示:
图 6.2.36 petalinux工程配置窗口 不同的启动方式在配置上会有区别。通过按下键盘上的上下箭头,使其移动到上图中的“Subsystem AUTO Hardware Settings”,并按下键盘的“Enter”按键,进入如下图所示的子界面。
图 6.2.37 Subsystem AUTO Hardware Settings界面 移动光标至上图中的“Advanced bootable images storage Settings”,并按下键盘的“Enter”按键,进入如下图所示的子界面。
图 6.2.38 Advanced bootable images storage Settings界面 “boot image settings”可以配置启动方式。移动光标至上图中的“boot image settings”,并按下键盘的“Enter”按键,进入如下图所示的子界面。
图 6.2.39 boot image settings界面 由上图可知,当前启动方式为SD卡启动。按下“Enter”按键进入“image storage media”子界面,如下图所示:
图 6.2.40 修改成“primary flash” 通过按下键盘上的上下箭头,使其指示上图中的“primary flash”,设置成QSPI Flash启动。并按下键盘的“Enter”按键,此时会返回至上一层界面,如下图所示。
图 6.2.41 Flash启动方式设置成功 由上图可知,已经成功配置成flash启动。
按下键盘的“ESC”按键,直至返回到“Subsystem AUTO Hardware Settings”界面,如下图所示:
图 6.2.42 Subsystem AUTO Hardware Settings界面 通过按下键盘上的上下箭头,使其指示上图中的“Flash Settings”,并按下键盘的“Enter”按键,进入如下图所示的子界面。
图 6.2.43 Flash Settings界面 “Flash Settings”可以设置Flash分区中的容量大小,一般保持默认即可,这里我们不做任何修改。
按键盘上的右方向键(即右箭头),移动到底部的“Save”,按键盘上的“Enter”键,进入如下图所示的保存配置文件界面:
图 6.2.44 保存配置文件界面 按键盘上的“Enter”键确认,进入下图所示界面:
图 6.2.45 退出保存配置文件界面 再次按键盘上的“Enter”键确认。然后按下“ESC”键返回到原界面,跟按两次键盘上的“Esc”退出配置窗口。
等待一段时间后,完成petalinux工程的配置,如下图所示:
图 6.2.46 工程配置完成界面 现在我们就可以编译整个Petalinux工程了,在终端输入如下命令:
耐心等待工程编译完成,执行结果如下图所示:
图 6.2.47 工程编译完成界面 这里同样会有一个WARNING警告,这是Petalinux版本的问题,不影响实际使用,也不会对结果产生影响。
接下来制作BOOT.BIN的启动文件。打包的方法和从SD卡启动时制作BOOT.BIN文件的方法一样,命令如下所示:
- petalinux-package --boot --fsbl --fpga --u-boot --kernel --force
复制代码 执行结果如下图所示:
图 6.2.48 成功生成BIN文件界面 生成的BOOT.BIN文件就在images/linux目录下,接下来BOOT.BIN文件固化到开发板QSPI Flash中,并且把images/linux目录下的image.ub文件拷贝到SD卡的第一个分区。
把刚刚生成的BOOT.BIN文件烧录到开发板中,这个步骤可以参考《领航者嵌入式开发指南》中的“第七章 程序固化实验”。这里再简单描述下烧录的步骤。
我们需要借助于FSBL的文件,将BOOT.BIN引导至QSPI Flash中。返回到Windows界面,将嵌入式第七章的例程(7_axi_gpio_fsbl)从资料盘中拷贝出来,注意拷贝后的路径不能包含中文或者其它特殊字符。然后将前面生成的BOOT.BIN拷贝至axi_gpio_fsbl例程中,如下图所示:
图 6.2.49 拷贝BOOT.BIN文件 将程序固化到QSPI Flash需要使用JTAG下载器。首先我们将下载器与开发板底板上的JTAG接口连接,下载器另外一端与电脑连接。接下来将开发板底板上的启动模式开关BOOT_CFG的两个开关均拨到上面(都置为 ON),即设置为JTAG模式。最后连接开发板的电源,并打开电源开关。
打开axi_gpio_fsbl的SDK工程,点击菜单栏的“Xilinx->Program Flash”,如下图所示:
图 6.2.50 打开Program Flash 在弹出的对话框中指定前面所拷贝的镜像文件BOOT.bin以及工程目录下的FSBL.elf文件,如下图所示:
图 6.2.51 Program Flash Memory界面 点击“Program”,开始对Flash进行编程,这个过程需要花费一段时间。Flash编程结束后,控制台提示信息如下图所示:
图 6.2.52 QSPI Flash下载成功 接下来关闭开发板电源开关,并拔掉JTAG接口。然后将领航者底板上的启动模式开关左边的1 号开关拨到上面(置为 ON),右边的2号开关拨到下面(置为 OFF),即设置为由QSPI Flash启动,并且将SD卡插入开发板,然后再次打开电源开关。
电源开关打开后,核心板上PL配置完成的指示灯点亮。开发板连接串口线,打开串口终端模拟软件MobaXterm并连接到开发板USB串口,此时终端会打印Linux启动信息:
图 6.2.53 打印Linux启动信息
由上图可知,串口成功打印出Linux的启动信息,说明Linux从QSPI Flash中启动成功。
|