ZYNQ #2 - Linux环境下烧录BOOT.BIN从QSPI-FLASH启动

2023-11-04

这篇博文讲述的是在Linux环境下,将生成的新BOOT.BIN利用dd指令写入板上qspi flash中。板子从flash启动后,转至SD卡执行linux内核。这篇博文是为了之后不使用SD卡,将linux内核以及根文件系统放入emmc启动做准备。

目录

0 - 前言

1 - 准备工作

2 - 建立新的"BOOT_FOR_QSPIFLASH.BIN"

3 - 利用SD卡上运行的linux系统烧录新的BOOT.BIN到FLASH中


0 - 前言

前面我们使用petalinux制作linux从板子上启动都是从SD卡(TF卡)启动的,但是在绝大部分的应用场景中,使用SD卡作为存储载体明显不是一个很好的选择。为了探究如何摆脱SD卡的存储方式,这篇博文记载了些实验性的研究。

ZYNQ的上电启动其实可以分为三个部分:BootROM、FSBL(First Stage Boot Loader)以及用户程序。这里用户程序可能是裸机程序,或者其他更“高级”操作系统的BootLoader,对于linux来说这里就是uboot。

这里我们不细谈上电启动,感兴趣的可以参考xilinx的XAPP1158,是讲解vxworks在zynq上的部署方法,但是前半部分讲解了zynq的启动流程。我们知道,在使用petalinux生成linux时,执行petalinux-package后会生成两个文件,一个BOOT.BIN,一个是image.ub,根据你给的指令,会打包不同的文件进入BOOT.BIN。这里我们以下面这个命令举例:

petalinux-package --boot --fsbl --fpga --u-boot --force

执行这条语句,会将FSBL、比特流文件(PL端配置程序)及uboot打包为BOOT.BIN文件。当ZYNQ上电启动后,先执行固化在内部的BootROM程序,初始化NAND、NOR、Quad-SPI、SD以及PCAP。BootROM执行完毕后,会将FSBL加载到OCM(On Chip Memory)然后执行FSBL。FSBL中会用比特流文件对PL部分编程,初始化DDR,然后将用户程序(uboot)拷贝到DDR来执行。这里可以看到,FSBL以及我们的UBOOT其实是被打包在了BOOT.BIN文件中,而我们的linux内核,linux根文件系统则可以在其他的地方,只要告诉uboot执行时跳转到哪里调用linux内核即可。

因此,我们为了使用板载的“固态”存储器来启动linux系统,我们有两种方法来完成这个操作:

  • BOOT.BIN放置在QSPI Flash中,linux内核(image.ub)、linux根文件系统放置在emmc中。选择从QSPI启动
  • BOOT.BIN、image.ub以及根文件系统都放置到emmc中。选择从emmc启动

那么就有一个问题,我们要如何将BOOT.BIN、image.ub以及根文件系统分别放置到flash和emmc中呢?因为这些板载的存储器并不像sd卡或者tf卡一样可以直接使用读卡器从电脑上进行读写。有一种方便的方法就是用已经在sd卡中搭建好的linux来对这些flash和emmc进行操作。

下面以将BOOT.BIN写入FLASH中,uboot唤起SD卡中的image.ub做个例子。为啥不做emmc的?因为我新买的板子还没到,手头这个板子没得emmc。

注:zynq7000系列不支持将emmc作为第一启动设备,即不支持从emmc读取BOOT.BIN中的FSBL,ultrascale系列支持这项操作。

参考:

1 - 准备工作

一块已经能从sd卡跑linux的,板上有QSPI FLASH,并且vivado建立工程时已经连接好这个flash,petalinux生成的linux(或者包含好了qspi flash驱动的linux)的一块fpga板卡。

2 - 建立新的"BOOT_FOR_QSPIFLASH.BIN"

