Petalinux 制作ZYNQ镜像文件流程

1概述

在Zynq-7000 SoC中搭建运行Linux,嵌入式软件栈。
在这里插入图片描述
处理器系统引导是一个分两个阶段的过程。第一个阶段是一个内部 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 工具的设计流程概述

在这里插入图片描述
需要说明的是以上设计流程不是按部就班的每一步都执行一遍,可以根据使用场景有选
择的执行。一般的设计流程如下:

1. 通过Vivado创建硬件平台,得到xsa文件; 
2. 运行 source <petalinux 安装路径>/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 <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 = <&ethernet_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>;
	};
};

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系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/652394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机通信协议(1):SPI简介

关于SPI SPI&#xff08;串行外设接口&#xff09;是板载设备间通信接口之一。它是由摩托罗拉公司&#xff08;飞思卡尔半导体&#xff09;推出的。由于其简单性和通用性&#xff0c;它被纳入各种外围设备中&#xff0c;并与飞利浦I2C总线并列。 SPI的三线或四线信号数量比IIC…

connection problem,giving up

参考&#xff1a; https://zhuanlan.zhihu.com/p/93438433 仅仅安装 sudo apt-get install xrdp 在用RDP远程的时候总是卡在登录界面&#xff0c;connection problem,giving up&#xff0c; some problem… 第一步&#xff1a; sudo apt-get install xserver-xorg-core sudo…

接口性能测试复盘:解决JMeter超时问题的实践

在优化接口并重新投入市场后&#xff0c;我们面临着一项关键任务&#xff1a;确保其在高压环境下稳定运行。于是&#xff0c;我们启动了一轮针对该接口的性能压力测试&#xff0c;利用JMeter工具模拟高负载场景。然而&#xff0c;在测试进行约一分钟之后&#xff0c;频繁出现了…

【OpenVINO™】在C#中使用 OpenVINO™ 部署 YOLOv10 模型实现目标

文章目录 1. 前言1.1 OpenVINO™ C# API1.2 YOLOv10 2. 模型获取2.1 源码下载2.2 配置环境2.3 下载模型 3. Yolov10 项目配置3.1 项目创建与环境配置3.2 定义模型预测方法3.2.1 定义目标检测模型方法3.2.2 使用OpenVINO™ 预处理接口编译模型 3.2 模型预测方法调用 4. 项目运行…

在Linux中 --help 和 -h 的区别

在Linux命令行工具中&#xff0c;--help 和 -h&#xff08;而不是 -help&#xff09;是常见的选项&#xff0c;用于显示工具的帮助信息。 --help&#xff1a; 这是一个长选项&#xff08;long option&#xff09;&#xff0c;用于提供详细的帮助信息。许多工具都支持这个选项。…

这款信创FTP软件,可实现安全稳定的文件传输

信创&#xff0c;即信息技术应用创新&#xff0c;2018年以来&#xff0c;受“华为、中兴事件”影响&#xff0c;国家将信创产业纳入国家战略&#xff0c;并提出了“28n”发展体系。“8”具体指金融、石油、电力、电信、交通、航空航天、医院、教育等主要行业。目前企业使用比较…

ElementPlus-日期选择器实现周选择

ElementPlus的日期选择器实现周选择&#xff0c;并且显示的是日期范围&#xff0c;其效果如下&#xff1a; 首先修改中文语言环境&#xff0c;否则日期选择器是从周日开始的。在main.js文件中加上以下代码&#xff1a; import ElementPlus,{dayjs as elDayjs} from element-…

【包邮送书】你好!C语言

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

使用YOLOv9训练和测试自己的数据集

任务&#xff1a;检测舌头上的裂纹和齿痕 已经有了labelme标注的数据集&#xff0c;并且转为了coco格式 参考&#xff1a; 详细&#xff01;正确&#xff01;COCO数据集&#xff08;.json&#xff09;训练格式转换成YOLO格式&#xff08;.txt&#xff09;_coco数据集的train…

【Fiddler抓包工具】第五节.安卓、IOS抓包+fildder插件

文章目录 前言一、HTTPS抓包 1.1 HTTPS与HTTP区别 1.2 HTTPS抓包设置过程 1.3 错误解决方法 1.4 验证证书是否安装成功 1.5 Firefox HTTPS请求捕获二、IOS设备APP抓包 2.1 APP抓包Fiddler设置 2.2 APP抓包IOS设备设置 2.3 And…

拓展虚拟世界边界,云手机可以做到吗

虚拟世界&#xff0c;AI&#xff0c;VR等词汇是21世纪最为流行的词汇&#xff0c;在科技背后&#xff0c;这些词汇的影响变得越来越大&#xff0c;已经走进了人们的世界&#xff0c;比如之前APPLE发布的vision pro&#xff0c;使人们能够更加身临其境的体验到原生os系统&#x…

linux下docker 的使用(2)

上期我们讲了网络&#xff0c;现在来进行最后的 docker的基础内容 java项目的部署 假如说 我们java 项目已经写好了&#xff0c;现在在maven中打包一下我们的项目&#xff0c;然后会得到一个jar包&#xff0c;把jar包 上传到虚拟机上 点击package 命令&#xff0c;会得到一个…

js toFixed()四舍五入丢失精度问题处理

js toFixed()四舍五入丢失精度问题处理 错误展示 看了下lodash的代码&#xff0c;大概是通过使用科学计数法扩大10的n次&#xff0c;将操作数化为整数运算&#xff0c;可以避免精度丢失。 /*** Creates a function like _.round.** private* param {string} methodName The …

艾体宝干货 | 教程:使用ntopng和nProbe监控网络流量

本教程旨在分享如何通过 ntopng 和 nProbe 这两款工具&#xff0c;深入了解和掌握网络流量监控的艺术。我们将提供从基本概念到高级应用的全面指导&#xff0c;涵盖了在多种平台和设备上的部署和配置步骤。不论您是专业人员还是技术爱好者&#xff0c;跟随本教程&#xff0c;都…

IPD管理体系指南

目录 简介 CSDN学院 作者简介 简介 学习任何新的和识或体系&#xff0c;都是需要从这个体影涉及的概念开始的。 IPD 合集也是遵活的这个基础逻辑。 通过 100 例的内容&#xff0c;先将 IPD 涉及到的机含点做了一个统一的梳理。 而本期课程呢&#xff0c;作为IPD 体系的前…

文盘Rust -- 生命周期问题引发的 static hashmap 锁

100编程书屋_孔夫子旧书网 2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了。项目地址:https://github.com/jiashiwen/interactcli-rs。 春节以前看到axum已经0.4.x了,于是想看看能不能用rust做个服务端的框架。 春节…

已解决ModuleNotFoundError : No module named ‘pandas亲测有效!!!

已解决ModuleNotFoundError : No module named ‘pandas亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 报错问题解决思路解决方法 报错问题 在运行Python代码时&#xff0c;你可能会遇到以下报错信息&#xff1a; ModuleNotFoundError: No module named pandas这个…

【算法】重建二叉树并进行后序遍历的Java实现

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

[AIGC] Java常用的JSON库及简单示例

Java常用的JSON库及简单示例 在Java的世界里&#xff0c;JSON库广泛用于日常开发工作&#xff0c;本文将介绍几个常用的JSON库并配以简单的示例代码。 1. Gson Gson是Google提供的一个用来在Java对象和JSON数据之间进行转换的Java库。 它有一定的学习曲线&#xff0c;但一旦熟…