基本都是摘抄正点原子的文章:<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf,因初次学习,仅作学习摘录之用,有不懂之处后续会继续更新~
PetaLinux工具提供了在 Xilinx 处理系统上自定义、构建和部署嵌入式 Linux 解决方案所需的一切。该解决方案旨在提高设计生产力,可与 Xilinx 硬件设计工具一起使用,以简化针对 Zynq SoC 的 Linux 系统的开发。
一、Zynq-7000 嵌入式软件栈概述
要想在 Zynq-7000 SoC 中搭建运行 Linux,需先简单的了解下其嵌入式软件栈,如下图所示:
处理器系统引导是一个分三个阶段的过程:
第一个阶段:内部BootROM
内部 BootROM,它存储 stage-0 的引导代码。
BootROM 在 CPU 0 上执行,CPU 1 执行等待事件(WFE)指令。 BootROM 还配置必要的外围设备,以开始从其中一个引导设备获取第一阶段引导加载程序 (FSBL)引导代码。可编程逻辑(PL)不是由 BootROM 配置的。
第二个阶段: FSBL引导代码
这通常存储在闪存、SD 卡中,或者可以通过 JTAG 下载。BootROM 代码将 FSBL 引导 代码从选定的非易失性存储器复制到片上存储器(OCM)。加载到 OCM中的 FSBL的大小限制为192KB。在 FSBL 开始执行后,完整的 256 KB 可用。
第三个阶段:U-Boot引导加载程序
常见的第二阶段引导加载程序是 U-boot。是一个可选的第二阶段引导加载程序,由用户设计。
(1)FSBL
Zynq-7000 的第一阶段引导加载程序(FSBL)使用硬件比特流(如果存在)配置 FPGA, 并将操作系统(OS)映像或第二阶段引导加载器映像从非易失性存储器(NAND/SD/eMMC/QSPI)加载到存储器(DDR/OCM)。它支持多个分区,每个分区可以是代码映像、位流或通用数据。
如果需要,可以对这些分区中的每个分区进行身份验证和解密。
(2)U-Boot
U-Boot,通用引导加载程序的缩写,是一种开源的主引导加载程序,用于嵌入式设备, 以引导 Linux 社区中经常使用的设备操作系统内核。
Xilinx 在 Zynq-7000 设备中使用 U-Boot作为第二阶段引导加载程序。
(3)Linux
Linux,全称 GNU/Linux,是一种免费使用和自由传播的类 UNIX 操作系统,是本开发指南的重点。
以上就简单的介绍了 Zynq-7000嵌入式软件栈,没有看懂没关系,这里简单的概括下。
- Zynq-7000 上电后,首先由 BootROM 对 Zynq 设备进行初始启动,然后引导加载 fsbl 到OCM并启动FSBL;
- FSBL启动后将 uboot 加载到 DDR 并启动 uboot;
- uboot 启动后加载linux系统镜像到DDR并启动linux,至此整个 linux 系统启动完成。
综上,就是需要在 Zynq-7000 运行 linux 系统所需要搭建的软件栈。如果这些软件栈由用户一个个手工搭建,任务量极其庞大,所幸的是,Xilinx 推出了 Petalinux 开发工具,可以让用户方便快捷的完成这些软件栈的搭建,从而加快 linux 的使用和开发。
二、Petalinux 工具的设计流程概述使用
通常 PetaLinux 工具遵循顺序设计流程模型,如下表所示:
Design Flow Step | Tool / Workflow |
---|---|
Hardware Platform Creation | Vivado |
Create PetaLinux Project | petalinux-create -t project |
Initialize PetaLinux Project | petalinux-config --get-hw-description |
Configure System-Level Options | petalinux-config |
Create User Components | petalinux-create -t COMPONENT |
Configure the Linux Kernel | petalinux-config -c kernel |
Configure the Root Filesystem | petalinux-config -c rootfs |
Build the System | petalinux-build |
Package for Deploying the System | petalinux-package |
Boot the System for Testing | petalinux-boot |
从上表可以看到,使用 Vivado 搭建好硬件平台后,通过几个命令就完成了 Linux 系统的
定制,极其方便。
需要说明的是以上设计流程不是按部就班的每一步都执行一遍,可以根据使用场景有选
择的执行。
一般的设计流程如下:
1. 通过 Vivado 创建硬件平台,得到 xsa 文件
2. 运行 source <petalinux 安装路径>/settings.sh,设置 Petalinux 运行环境
3. 通过 petalinux-create -t project 创建 petalinux 工程
4. 使用 petalinux-config --get-hw-description,将 xsa 文件导入到 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 系统
三、Petalinux 定制 Linux 系统解决
3.1、创建 Vivado 硬件平台
为了节省时间,这里使用正点原子为领航者开发板配置的vivado工程,该工程在开发板资料包中已经提供,路径为:4_SourceCode3_Embedded_Linux\vivado_prj,在该目录下有两个,zip压缩文件Navigator_7010.zip和Navigator_7020.zip,分别对应领航者7010和领航者7020的vivado工程,这里用户根据自己所使用的开发板来选择。
这里以领航者7010开发板为例,将Navigator_7010.zip在Windows系统下解压得到vivado工程日录Navigator7020,进入到该目录下,如下图所示:
该目录下有一个system_wrapper.xsa文件,该文件包含着Vivado工程所对应的硬件平台信息,Petalinux根据这些信息来配置fsbl、uboot、内核等。
将该文件拷贝到Windows与Ubuntu本地共享文件夹下,即/mnt/hgfs/share,并在Ubuntu系统用户根目录下创建了一个名为“petalinux”的目录,并在该目录下创建“xsa_7010”目录用于存放system_wrapper.xsa文件,即~/petalinux/xsa_7010目录。
将system_wrapper.xsa文件拷贝到petalinux/xsa_7010目录中,使用如下命令:
mkdir -p ~/petalinux/xsa_7010
cp /mnt/hgfs/share/system_wrapper.xsa ~/petalinux/xsa_7010
3.2、设置 Petalinux 环境变量
现在进入到 Ubuntu 系统中,打开终端,以普通用户运行即可,不需要使用 root 用户。在正式使用 petalinux 工具之前,需要先设置 petalinux 的作环境,在终端输入如下命令即可:
source /opt/pkg/petalinux/2020.2/settings.sh
#或者
sptl
执行结果如下图所示:
3.3、创建 petalinux 工程
上节中创建了petalinux目录,现在在该目录中创建一个名为“ALIENTEK-ZYNQ”的Petalinux工程,在终端中输入如下命令:
cd ~/petalinux
petalinux-create -t project --template zynq -n ALIENTEK-ZYNQ
参数说明:
参数 | 说明 |
---|---|
-t | 是“-type”的简写 |
template | 表明创建的petalinux工程使用的平台模板 |
zynq | 表明使用的是zynq平台模板的petalinux工程,用于zynq-7O00系列的芯片 |
-n | name参数(此处简写为“-n”)后接的是petalinux工程名,如此处的“ALIENTEK-ZYNQ” |
执行结果如下图所示:
3.4、配置 petalinux 工程
首次配置 Petalinux 工程是将 xsa 文件导入到 Petalinux 工程中,Petalinux 工具会解析 xsa 文件并弹出配置窗口。在终端中输入如下命令配置 Petalinux 工程:
cd ALIENTEK-ZYNQ
petalinux-config --get-hw-description ../xsa_7010/
即进入到 ALIENTEK-ZYNQ 文件夹,并配置 petalinux 工程。“petalinux-config --get-hw-description”命令后面的文件夹就是复制到 Ubuntu 系统下 system_wrapper.xsa 文件所在的位置。
如果后面修改了 Vivado 工程,重新生成 xsa 文件后,可以重新执行“petalinux-config --get-hw-description < xsa 文件所在的位置>”以重新配置 Petalinux 工程。
执行结果如下图所示:
弹出 petalinux 工程配置窗口,如下图所示:
- 通过键盘上的“↑”和“↓”键来选择要配置的菜单
- 按下“Enter”键进入子菜单
- 菜单中蓝色高亮的首字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单
- 选中子菜单以后按下“Y”键就会将相应的配置选项写入配置文件中,菜单前面变为“<*>”
- 按下“N”键不编译相应的代码,按下“M”键就会将相应的代码编译为模块,菜单前面变为“<M>”
- 按两下“Esc”键退出,也就是返回到上一级,按下“?”键查看此菜单的帮助信息,按下“/”键打开搜索框,可以在搜索框输入要搜索的内容
在配置界面下方会有五个按钮,这五个按钮的功能如下:
<Select>:选中按钮,和“Enter”键的功能相同,负责选中并进入某个菜单
<Exit>:退出按钮,和按两下“Esc”键功能相同,退出当前菜单,返回到上一级
<Help>:帮助按钮,查看选中菜单的帮助信息
<Save>:保存按钮,保存修改后的配置文件
<Load>:加载按钮,加载指定的配置文件
3.4.1 Linux Components Selection
首先按键盘上的下方向键移动到“Linux Components Selection”,然后按键盘上的 “Enter”进入子菜单,子菜单内容如下图所示:
- 中括号里的“*”表示已使能配置
- 第二项和第三项表示会自动生成fsbl.elf 文件和自动更新 ps_init
- 下面两个选项用来配置 u-boot 和 linux-kernel 的来源,本实验保持默认来源配置,不做改动,后面的实验需要更改的时候再做介绍
按键盘上的“Esc”按键连按两次退出该子菜单。
3.4.2 Auto Config Settings
“Auto Config Settings”菜单主要就是选择是否使能 Device tree、Kernel 和 u-boot 的自动配置,这里使用默认配置,无需更改。
3.4.3 Subsystem AUTO Hardware Settings
“Subsystem AUTO Hardware Settings”子菜单的内容如下图所示:
进入到该界面的各个外设子菜单中,可以发现都已经设置好了默认配置,这些默认配置是根据 xsa 文件的信息自动配置的,基本上无需用户手动配置;
3.4.3.1 Serial Settings
“Serial Settings”配置项用于配置开发板的调试串口和串口波特率等参数,对于领航者开发板来说,这里需要修改一下,首先光标移动到该配置项按回车进入,如下所示:
把 “FSBL Serial stdin/stdout” 和 “DTG Serial stdin/stdout” 两 项 中 默 认 使 用 的“ps7_uart_1”改成“ps7_uart_0”,也就是 USB 串口。这是因为 uart1 是 PL 端的 RS232 和RS485 接口。
修改完成之后连按两次 ESC 键回到上一级菜单。
3.4.3.2 Advanced bootable images storage Settings
在“Advanced bootable images storage Settings”菜单中可配置启动引导镜像和内核镜像的存储媒介,默认为 Primary SD,这里保持默认即可。
返回到主界面(按四次“ESC”按键),“DTG Settings”、FSBL 配置菜单“FSBL Configuration ” 、 FPGA管理器菜单 “ FPGA Manager ” 、 u-boot 配置菜单“u-boot Configuration”和 linux 配置菜单“Linux Configuration”一般保持默认即可。
3.4.4 DTG Settings
“DTG Settings”保持默认即可。
3.4.5 FSBL Configuration
“FSBL Configuration”保持默认即可。
3.4.6 FPGA Manager
“FPGA Manager”保持默认即可。
3.4.7 u-boot Configuration
“u-boot Configuration”保持默认即可。
3.4.8 Linux Configuration
“Linux Configuration”保持默认即可。
3.4.9 Image Packaging Configuration
进入“Image Packaging Configuration”子菜单,如下图所示:
第一个选项便是根文件系统的类型的配置,默认为 INITRD,一般默认即可。如果用户需要运行 Ubuntu 或 Debian 的根文件系统时,就需要配置成 EXT4(SD/eMMC/ SATA/USB),NFS挂载启动需要配置成 NFS。
注:INITRD 类型的根文件系统每次重新启动 linux 系统都是全新的、未改动过的,也就是说启动系统后进行的所有修改掉电后就全部丢失了,再次重新启动还是之前未修改过的根文件系统,选择“EXT4”可以将根文件系统放在 SD 卡、eMMC 的 ext4 分区,这样启动系统后进行的所有修改掉电后就不会丢失了。
后面会讲解如何将根文件系统放在SD卡的ext4分区。这里还是先从简单的INITRD类型用起。
另外从该界面可以看到,有“Copy final images to tftpboot”选项,当在 Ubuntu 的根文件下创建一个名为 tftpboot 的文件夹时,工程生成镜像后会自动将相关文件复制到/tftpboot目录中。
3.4.10 Firmware Version Configuration
回到主界面,“Firmware Version Configuration”可以用来修改定制的 linux 系统的主机名和产品名,默认与该 Petalinux 工程同名,如果需要可修改。
3.4.11 Yocto Settings
“Yocto Settings”进行与 Yocto相关的设置,这里就不做介绍了,一般保持默认即可。
按键盘上的右方向键(即右箭头),移动到底部的“Save”,按键盘上的“Enter”键, 进入如下图所示的保存配置文件界面:
按键盘上的“Enter”键确认,进入下图所示界面:
再次按键盘上的“Enter”键确认,直接返回到主界面,到这里配置修改就完成了。最后按两次键盘上的“Esc”退出配置窗口,Petalinux 工具开始自动配置工程。 这一步可能需要几分钟才能完成。这是因为 PetaLinux 会根据“Auto Config Settings --->”和“Subsystem AUTO Hardware Settings --->”来解析 xsa 文件,以获取更新设备树、U-Boot 配置文件和内核配置文件所需的硬件信息。
等待一段时间后,完成 petalinux 工程的配置,如下图所示:
如果后面想重新配置,只需输入“petalinux-config”命令即可重新配置。
3.5、配置 Linux 内核
接下来开始定制 Linux 内核,在终端输入如下命令:
petalinux-config -c kernel
执行结果如下:
等待一段时间(我等待了一个半小时,与网速有关系)后会弹出 Linux 内核的配置界面,如下图所示:
可以看到 Petalinux 默认使用的内核版本为 5.4.0,当然也可以换成其它版本的内核,不过修改起来比较麻烦,Petalinux 对内核版本有要求,用户如需使用其他的内核版本可以在网上查找关于 Petalinux 使用非默认内核版本的方法。一般使用默认内核版本就可以了。
这里使用的内核 Xilinx 官方已经做好了基础配置,如无特定需求,无需更改。这里采用Xilinx 官方的默认配置即可,保存配置并退出,如下图所示:
关于Linux 内核的配置在后面的 Linux 内核移植学习时再作了解。
3.6、配置 Linux 根文件系统
在终端输入下面的命令可配置根文件系统,如果不需要配置可不执行该命令:
petalinux-config -c rootfs
下图就是根文件系统的配置界面:
默认配置可满足一般使用,也可以根据需求来定制根文件系统,本实验保持默认配置。 需要说明的是“PetaLinux RootFS Settings”可以用来设置 root 用户的密码,默认为“root”。 后面登录的时候会用到。
保存配置并退出。
3.7、配置设备树文件
设备树用于保存 Linux 系统中的各种设备信息,内核在启动过程当中会去解析设备 树文件,获取设备所需的配置信息完成设备的初始化工作。
如果需要配置设备树,可以编辑当前 petalinux 工程目录下的 project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi 文件。
设备树的概念以及相关配置、语法涉及到了 Linux 内核驱动相关知识,并不是本节学习的重点,所以这里并不会去深入介绍,将会在 Linux 驱动部分的章节做详细解说。使用 vi 或 gedit 命令打开 system-user.dtsi 文件,如下所示:
vi project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
默认的文件内容如下,可见该文件需要用户自己手动配置。
设备树配置内容在资料盘当中已经提供了,路径为: “开发板资料盘(A盘)\4_SourceCode\3_Embedded_Linux\zynq_petalinux\zynq7010\1_customize_linux\ device_tree\system-user.dtsi”,用户可以用资料盘中的文件替换当前 Petalinux 工程中的该文件。
该system-user.dtsi设备树文件把按键、led 灯、蜂鸣器、USB、串口、sd 卡、Flash、PL 端网口、PS 端网口、 EEPROM 和 RTC 这两个 IIC 设备添加到 system-user.dtsi 设备树当中,system-user.dtsi 文件内容如下:
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/media/xilinx-vip.h>
#include <dt-bindings/phy/phy.h>
/ {
model = "Alientek Navigator Zynq Development Board";
compatible = "xlnx,zynq-zc702", "xlnx,zynq-7000";
leds {
compatible = "gpio-leds";
gpio-led1 {
label = "led2";
gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
gpio-led2 {
label = "led1";
gpios = <&gpio0 54 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "heartbeat";
};
gpio-led3 {
label = "pl_led0";
gpios = <&axi_gpio_0 0 0 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
gpio-led4 {
label = "pl_led1";
gpios = <&axi_gpio_0 1 0 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "timer";
};
gpio-led5 {
label = "ps_led0";
gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
gpio-led6 {
label = "ps_led1";
gpios = <&gpio0 8 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "timer";
};
};
keys {
compatible = "gpio-keys";
autorepeat;
gpio-key1 {
label = "pl_key0";
gpios = <&gpio0 55 GPIO_ACTIVE_LOW>;
linux,code = <KEY_LEFT>;
gpio-key,wakeup;
autorepeat;
};
gpio-key2 {
label = "pl_key1";
gpios = <&gpio0 56 GPIO_ACTIVE_LOW>;
linux,code = <KEY_RIGHT>;
gpio-key,wakeup;
autorepeat;
};
gpio-key3 {
label = "ps_key1";
gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
linux,code = <KEY_UP>;
gpio-key,wakeup;
autorepeat;
};
gpio-key4 {
label = "ps_key2";
gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
linux,code = <KEY_DOWN>;
gpio-key,wakeup;
autorepeat;
};
touch-key {
label = "touch_key";
gpios = <&gpio0 57 GPIO_ACTIVE_HIGH>;
linux,code = <KEY_ENTER>;
gpio-key,wakeup;
autorepeat;
};
};
beep {
compatible = "gpio-beeper";
gpios = <&gpio0 58 GPIO_ACTIVE_HIGH>;
};
usb_phy0: phy0@e0002000 {
compatible = "ulpi-phy";
#phy-cells = <0>;
reg = <0xe0002000 0x1000>;
view-port = <0x0170>;
drv-vbus;
};
};
&uart0 {
u-boot,dm-pre-reloc;
status = "okay";
};
&sdhci0 {
u-boot,dm-pre-reloc;
status = "okay";
};
&usb0 {
dr_mode = "otg";
usb-phy = <&usb_phy0>;
};
&qspi {
u-boot,dm-pre-reloc;
flash@0 { /* 16 MB */
compatible = "w25q256", "jedec,spi-nor";
reg = <0x0>;
spi-max-frequency = <50000000>;
#address-cells = <1>;
#size-cells = <1>;
partition@0x00000000 {
label = "boot";
reg = <0x00000000 0x00100000>;
};
partition@0x00100000 {
label = "bootenv";
reg = <0x00100000 0x00020000>;
};
partition@0x00120000 {
label = "bitstream";
reg = <0x00120000 0x00400000>;
};
partition@0x00520000 {
label = "device-tree";
reg = <0x00520000 0x00020000>;
};
partition@0x00540000 {
label = "kernel";
reg = <0x00540000 0x00500000>;
};
partition@0x00A40000 {
label = "space";
reg = <0x00A40000 0x00000000>;
};
};
};
&gem0 {
local-mac-address = [00 0a 35 00 8b 87];
phy-handle = <ðernet_phy>;
ethernet_phy: ethernet-phy@7 { /* yt8521 */
reg = <0x7>;
device_type = "ethernet-phy";
};
};
&gem1 {
local-mac-address = [00 0a 35 00 11 55];
phy-reset-gpio = <&gpio0 63 GPIO_ACTIVE_LOW>;
phy-reset-active-low;
phy-handle = <&pl_phy>;
pl_phy: pl_phy@4 {
reg = <0x4>;
device_type = "ethernet-phy";
};
};
&watchdog0 {
status = "okay";
reset-on-timeout; // Enable watchdog reset function
};
&adc {
status = "okay";
xlnx,channels {
#address-cells = <1>;
#size-cells = <0>;
channel@0 {
reg = <0>;
};
};
};
&i2c0 {
clock-frequency = <100000>;
eeprom@50 {
compatible = "atmel,24c64";
reg = <0x50>;
pagesize = <32>;
};
rtc@51 {
compatible = "nxp,pcf8563";
reg = <0x51>;
};
};
下面简单的讲解下 gpio led 的配置:
6 个 gpio led 灯分别对应开发板的 6 个 led 灯,配置信息主要包括 compatible(用于与内核驱动匹配的名字)、label(别名)、gpios(对应的 GPIO 管脚)、默认状态以及触发状态。
例如 linux,default-trigger = " timer "表示默认的触发状态是 timer 模式,也可以改为 heartbeat模式。除此之外,还有其他一些内核定义好的触发状态;default-state = "on"表示默认 led 灯是亮着的;gpios = <&gpio0 0 GPIO_ACTIVE_HIGH> 表示该 led 的控制管脚是 gpio-mio0,GPIO_ACTIVE_HIGH 表示高电平有效(也就是高电平的时候 led 灯才会亮)。
其他的暂不了解,后面驱动部分文档中再详细了解。
3.8、编译 Petalinux 工程
现在可以编译整个 Petalinux 工程了,在终端输入如下命令:
petalinux-build
该命令将生成设备树DTB文件、FSBL文件、U-Boot 文件、boot.scr 文件、Linux 内核和根文件系统文件。
编译完成后,生成的镜像文件将位于工程的 images 目录下。需要说明的是FSBL、U-Boot 这两个在本工程中并没有配置,这是因为 Petalinux 会根据 xsa 文件和前面配置 petalinux 工程自动配置FSBL和 uboot,如无特需要求,不需要再手动配置。 执行结果如下图所示:
从上图可以看出,工程已经成功编译。
3.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 会自动使用默认文件。执行结果如下图所示:
生成的 BOOT.BIN文件放在 Petalinux 工程的 images/linux 目录下,上一小节编译 Petalinux工程生成的文件同样存放在 images/linux 目录下,如下图所示:
3.10、制作 SD 启动卡
如果使用 SD 卡引导 linux 系统启动,一般需要在 SD 卡上有 2 个分区。一个分区使用 FAT32 文件系统,用于放置启动镜像文件(如 BOOT.BIN,boot.scr文件和 linux 镜像文件等),另一分区使用 EXT4 文件系统,用于存放根文件系统。 需要说明的是在《ZYNQ学习之Petalinux 设计流程实战》配置 petalinux 工程中,“Image Packaging cnfiguration”子菜单根文件系统的类型的配置使用的是默认的 INITRD,所以只需要一个使用 FAT32 文件系统的分区就可以了。当设置为“EXT4”则需要另一个存放根文件系统的分区。 本小节先讲解 SD 卡的分区和格式化,然后说明将哪些文件复制到 SD 卡中。此处的 SD卡指的是那种小卡,也称为 TF 卡。
将SD卡插入到读卡器中、并将读卡器插入电脑并连接到 Ubuntu 系统,在 Ubuntu 系统中找到 SD卡所对应的设备节点,示例中插入的SD卡对应的设备节点为/dev/sdb。在终端中输入如下命令:
umount /dev/sdb*
sudo fdisk /dev/sdb
输入“p”执行结果如下图所示:
可以看到当前的分区表,有两个分区,一个 FAT32 的分区和一个 exFAT 分区。在开始新分区之前需要将以前的分区删除,键入“d”,然后输入 1,删除 1 分区,再次键入“d”删除第 2 个分区,如果读者的 SD 卡原本就只有一个分区,前面只需执行一次删除就行。当再次键入“d”并出现提示“还没有定义分区!”时,表明已无存在的分区,如图 6.3.24 中红色字体提示所示。
下面开始新建分区。输入“n”创建一个新分区。通过选择“p”使其为主,使用默认分 区号 1 和第一个扇区 2048。设置最后一个扇区,也就是设置第一个分区的大小,一般设置500M足够了,通过输入“+500M”,为该分区预留 500MB,如果提示分区包含 vfat签名并询问是否移除该签名,则输入“y”,如下图所示:
现在设置分区类型,输入“t”,然后输入“c”,设置为“W95 FAT32 (LBA)”,如下图所示:
输入“a”,设为引导分区,如下图所示:
第一个分区就创建好了,开始创建第二个分区。 通过键入“n”来创建根文件系统分区。后面一路默认就可以了,如下图所示:
如果现在输入“p”检查分区表,会看到刚刚创建的 2 个分区。如果没问题,键入“w” 以写入到 SD 卡并退出。
完成了分区创建后,就可以格式化分区了。在终端输入如下命令:
sudo mkfs.vfat -F 32 -n boot /dev/sdb1
sudo mkfs.ext4 -L rootfs /dev/sdb2
将第一个分区格式化成 FAT32 分区并命名为 boot,将第二个分区格式化成 ext4 分区并命名为 rootfs。执行结果如下图所示:
格式化分区之后就可以挂载分区了(重新插拔读卡器或者使用 mount 命令进行挂载)。 挂载完成后,用户将该工程 image/linux 目录下的 BOOT.BIN、boot.scr 和 image.ub 文件拷贝到名为 boot 的分区也即/dev/sdb1 分区中,结果如下图所示:
3.11、开发板启动模式设置
将 SD 卡插入领航者开发板的 SD 卡槽,然后使用 USB Type-C 连接线将开发板左侧的USB_UART 接口与电脑连接,用于串口通信。领航者开发板连接 SD(TF)卡的正面图如下图所示:
接下来将领航者底板上的启动模式开关 BOOT_CFG 的两个开关均拨到下面(都置为 OFF),即设置为从 SD 卡启动。不同的启动方式与两个拨码开关的状态对应关系如下图所示:
MIO 4 | MIO 5 | |
BOOT_CFG | 1 | 2 |
JTAG | ON | ON |
NAND | OFF | ON |
QSPI | ON | OFF |
SD Card | OFF | OFF |
最后连接开发板的电源线给开发板上电。
3.12、打开串口上位机,进入 Linux 系统
打开 MobaXterm 串口上位机或其它串口上位机。上位机打印 Linux 启动信息如下:
停留在登录处,此处使用 root 用户登录,登录密码为“root”(去掉双引号),登录进去后,界面如下:
观察开发板,此时会看到板上的 LED 灯全都是亮的,其中,底板上的 PL_LED1和PS_LED1同频闪烁,这是设备树配置文件产生的结果,
四、参考链接:
ZYNQ领航者V2开发板 — 正点原子资料下载中心 1.0.0 文档
ZYNQ学习之Petalinux 设计流程实战-CSDN博客