打开之前的工程(可以参考之前的博客https://blog.csdn.net/sements/article/details/88921275#6%20-%20%E7%94%9F%E6%88%90BOOT.BIN%E5%8F%8Aimage.ub%E6%96%87%E4%BB%B6),运行下面的指令进行petalinux的配置

petalinux-config

在打开的页面中,修改下列的选项

  • 设置boot image settings存储媒介为primary flash(即我们板上的QSPI FLASH)
  • 设置kernel image settings存储媒介为primary sd
#Subsystem AUTO Hardware Settings --->
#   Advanced bootable images storage Settings --->
#       boot image settings --->
#           image storage media ---> primary flash
#       kernel image settings --->
#           image storage media ---> primary sd

题外话:zynq支持两个SD/SDIO外设,可以接SD卡或者emmc芯片。当两者都在硬件设计上存在时,接在SD0上的设备在/dev中显示为mmcblk0,SD1上的显示为mmcblk1。这里不需要考虑,因为我板上没有添加emmc硬件,只有sd卡硬件,但是当后面两者同时存在时,则需要在SD/SDIO Settings 配置项中指定主要的SD外设。

参考【 】CH10 调整EMMC和SD的挂载顺序并且实现开机自动烧录QSPI - LINUX教程(2018) 米联客  http://www.osrc.cn/forum.php?mod=viewthread&tid=1647&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline

重新编译:

petalinux-build

编译完成后,我们打包生成BOOT.BIN

petalinux-package --boot --fsbl --fpga --u-boot --force

从images/linux文件夹下拷贝出BOOT.BIN备用。

3 - 利用SD卡上运行的linux系统烧录新的BOOT.BIN到FLASH中

将新的BOOT.BIN拷贝到正在运行的SD卡上的linux系统中(可以用sftp传输)。

打开/dev文件夹,查看FLASH:

ls /dev

 

可以看到,这里mtd开头的即是我们板上的flash了,我们接下来需要将新的BOOT.BIN写入到mtdblock0中即可

dd if=新的BOOT.BIN of=/dev/mtdblock0

写入完毕后,poweroff关机linux,将开发板启动模式选择为QSPI,将SD卡拔出,上电,我们可以看到以下的调试信息

U-Boot 2018.01 (Apr 28 2019 - 12:58:04 +0000) Xilinx Zynq ZC702

Model: Zynq ALINX Development Board
Board: Xilinx Zynq
Silicon: v3.1
I2C:   ready
DRAM:  ECC disabled 512 MiB
MMC:   Card did not respond to voltage select!
mmc_init: -95, time 23
mmc@e0100000 - probe failed: -95
Card did not respond to voltage select!
mmc_init: -95, time 24

SF: Detected w25q256 with page size 256 Bytes, erase size 4 KiB, total 32 MiB
*** Warning - bad CRC, using default environment

In:    serial@e0001000
Out:   serial@e0001000
Err:   serial@e0001000
Model: Zynq ALINX Development Board
Board: Xilinx Zynq
Silicon: v3.1
Net:   ZYNQ GEM: e000b000, phyaddr 1, interface rgmii-id
eth0: ethernet@e000b000
U-BOOT for alinx_linux_base

ethernet@e000b000 Waiting for PHY auto negotiation to complete...... done
BOOTP broadcast 1
DHCP client bound to address 192.168.2.54 (8 ms)
Hit any key to stop autoboot:  0 
Card did not respond to voltage select!
mmc_init: -95, time 23
** Bad device mmc 0 **
no mmc device at slot 0
Zynq> 

说明已经正常的从QSPI FLASH中加载新的BOOT.BIN,并运行uboot了,只是这里由于我将SD卡拔出,所以"no mmc device at slot0"

断电,将带有image.ub的SD卡插入,重新上电(还是从QSPI启动),可以看到以下调试信息

 

可以看到linux系统已经正常的跑起来了。

救救穷学生,5毛买根辣条

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZYNQ #2 - Linux环境下烧录BOOT.BIN从QSPI-FLASH启动 的相关文章

  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 添加文件时运行 shell 命令

    我的 Linux 机器上有一个名为 images 的文件夹 该文件夹连接到一个网站 该网站的管理员可以向该网站添加图片 但是 当添加图片时 我想要一个命令来运行调整目录中所有图片的大小 简而言之 我想知道当新文件添加到特定位置时如何使服务器
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 如何查找哪个 Yocto 项目配方填充图像根文件系统上的特定文件

    我经常与 Yocto 项目合作 一个常见的挑战是确定文件为何 或来自什么配方 包含在 rootfs 中 这有望从构建系统的环境 日志和元数据中得出 理想情况下 一组命令将允许将文件链接回源 即配方 我通常的策略是对元数据执行搜索 例如gre
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 检查已安装的软件包,如果没有找到则安装

    我需要检查已安装的软件包 如果未安装则安装它们 RHEL CentOS Fedora 示例 rpm qa grep glibc static glibc static 2 12 1 80 el6 3 5 i686 如何在 BASH 中进行检
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • c++11增加的变参数模板,今天总算整明白了

    本篇文章介绍一下c 11中增加的变参数模板template
  • C运行时库(C Run-time Library)详解

    一 什么是C运行时库 1 C运行时库就是 C run time library 是 C 而非 C 语言世界的概念 取这个名字就是因为你的 C 程序运行时需要这些库中的函数 2 C 语言是所谓的 小内核 语言 就其语言本身来说很小 不多的关键
  • AIX系统文件压缩解压缩及性能诊断常用命令

    AIX系统文件压缩解压缩及性能诊断常用命令 磁带设备 顺序读取 文件类型 dev rmtx dev rmtx 1 dev rmtx 2 掌握 zip tar tape archive 保留原有权限 没有压缩 只是打包 创建 tar cvf
  • Basic Level 1091 N-自守数 (15分)

    题目 如果某个数 K 的平方乘以 N 以后 结果的末尾几位数等于 K 那么就称这个数为 N 自守数 例如 3 9 2 2 25392
  • 【python】excel文件(.xls文件)处理

    目录 概述 xlrd xlwt xlutils 概述 xlrd 用于读取文件 xlwt 用于写入文件 xlutils 是两个工具包的桥梁 也就是通过xlrd 读取 xls文件 然后通过xlutils 将文件内容交给xlwt处理并且保存 xl
  • 新手linux安装vasp_一步一步教你如何在linux 下安装VASP 【真的是从零开始】

    首先我是一个linux 小白 只接触过linux 的基本用法 听说VASP 编译很复杂 故想学习之 如果大神见了 请直接飘过 非常期待和大家互动交流 下面就直接进入主题 如何在linux 下面安装VASP 首先我想说说什么叫编译 为什么要编
  • 线阵相机、镜头及光源的选型

    线阵相机顾名思义就是取像是成线性的 它的传感器是成线型的 举个例子 比如面阵相机的分辨率是640 480就是说这个相机横向有640个像元 纵向有480个像元 而线阵相机分辨率只体现在横向 比如2048像素的线阵相机就是说横向有2048个像元
  • 颜色空间YUV简介

    YUV概念 YUV是被欧洲电视系统所采用的一种颜色编码方法 属于PAL Phase Alternation Line 是PAL和SECAM模拟彩色电视制式采用的颜色空间 其中的Y U V几个字母不是英文单词的组合词 Y代表亮度 其实Y就是图
  • java集合的copy

    java拷贝集合的方法有很多种 常用的比较简单的做法有两种 直接使用集合构造方法实现浅拷贝 这种方法只是保证list和listCopy的引用不一样 但是集合元素的引用时一样的 List
  • 生产管理MES系统框架

    1 总体框架描述 生产管理MES系统框架涵盖了涉及生产制造范畴内的所有业务管理内容 包括 产品生产数据 销售订单管理 材料需求计算和计划 采购管理 仓库物流管理 主生产计划 生产作业管理 生产过程物料加工 生产过程工装组装管理 品质管理 检
  • idea 插件的使用 进阶篇(个人收集使用中的)

    idea 插件的使用 进阶篇 个人收集使用中的 恭喜你 如果你已经看到这篇文章 证明在idear使用上已经初有小成 那么就要向着大神进发了 下边就是大神之路 插件的设置 在 IntelliJ IDEA 的安装讲解中我们其实已经知道 Inte
  • Quartz和Spring Task定时任务的简单应用和比较

    一 Quartz 引入quartz的jar包 配置文件中定义org springframework scheduling quartz MethodInvokingJobDetailFactoryBean 并指定它的targetObject
  • 理解HTML、CSS、javascript之间的关系

    理解HTML CSS javascript之间的关系 版权属于 博客园 牧云流 本文作者 牧云流 原文链接 https www cnblogs com dreamingbaobei p 10407626 html 网页主要有三部分组成 结构
  • pygame从入门到放弃(一)

    首先pip 那个pygame 然后看代码 临时写的 图片就不插了 防止舍友砍我 现在是凌晨 TOC 井字棋游戏 此代码基本能立于不败之地 import random 可视化输出 def draw Board board print prin
  • gcc中预定义的宏__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__

    今天在看Linux系统编程这本书的代码的时候看到了 GNUC 不太清楚这个宏所以去查了一下 以此记录 GNU C预定义了一系列的宏 这些宏都是以双下划线开始的 这里只讲一下 GNUC GNUC MINOR GNUC PATCHLEVEL 完
  • vue中this.$set()的用法

    1 this set 的作用 向响应式对象中添加一个属性 并确保这个新属性同样是响应式的 且触发视图更新 this set 用于向响应式对象上添加新属性 因为 Vue 无法探测普通的新增属性 简单来说 就是我们在methods中给数据添加了
  • 整数拆分--

    题目描述 一个整数总可以拆分为2的幂的和 例如 7 1 2 4 7 1 2 2 2 7 1 1 1 4 7 1 1 1 2 2 7 1 1 1 1 1 2 7 1 1 1 1 1 1 1 总共有六种不同的拆分方式 再比如 4可以拆分成 4
  • [每日两题系列]刷算法题咯~~

    今日题目 最小栈 有效的括号 本系列所选题目均来自力扣或者牛客网站 所选题目主要是以其中的简单题为主 中等题为辅 包含少数困难题 原因是 本人目前能力还不够 开展这个系列的目的是督促自己 在暑假的时间里也要保持有一定的刷题量 拒绝摆烂 话不
  • FISCO BCOS 联盟链Max搭建

    FISCO BCOS Max版本 版本说明 为了能够支撑海量交易上链场景 v3 0 0推出了Max版本FISCO BCOS Max版本FISCO BCOS旨在提供海量存储服务 高性能可扩展的执行模块 高可用的故障恢复机制 Max版FISCO
  • ZYNQ #2 - Linux环境下烧录BOOT.BIN从QSPI-FLASH启动

    这篇博文讲述的是在Linux环境下 将生成的新BOOT BIN利用dd指令写入板上qspi flash中 板子从flash启动后 转至SD卡执行linux内核 这篇博文是为了之后不使用SD卡 将linux内核以及根文件系统放入emmc启动做