Petalinux 制作ZYNQ镜像文件流程

2024-05-29 1140阅读

1概述

在Zynq-7000 SoC中搭建运行Linux,嵌入式软件栈。

Petalinux 制作ZYNQ镜像文件流程

处理器系统引导是一个分两个阶段的过程。第一个阶段是一个内部 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。

(1) FSBL

Zynq-7000 的第一阶段引导加载程序(FSBL)使用硬件比特流(如果存在)配置 FPGA,

并将操作系统(OS)映像或第二阶段引导加载器映像从非易失性存储器

(NAND/SD/eMC/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系统启动完成。

2 Petalinux 工具的设计流程概述

Petalinux 制作ZYNQ镜像文件流程

需要说明的是以上设计流程不是按部就班的每一步都执行一遍,可以根据使用场景有选

择的执行。一般的设计流程如下:

1. 通过Vivado创建硬件平台,得到xsa文件; 
2. 运行 source /settings.sh,设置 Petalinux 运行环境 
source /opt/pkg/petalinux/2020.2/settings.sh 
#或者 
sptl 
3. 通过petalinux-create -t project 创建 petalinux 工程; 
petalinux-create -t project --template zynq -n AZYNQ
5. 使用 petalinux-config --get-hw-description,将 xsa 文件导入到 petalinux 工程当中并配置
petalinux 工程; 
cd AZYNQ 
petalinux-config --get-hw-description ../
6. 使用petalinux-config -c kernel 配置 Linux 内核; 
7. 使用petalinux-config -c rootfs 配置 Linux 根文件系统; 
8. 配置设备树文件; 
vi project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi 
#include 
#include 
#include 
#include 
/ {
	model = "Alientek Navigator Zynq Development Board";
	compatible = "xlnx,zynq-zc702", "xlnx,zynq-7000";
    leds {
		compatible = "gpio-leds";
		gpio-led1 {
			label = "led2";
			gpios = ;
			default-state = "on";
		};
		gpio-led2 {
			label = "led1";
			gpios = ;
			linux,default-trigger = "heartbeat";
		};
		gpio-led3 {
			label = "pl_led0";
			gpios = ;
			default-state = "on";
		};
		gpio-led4 {
			label = "pl_led1";
			gpios = ;
			linux,default-trigger = "timer";
		};
		gpio-led5 {
			label = "ps_led0";
			gpios = ;
			default-state = "on";
		};
		gpio-led6 {
			label = "ps_led1";
			gpios = ;
			linux,default-trigger = "timer";
		};
	};
	keys {
		compatible = "gpio-keys";
		autorepeat;
		gpio-key1 {
			label = "pl_key0";
			gpios = ;
			linux,code = ;
			gpio-key,wakeup;
			autorepeat;
		};
		gpio-key2 {
			label = "pl_key1";
			gpios = ;
			linux,code = ;
			gpio-key,wakeup;
			autorepeat;
		};
		gpio-key3 {
			label = "ps_key1";
			gpios = ;
			linux,code = ;
			gpio-key,wakeup;
			autorepeat;
		};
		gpio-key4 {
			label = "ps_key2";
			gpios = ;
			linux,code = ;
			gpio-key,wakeup;
			autorepeat;
		};
		touch-key {
			label = "touch_key";
			gpios = ;
			linux,code = ;
			gpio-key,wakeup;
			autorepeat;
		};
	};
	beep {
		compatible = "gpio-beeper";
		gpios = ;
	};
	usb_phy0: phy0@e0002000 {
		compatible = "ulpi-phy";
		#phy-cells = ;
		reg = ;
		view-port = ;
		drv-vbus;
	};
};
&uart0 {
	u-boot,dm-pre-reloc;
	status = "okay";
};
&sdhci0 {
	u-boot,dm-pre-reloc;
	status = "okay";
};
&usb0 {
	dr_mode = "otg";
	usb-phy = ;
};
&qspi {
	u-boot,dm-pre-reloc;
	flash@0 { /* 16 MB */
		compatible = "w25q256", "jedec,spi-nor";
		reg = ;
		spi-max-frequency = ;
		#address-cells = ;
		#size-cells = ;
		partition@0x00000000 {
			label = "boot";
			reg = ;
		};
		partition@0x00100000 {
			label = "bootenv";
			reg = ;
		};
		partition@0x00120000 {
			label = "bitstream";
			reg = ;
		};
		partition@0x00520000 {
			label = "device-tree";
			reg = ;
		};
		partition@0x00540000 {
			label = "kernel";
			reg = ;
		};
		partition@0x00A40000 {
			label = "space";
			reg = ;
		};
	};
};
&gem0 {
	local-mac-address = [00 0a 35 00 8b 87];
	phy-handle = ;
	ethernet_phy: ethernet-phy@7 {	/* yt8521 */
		reg = ;
		device_type = "ethernet-phy";
	};
};
&gem1 {
	local-mac-address = [00 0a 35 00 11 55];
	phy-reset-gpio = ;
	phy-reset-active-low;
	phy-handle = ;
	pl_phy: pl_phy@4 {	
		reg = ;
		device_type = "ethernet-phy";
	};
};
&watchdog0 {
	status = "okay";
	reset-on-timeout;		// Enable watchdog reset function
};
&adc {
	status = "okay";
	xlnx,channels {
		#address-cells = ;
		#size-cells = ;
		channel@0 {
			reg = ;
		};
	};
};
&i2c0 {
	clock-frequency = ;
	eeprom@50 {
		compatible = "atmel,24c64";
		reg = ;
		pagesize = ;
	};
	rtc@51 {
		compatible = "nxp,pcf8563";
		reg = ;
	};
};
10. 使用petalinux-build 编译整个工程; 
petalinux-build
11. 使用petalinux-package --boot制作 BOOT.BIN启动文件; 
petalinux-package --boot --fsbl --fpga --u-boot --force
13. 制作SD启动卡,将BOOT.BIN和image.ub以及根文件系统部署到SD卡中; 
14. 将SD卡插入开发板,并将开发板启动模式设置为从SD卡启动; 
15. 开发板连接串口线并上电启动,串口上位机打印启动信息,登录进入Linux系统。
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]