从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二)

【Zynq7010 ebaz4205矿渣变废为宝(此教程包含如何更改PL侧的电路,使得能够正常使用PL侧的资源)】 FPGA ebaz4205矿渣变废为宝(此教程包含如何更改PL侧的电路,使得能够正常使用PL侧的资源) 阅读详情
AI摘要

本文介绍基于Petalinux为矿卡EBAZ4205构建、验证和烧录启动镜像的方法。包括在Ubuntu中安装Petalinux,对网口、TF卡适配及Vivado工程修改,Petalinux工程构建,将镜像固化到NAND Flash等内容,还提及相关知识如image.ub和RAMDisk Filesystem。

前情提要:从零开始的ZYNQ学习(基于矿卡EBAZ4205)(一)

0. 声明

本文由长春理工大学电子信息工程学院C&I实验室所有,已获得原作者发布授权。转载请注明出处。

本文编写过程中参考了很多前辈的记录,在此表示感谢,已将所有参考项列于文末。

当前版本R1.0(预发布)。

作者联系方式:E-mail: WindForest@yeah.net

6. 基于Petalinux的镜像构建、验证和烧录

网上有大佬前辈从源码构建了矿卡可用的镜像,参见zynq[2] Linux from scratch,实在是太详细了,因此不再重复(实际上是我太懒不想去做)。本章尝试使用官方提供的Petalinux工具生成启动镜像,使用TF卡启动方式验证镜像的正确性,并将其烧录到NAND Flash中。

本章涉及到的外设有:DDR、UART1、TF、NET0。

6.1 Petalinux介绍

PetaLinux 是一种嵌入式Linux软件开发套件(SDK),主要用于XILINX FPGA基片上系统设计。由于其采用Buildroot构建系统,因此可以在简单的配置下,一步生成所需要的bootloader、kernel、rootfs镜像以及应用软件库。

Petalinux由Xilinx官方提供,对于不同版本的Vivado,Petalinux也有对应的版本,安装时需注意选择和区分。

6.2 在Ubuntu中安装Petalinux

这里必须得意一下,安装流程我曾经在优快云上写过,庆幸于使用的同样是Markdown语言,我可以轻松将那些文字和图片拷贝过来,哈哈。

对于使用流程来说,大部分人可能还是比较喜欢Windows环境,而且因为本机安装的是Windows,而计算机硬件的资源又有限,所以在虚拟机中运行XILINX所有的开发工具不太方便。在参考了大部分开发环境搭建方式后,个人觉得“在Windows下使用Vivado生成板级描述文件,传到虚拟机中使用Petalinux生成烧录镜像,再使用Windows下的SDK进行烧写”的开发方式是在本地计算机资源有限的情况下比较容易被接受的。

安装准备包括安装文件和参考文件。

(1)安装包下载

安装文件的名称是petalinux-v2017.4-final-installer.run,官方网站可以下载,页面链接:

XILINX下载页-petalinux存档

安装包选择其中MD5值为9b406fa5cc732da52944b3ce6718e19d的7.86GB的单文件。

在这里插入图片描述

(2)参考手册下载

UG1144是非常实用的手册,该用户指南中介绍了Petalinux的一切官方让你知道的。上图中的右侧,点击 Petalinux工具文档 项,在页面中找到 《UG1144 - PetaLinux 工具文档:参考指南 (中文版) (v2019.1)》 文档下载之(当然你照着这篇文章安装的话可以不用参考此指南)。

可能你想问,我安装的是2017.4版本的Petalinux,为什么这里要下载的是2019.1版本的呢?因为截至目前,官网中只有这个版本的UG1144是中文的,读起来比较顺畅,而且与2017.4版本在大体描述上相差不大(…也许吧)。

(3)虚拟机环境搭建

搭建过程网上有的是说明,在此只说一下硬盘空间分配的问题,我把我目前安装完之后的情况告诉你,在Ubuntu采用最小安装、移除无关组件、安装必要组件、安装vmware-tool、保存安装文件和安装完之后的文件的情况下,硬盘占用小于30GB。

注意,这个版本的Petalinux推荐使用Ubuntu16.04.6LTS进行安装,因为其它版本的Ubuntu对它的支持可能不是很好,会出问题,比如在Ubuntu18.04中,安装后执行settings.sh后会出现下图所示错误、以及使用petalinux-build命令编译的时候会出现“需要支持en_US.UTF8”等问题,而在Ubuntu16.04中是正常的。比如:

在这里插入图片描述

(4)安装依赖包

《UG1144 - PetaLinux 工具文档:参考指南 (中文版) (v2019.1)》文档对Ubuntu下依赖包的配置描述不完全适用于2017.4版本的Petalinux。Petalinux2017.4的依赖包如下,直接复制粘贴运行就行了(其中有可能安装时会重复,但是无关紧要),安装时注意保持网络畅通:

sudo apt install make net-tools libncurses-dev libncurses-dev zlib1g:i386 flex libssl-dev bison libselinux1 gnupg wget diffstat chrpath socat xterm autoconf libtool tftpd unzip texinfo zlib1g-dev gcc-multilib build-essential gzip pax screen gawk tofrodos xvfb python git libsdl1.2-dev libglib2.0-dev

(5)安装Petalinux

首先要注意此程序不能在root权限下安装,比如运行前加“sudo”是不行的,它会提示并且运行不下去。

在运行时如果不指定安装的目录,会安装到安装文件所在目录下,而且还不会自动新建文件夹,如果安装到opt之类的目录,记得把目录权限改成rwxr-xr-x(755),不然等上十几分钟之后安装不了心情是很崩溃的。

./petalinux-v2017.4-final-installer.run /安装位置

安装流程大致为:对安装包校验->解压文件->确认3个协议->(安装目录提示——如果没有指明目录的话)->完成安装。

(6)安装验证

首先进入到安装目录下执行:

source settings.sh

而后在终端中输入 petalinux- 并按两次TAB键,如果出现命令补全提示,那么就是OK了。

如果这台虚拟机只用来开发Petalinux,那么可以把source语句写入到.bashrc文件中,这样在每次启动终端的时候都会自动加载了。

即在~/.bashrc文件最后增加如下语句:

source /petalinux安装路径/settings.sh

那这些petalinux命令是用来干嘛的呢?参考手册中13页中的说明如下:

在这里插入图片描述
至此,Petalinux2017.4在Ubuntu16.04下的环境配置完成。

6.3 网口、TF卡的适配和Vivado工程修改

(1)电路修改

在使用Etron的DRAM版本的矿卡上,建议断开R1485电阻并焊接C377、C380电容(22pF)和Y3晶振(25.000MHz)为IP101GA提供时钟信号,否则在U-Boot和Linux下网络功能将不可用。具体说明参见4.6-(1)小节。

注:为方便本章后续调试,建议修改R2584和R2577电阻接法,使用开关选择启动引脚MIO[5]为高电平或低电平,进而实现TF卡启动方式和NAND启动方式的切换。

在这里插入图片描述

若采用上图焊接方法,确认无误后切记固定,防止外力导致电阻焊盘脱落!

(2)修改ZYNQ7的IP核配置

Vivado工程的修改紧接着5.4-(2)小节进行,TF卡可用于内核镜像的快速验证,网口则是Linux开发的必备接口。

在ZYNQ配置界面“MIO Configuration”中,继续勾选“ENET 0”和“SD 0”:

在这里插入图片描述

其中,ENET 0的IO选择EMIO,因为在PS_MIO[16:27]中,MIO[24]和MIO[25]已经被UART1占用了。SD 0的IO保持默认,其CD、WP和Power均不需选择,因为矿卡上未做引出。

注:因为SD 0仅引出了数据/时钟引脚,故不支持插拔检测。例如从NAND启动后再插入TF卡,不会自动生成设备节点;在TF卡空闲状态下带电拔出后重新插入不一定会影响后续读写等。

解释:在ZYNQ中,EMIO是指从PL端引出的PS端口,与此相对的MIO是在PS内部集成,功能固定的具有复用功能的引脚。

在“Clock Configuration”中,设置ENET 0为百兆速度:
在这里插入图片描述
接着,把之前裸机调试时精简掉的选项增加上(注:暂不清楚是否有必要):

  1. 选择“Clock Configuration”->“PL Fabric Clocks”中“FCLK_CLK0”项;
  2. 选择“PS-PL Configuration”->“AXI Non Secure Enablement”->“GP Master AXI Interface”中“M AXI GP0 interface”项。

最后,增加一个TTC模块,Linux需要它:

在这里插入图片描述

(3)修改块设计

因为矿卡的网口通过EMIO引出,因此需手动分配这些引脚。另外,由于IP101GA是千兆网卡,查看原理图可知,其TXD和RXD共有8个,而在百兆网卡使用的MII接口中,TXD和RXD仅有4个,故需显式地增加两个Concat模块将8位转为4位,否则多余的引脚引出但未分配IO,最后生成比特流文件时会报错。

注:在ZYNQ的Block Design中,Concat IP可用于将分离的线拼接成单一线输出,相当于Verilog描述的拼接操作。其输入端口数和位宽均可配置。在其它参考设计中,有使用Slice模块代替下图中xlconcat_1模块的,其最终实现效果与下图所示一致。

增加IP核的操作与增加ZYNQ7的IP核操作相同。

最后将这些器件按照下图所示连接起来:

在这里插入图片描述

注:可通过右键端口->“Make External”做端口引出;通过右键端口->“Disconnect Pin”取消引出。

(4)综合、实现和比特流生成

点击左侧边栏“Run Synthesis(运行综合)”,综合过程中会弹出关于数据位宽的警告,此处忽略:

在这里插入图片描述
而后点击“Open Synthesized Design(打开综合设计)”对网口的引脚进行分配,在弹出的框中点“Define Target”

在这里插入图片描述
点击以生成引脚约束文件:

在这里插入图片描述
点击“Create File”,并输入文件名:

在这里插入图片描述
在这里插入图片描述
在“Source(资源)”视窗中打开该引脚约束文件:

在这里插入图片描述
并在编辑器中输入下列约束:

set_property IOSTANDARD LVCMOS33 [get_ports ENET0_GMII_RX_CLK_0]
set_property IOSTANDARD LVCMOS33 [get_ports ENET0_GMII_TX_CLK_0]
set_property IOSTANDARD LVCMOS33 [get_ports {ENET0_GMII_TX_EN_0[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_txd[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_txd[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_txd[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_txd[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports ENET0_GMII_RX_DV_0]
set_property IOSTANDARD LVCMOS33 [get_ports MDIO_ETHERNET_0_0_mdc]
set_property IOSTANDARD LVCMOS33 [get_ports MDIO_ETHERNET_0_0_mdio_io]
set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_rxd[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_rxd[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_rxd[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_rxd[3]}]

set_property PACKAGE_PIN U14 [get_ports ENET0_GMII_RX_CLK_0]
set_property PACKAGE_PIN U15 [get_ports ENET0_GMII_TX_CLK_0]
set_property PACKAGE_PIN W19 [get_ports {ENET0_GMII_TX_EN_0[0]}]
set_property PACKAGE_PIN W18 [get_ports {enet0_gmii_txd[0]}]
set_property PACKAGE_PIN Y18 [get_ports {enet0_gmii_txd[1]}]
set_property PACKAGE_PIN V18 [get_ports {enet0_gmii_txd[2]}]
set_property PACKAGE_PIN Y19 [get_ports {enet0_gmii_txd[3]}]
set_property PACKAGE_PIN W16 [get_ports ENET0_GMII_RX_DV_0]
set_property PACKAGE_PIN W15 [get_ports MDIO_ETHERNET_0_0_mdc]
set_property PACKAGE_PIN Y14 [get_ports MDIO_ETHERNET_0_0_mdio_io]
set_property PACKAGE_PIN Y16 [get_ports {enet0_gmii_rxd[0]}]
set_property PACKAGE_PIN V16 [get_ports {enet0_gmii_rxd[1]}]
set_property PACKAGE_PIN V17 [get_ports {enet0_gmii_rxd[2]}]
set_property PACKAGE_PIN Y17 [get_ports {enet0_gmii_rxd[3]}]

此处EMIO的设计流程大致为:将设计图中的端口名与PL端扩展IO建立对应关系,并对这些扩展IO的基本属性和状态进行设置即可。

Ctrl+S保存,此时效果如下:

在这里插入图片描述
直接点击左侧边栏的“Generate Bitstream(生成比特流)”,一键完成综合、实现和比特流生成。

注:这里点击“Generate Bitstream”只是为了方便,Petalinux构建过程中将基于hdf文件自动生成FSBL和需要的比特流文件。

6.4 Petalinux工程构建过程

(1)准备工作

接续上一步,Petalinux需要Vivado生成的硬件描述文件(*.hdf)作为生成镜像的配置依据,且可自动生成FSBL和比特流文件。因此SDK中只需要建立前文中适配矿卡的下载用FSBL即可。

(2)创建Petalinux工程

恭喜你走到这一步!接下来我们转到Ubuntu平台,开始激动人心的Petalinux工程!

注意:这里假设你已经安装好了Petalinux2017.4环境。

注意:请确保每一次打开Terminal运行“petalinux-xxx”命令之前,总是执行了“source settings.sh”操作。每次打开Terminal都需重新进行该操作。

说明:本文示例目录在/home/wind/下(我的用户名为wind),后续示例基于此路径。

在当前用户目录下打开Terminal,执行:

petalinux-create --type project --template zynq --name EBAZ4205-linux

即可在当前目录下建立一个名为EBAZ4205-linux、面向ZYNQ的空白Petalinux工程。

(3)配置Petalinux工程

·1)从hdf文件初始化工程

将Vivado中导出的硬件描述文件(*.hdf)拷贝到Petalinux工程目录下,并在工程目录执行:

petalinux-config --get-hw-description=./

即可完成工程的初始化。

·2)修改Petalinux工程配置

在工程目录下执行:

petalinux-config

进入Petalinux的配置菜单,并做以下修改:

注:在“Linux Components Selection”项中我们可以看到其中默认已经勾选了自动生成FSBL。

  1. 修改“Subsystem AUTO Hardware Settings(子系统自动硬件设置)”->“Advance bootable images storage Settings(高级启动镜像存储设置)”->“boot image settings(启动镜像设置)”->“image storage media(镜像存储介质)”,如果需要从NAND Flash启动,请选择“primary flash(Flash优先)”,如果需要从TF卡启动,请选择“primary sd(SD优先)”;

    注:在此修改过程中可注意到,启动镜像名(默认为BOOT.BIN)在此处修改。

  2. 修改“Subsystem AUTO Hardware Settings(子系统自动硬件设置)”->“Advance bootable images storage Settings(高级启动镜像存储设置)”->“kernel image settings(内核镜像设置)”->“image storage media(镜像存储介质)”,如果需要从NAND Flash启动,请选择“primary flash(Flash优先)”,如果需要从TF卡启动,请选择“primary sd(SD优先)”;

    注:在此修改过程中可注意到,Uboot载入的镜像名(默认为image.ub)在此处修改。

  3. 修改“u-boot Configuration”->“netboot offset”项的值为0x08000000;

    注:该值为Uboot将镜像加载到的内存地址,默认为0x10000000,即256MiB,然而矿卡采用的DDR3是单片的256MiB颗粒,如果保持默认值,会在启动时出现以下提示:

    ......
    Loading Kernel Image ... OK
    Loading Ramdisk to 07a8a000, end 07fff726 ... OK
    ERROR: image is not a fdt - must RESET the board to recover.
    FDT creation failed! hanging...### ERROR ### Please RESET the board ###
    
  4. 建议修改“Image Packaging Configuration(镜像打包配置)”,取消选择“Copy final images to tftpboot(拷贝最终镜像到tftp启动目录)”,这可以消除掉编译结束后的恼人提示,让结果展示的更加完美一点>v<;

  5. 建议修改“Image Packaging Configuration(镜像打包配置)”->“Root filesystem type(根文件系统类型)”为“INITRAMFS”,这将使本章进行的更加顺利,并降低学习难度。

    注:不要因为从TF卡启动而将此项选择为“SD Card”,否则默认将从TF卡的第二分区启动根文件系统,而本章还没进行到“制作、构建和移植根文件系统”那一步。

而后保存并退出,等待命令完成。

·3)修改Uboot配置(可选)

在工程目录下执行:

petalinux-config -c u-boot

进入Uboot的配置菜单,并可做以下修改:

  1. 建议修改“delay in seconds before automatically booting”为2(秒),减少系统启动时间,从而提高调试效率;

  2. 建议使能“Networking support”项,以便于网络调试;

  3. 建议在“Command line interface”->“Network commands”中,增加对tftp相关命令和ping命令的支持,以便于网络调试;

  4. 可以修改“Command line interface”->“Shell prompt”为自己喜欢的字符。

而后保存并退出,等待命令完成。

(4)编译Petalinux工程

在工程目录下执行:

petalinux-build

有记录如此说:二次修改后可使用:

petalinux-build -x mrproper -f

清除编译缓存以防止出现修改不生效的情况。

注意:此命令会重置整个工程目录,petalinux-config需要重新读取hdf文件,但u-boot等的配置文件不会被重置。

注:作者在首次编译通过后,使用该命令清除缓存,再次编译出现了不通过的情况,不知何故。

编译可能需要几十分钟(取决于计算机配置),编译完成后,在./images/linux/下存放着生成的镜像文件。

(5)生成启动镜像

在工程目录下执行:

cd ./images/linux/
petalinux-package --boot --format BIN --fsbl zynq_fsbl.elf --fpga ZYNQ7010_wrapper.bit --u-boot

即可在当前目录下生成BOOT.BIN和image.ub两个文件,其中BOOT.BIN=FSBL+bitstream+SSBL(U-Boot);image.ub=dtb+kernel+rootfs。

注:如果./images/linux/下已经存在BOOT.BIN和image.ub文件,则需在上述命令末尾增加“–force”以执行覆盖,否则会出现失败提示。

(6)使用TF卡启动方式验证镜像

取一张TF卡,格式化为FAT或FAT32,将上一步生成的BOOT.BIN和image.ub保存其中。插入到矿卡的TF卡槽中,并设置矿卡为SD启动方式。连接调试串口到计算机并在终端中打开,矿卡上电即可看到输出。默认的用户名和密码均为“root”。

注:需从TF卡启动时,请确保Petalinux工程配置中“image storage media(镜像存储介质)”设置为“primary sd(SD优先)”,修改后需重新编译并生成镜像。详见6.4-(3)-2)章节。

6.5 将启动镜像固化到NAND Flash

(1)生成启动镜像

首先,为了使Petalinux构建出从NAND启动的镜像,需确保Petalinux工程配置中“image storage media(镜像存储介质)”设置为“primary flash(Flash优先)”。详见6.4-(3)-2)章节。

注:如果将TF卡启动镜像的BOOT.BIN下载到NAND,其Uboot依然会尝试从MMC加载,纵使SD卡存在且存有有效镜像,这也不是我们希望的。

TF和NAND启动方式最大的不同在于,前者使用的启动命令:

fatload mmc SD器件号[0,1] 内存载入地址 镜像名称

是基于文件名的,因为文件系统的存在,文件的存储位置显得不那么重要。但在NAND启动方式中,Uboot使用的:

nand read 内存载入地址 存储起始地址 数据长度

则是基于地址的拷贝。因此,我们需要对Uboot分区做一些调整。

在这里我们不妨贴出两种启动方式下的Uboot启动指令,在Uboot命令行执行:

printenv

即可打印当前Uboot环境设置,它们有点多,因此我只摘抄了默认启动指令部分。

SD启动方式的启动指令如下:

bootcmd=run default_bootcmd
default_bootcmd=run cp_kernel2ram && bootm ${netstart}
cp_kernel2ram=mmcinfo && fatload mmc 0 0x8000000 image.ub
netstart=0x8000000

NAND启动方式的启动指令如下:

bootcmd=run default_bootcmd
default_bootcmd=run cp_kernel2ram && bootm ${netstart}
cp_kernel2ram=nand read ${netstart} ${kernelstart} ${kernelsize}
netstart=0x08000000
kernelstart=0x300000
kernelsize=0xa00000

这里的具体设置与后文匹配。

在工程目录下执行:

petalinux-config

进入Petalinux工程配置,修改“Subsystem AUTO Hardware Settings(子系统自动硬件设置)”->“Flash Settings(Flash设置)”为下图所示的参数:

在这里插入图片描述

注:这些参数取决于生成的镜像的大小,上面的设置留出了一部分余量。

而后执行编译和打包,重新生成BOOT.BIN和image.ub文件,具体过程如前文所述。

(2)使用Xilinx SDK烧录镜像

打开Xilinx SDK的下载界面,连接好矿卡的JTAG、串口线和供电。首先烧录BOOT.BIN,注意BOOT.BIN的偏移为0:

在这里插入图片描述
而后再下载image.ub,将该文件重命名为*.bin,因为SDK的下载器只认.mcs和.bin类型的文件。另外别忘了设置下载偏移:

在这里插入图片描述
确保矿卡为NAND启动方式。连接调试串口到计算机并在终端中打开,矿卡重新上电即可看到输出。默认的用户名和密码均为“root”。

注:Uboot启动时打印:

*** Warning - bad CRC, using default environment

表示从bootenv空间(前文分配的0x2E0000~0x300000)读取的数据的CRC校验不正确,这是因为首次下载时该区域中没有有效内容,只需在Uboot命令行中执行一次:

saveenv

保存启动环境配置到指定分区即可消除该警告。

(3)扩展:通过串口烧录image.ub

在已经有Uboot的情况下,可使用Uboot本身提供的读写命令烧录镜像,这里用此方式尝试一下吧!这里使用的终端软件为SecureCRT V8.5.3。

在Uboot命令行执行:

mw.b 0x800000 ff 0xA00000 #将内存中8MiB~18MiB的空间全部填充0xFF
loadb 0x800000 #使用Kermit传输,向0x800000地址写入二进制数据

而后选择“传输”->“发送Kermit(K)…”,找到image.ub文件并发送(下图中发送的是之前改名之后的image.bin):

在这里插入图片描述
发送有点慢,它的速度还是很稳定的,所以剩余时间也基本是它显示的时长,趁着它下载,起来走动走动休息一下吧!

完成后依次执行以下命令将内存中的镜像拷贝到NAND中:

nand erase 0x300000 0xA00000 #擦除NAND Flash中3MiB~13MiB的空间
nand write 0x800000 0x300000 0xA00000 #将内存中的数据写入到NAND Flash

整个过程的打印如下:

在这里插入图片描述
而后重新上电即可。

6.6 相关知识

(1)从image.ub文件到FIT

如果你有过嵌入式开发经验,一定见过许多种不同的启动镜像结构,例如海思的uboot+kernel(with dtb)+rootfs的形式、全志的u-boot spl+u-boot+dtb+kernel+rootfs的形式等等,更别说从网络启动以及众多的文件系统类型。但是Petalinux中使用的image.ub是什么?

还记得Petalinux的编译过程吗?我觉得大部分人都会在第一次编译的时候兴奋地盯着屏幕看完这一整个过程的。你会发现petalinux-build命令的执行过程中依然包含了对u-boot和kernel的单独编译,在工程目录下的./images/linux/下生成的文件也证实了这一点。另外,在配置Petalinux的时候,有指定启动镜像名称的设置项。好吧,不卖关子了,馅儿都快漏出来了,image.ub是由mkimage命令生成的镜像,是一种打包文件。(Linux中“打包”的想法真是很常见呢!)

在Terminal中运行如下命令:

mkimage -l image.ub

可查看某次生成的image.ub的文件组织结构如下:

FIT description: U-Boot fitImage for plnx_arm kernel
Created:         Sat Nov  7 14:30:08 2020
 Image 0 (kernel@0)
  Description:  Linux Kernel
  Created:      Sat Nov  7 14:30:08 2020
  Type:         Kernel Image
  Compression:  uncompressed
  Data Size:    3745696 Bytes = 3657.91 kB = 3.57 MB
  Architecture: ARM
  OS:           Linux
  Load Address: 0x00008000
  Entry Point:  0x00008000
  Hash algo:    sha1
  Hash value:   bacb21fcc869a66f89282c1445a1bf233792c66f

 Image 1 (fdt@0)
  Description:  Flattened Device Tree blob
  Created:      Sat Nov  7 14:30:08 2020
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    13641 Bytes = 13.32 kB = 0.01 MB
  Architecture: ARM
  Hash algo:    sha1
  Hash value:   4df8b976010f034a10f63072b61051413c6ed443

 Image 2 (ramdisk@0)
  Description:  ramdisk
  Created:      Sat Nov  7 14:30:08 2020
  Type:         RAMDisk Image
  Compression:  uncompressed
  Data Size:    5723987 Bytes = 5589.83 kB = 5.46 MB
  Architecture: ARM
  OS:           Linux
  Load Address: unavailable
  Entry Point:  unavailable
  Hash algo:    sha1
  Hash value:   726dbb5b6575cdf601e6ad4973507afcd1f68b79

 Default Configuration: 'conf@1'
 Configuration 0 (conf@1)
  Description:  Boot Linux kernel with FDT blob + ramdisk
  Kernel:       kernel@0
  Init Ramdisk: ramdisk@0
  FDT:          fdt@0

 Configuration 1 (conf@2)
  Description:  Boot Linux kernel with FDT blob
  Kernel:       kernel@0
  FDT:          fdt@0

从上述信息中,我们可以发现,在所生成的image.ub中,打包了Kernel镜像、FDT设备树、一个RAMDisk镜像和两份配置,一份启动到RAMDisk,另一份则仅启动到Kernel。

在早期的Uboot镜像格式中,Kernel(±dtb)被包装成uImage的形式,即在二进制文件前增加一个文件头,用以说明压缩格式、镜像类型等。随着FDT(Flattened Device Tree,扁平设备树)在ARM中逐渐普及,为了达成“同一内核”的目标,Uboot设计了一种全新的镜像格式,即FIT uImage,FIT即Flattened Image Tree(扁平镜像树)。FIT格式可以在一个文件中包含多个镜像和配置,这样同一份镜像文件就可以适配多个平台。

FIT镜像的使用依赖其中保存的配置项,使用非默认配置项可使用如下Uboot命令(其中#和@必须有,配置号参照上面的文件结构):

bootm 镜像所在内存地址#conf@配置号

具体的内容可参见这篇博文:u-boot FIT image介绍

(2)RAMDisk Filesystem

我们在配置Petalinux的时候选择的根文件系统类型为“INITRAMFS”,还记得吗?这种文件系统在启动时加载到内存,因为其运行基于内存,因此读写速度很快,但它是一个只读文件系统。因此想要将矿卡作为开发板,则最好的方法还是使用可读写的文件系统管理存储器。

当然我不打算在这章尝试使用NAND常用的yaffs2或者TF卡常用的ext4,那是后面章节要做的事情,我只是想稍微了解一下RAMFS,并记录下来而已。

“Initramfs”背后似乎隐藏着一个庞大的故事个长长的时间线。在了解Initramfs之前,我们要首先了解Initrd(Init RAM Disk,初始化RAM磁盘)。Initrd是一个在系统引导过程中挂载的、以磁盘结构存储在内存中的临时根文件系统,用来支持两阶段的引导过程。Initrd中包含必要的工具和脚本,用于在将控制权交给根文件系统上的init应用程序之前挂载所需的文件系统。Linux内核在此根磁盘上触发安装脚本(通常称为 linuxrc,但该名称不是必需的),此脚本的工作是准备系统、切换到真正的根文件系统,然后调用init。

虽然在一些情况下使用Initrd是必要的,但是它有一些缺点:

  • Initrd是一个完整的块设备,他需要整个文件系统的开销,它有一个固定的大小。选择的Initrd太小了,所需要的脚本不适用;过大的话则会浪费内存。
  • 因为它是一个真实的、 静态的设备,它消耗 Linux 内核中的缓存内存和易于使用的文件(如分页),这使得 Initrd 有更大的内存消耗。

Initramfs 的诞生就是为了解决这些问题。Initramfs基于tmpfs,使用cpio进行归档,通过gzip进行压缩,它不是一个单独的块设备,所以没有缓存和额外的开销。

更多的介绍来源已放在文末参考资料列表中。

参考资料

本文编写过程中参考的所有资料均列在下方。本文若与任何列表之外的文章、博客、视频、教程等描述相同或相似则纯属巧合。

另在此处再次对以下资料的作者们表示感谢。

1. 相关信息

  1. ZYNQ Block Design中总线位宽的截取与合并操作
  2. ZYNQ跑系统 系列(二) petalinux方式移植linux_优快云
  3. zynq的uboot模式下TFTP更新bit、内核等文件_优快云
  4. ZYNQ petalinux系统启动文件固化到FLASH
  5. Petalinux制作linux系统(续)image.ub文件来龙去脉_优快云
  6. u-boot FIT image介绍
  7. ZYNQ SoC嵌入式开发(一):配置SD卡作为根文件系统_优快云
  8. PetaLinux启动过程解析
  9. [Bootloader]uboot的环境变量保存在哪?
  10. U-Boot移植–环境变量保存位置
  11. nandflash启动设置环境变量导致不能启动
  12. NAND上 u-boot 保存环境变量
  13. linux中的rootfs/initrd/ramfs/initramfs
  14. Initramfs/指南
  15. initramfs

2. 参考描述

  1. zynq7010之EBAZ4205入门改造_优快云
  2. “关于EBAZ4205的PL部分的时钟的说明_OSCHINA”
  3. zynq7010之EBAZ4205之helloworld_优快云
  4. 100块学会ZYNQ-矿板Nand Flash烧写和启动_优快云
  5. zynq 制作镜像_优快云
  6. EBAZ4205 ZYNQ 7Z010 裸机程序NAND固化 JTAG调试方法_简书
  7. 【ZYNQ】EBAZ4205 ZYNQ 7010矿板改造开发板_优快云
  8. ZYNQ 从NAND flash启动应用笔记_优快云
  9. zynq[1] 矿板helloworld
  10. zynq[2] Linux from scratch
  11. zynq[3] bootstrap Ubuntu
  12. EBAZ4205矿板petalinux开发 LINUX工程_优快云

————2020-11-17 @燕卫博————

ZYNQ入门,EBAZ4205开发平台从头开始搭建 EBAZ4205 ZYNQ7010开发板平台搭建。 阅读详情

相关推荐

【ZYNQ】EBAZ4205 ZYNQ 7010矿板改造开发板

前言 EBAZ4205是矿机的控制板,价格便宜;现在咸鱼上大约50左右就可以收到一块成色不错的。 EBAZ4205硬件资源丰富,其使用XILINX XC7Z010-1CLG400I 作为主控芯片,芯片的SOC包含两个硬核ARM A9,以及ARTIX-7逻辑。板子还有一颗128M x 16 bit DDR3 CLK800MHz,一块128M字节 NAND FLASH,PS端 33.333Mhz晶振;板子预留有一个JTAG调试接口,一个4Pin串口,一个网口,数量众多的PL端引出的引脚(PH2.0插座)…具体可

Markus_xu的博客 1万+

EBAZ4205矿卡控制卡

EBAZ4205矿卡控制卡 写在前面: ​ 前一段由于学习需要,在某鱼入手了一张EBAZ4205的控制卡,当时号称最便宜,最具性价比的ZYNQ开发板,对于穷学生一枚的我,果断入手,仅消耗30。然而在继续研究时发现,自己还是太天真了,板子是便宜,但是板子的下载器相当不便宜,某宝平均一张毛爷爷。犹豫再三,最终选择继续某鱼之旅,耗时半天以半张毛爷爷加包邮拿下,到手一看还是新的,经测试,功能完美,遂喜出望外。 1. EBAZ4205介绍 名称 说明 主控 XC7Z010CLG400

a18833260807的博客 6634

【ZYNQ】EBAZ4205矿板低成本改造实战:从硬件调试到Hello World

本文详细介绍了如何将EBAZ4205矿板低成本改造为功能完整的ZYNQ开发板。从硬件供电、调试接口改造到启动模式设置,再到使用Vivado搭建软件环境、创建首个点灯工程,并最终通过SDK实现Hello World程序下载与固化,提供了从硬件调试到软件开发的完整实战指南。

redis7keeper的博客 707

从零开始的ZYNQ学习(基于矿卡EBAZ4205)(一)

0. 声明 本文编写过程中参考了很多前辈的记录,在此表示感谢,已将所有参考项列于文末(文末指本系列博文最后一篇文末)。 当前版本R1.0(预发布)。 作者联系方式:E-mail: WindForest@yeah.net 1. 矿卡EBAZ4205介绍 比特币因着时间的推移渐渐淡出公众的视线,在浪潮中追逐过的人们也随之一哄而散,所剩下来的,也许就是曾经为“挖矿”努力工作过的矿机们,蒙着厚厚的灰尘在无人知晓的角落被人遗忘。本文所基于的硬件便是它们其中的一员。 EBAZ4205大概是在2018年(或之前)被淘汰

Turix附属空间[已停用] 3万+

【ZYNQ】EBAZ4205矿板低成本改造:从硬件调试到Hello World实战

本文详细介绍了如何将EBAZ4205矿板低成本改造为功能完整的ZYNQ开发板。从硬件供电、调试接口焊接、启动模式切换等关键改造步骤,到使用Vivado配置ZYNQ 7010芯片、编写PL逻辑、创建SDK工程并最终烧录运行Hello World程序,提供了从零开始的完整实战指南,帮助开发者以极低成本入门ARM+FPGA异构计算。

cc789的博客 1067

EBAZ4205矿板避坑指南:从NAND启动切换到JTAG模式的实战细节

本文详细解析了EBAZ4205矿板从NAND启动模式切换到JTAG模式的完整实战方案。针对基于ZYNQ 7010的这块热门开发板,文章深入剖析了ZYNQ启动流程,并提供了硬件电阻移位与软件FSBL配置两种核心方法,帮助开发者彻底解决启动障碍,实现高效的裸机调试与系统固化。

cc789的博客 837

从零开始的ZYNQ学习(基于矿卡EBAZ4205)(四)

前情提要: 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(一) 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二) 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(三) 文章目录0. 声明9. 让矿卡从NAND根文件系统启动9.1 制作NAND根文件系统(1)修改Petalinux工程配置(2)修改设备树(3)Petalinux工程编译9.2 下载镜像9.3 启动LOG和验证9.4 对分区的调整(可选)9.5 直连网络验证10. 操作PS_MIO的外设——按键10.1 GPIO的适配和Viv

Turix附属空间[已停用] 5667

告别拨码开关:在EBAZ4205矿卡上,用软件搞定ZYNQ启动模式切换与NAND固化

本文详细介绍了在EBAZ4205矿卡上实现ZYNQ启动模式软件切换的创新方法,解决了传统拨码开关缺失带来的开发难题。通过修改FSBL源码,开发者可在NAND固化配置下灵活切换至JTAG调试模式,显著提升开发效率。方案兼容Vivado开发环境,适用于ZYNQ7010平台的嵌入式开发。

weixin_33743661的博客 680

从零开始的ZYNQ学习(基于矿卡EBAZ4205)(三)

前情提要: 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(一) 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二) 文章目录0. 声明7. 让我们移植一个Ubuntu吧!(基于Debootstrap)7.1 宿主机环境配置7.2 使用Debootstrap生成最小Rootfs7.3 系统配置(1)Debootstrap第二阶段展开(2)创建登录用户(3)为apt工具换源(4)修改网络连接8. 让我们移植一个Ubuntu吧!(基于Ubuntu Base 20.04)8.1 宿主机环境配置8.2 系

Turix附属空间[已停用] 4000

EBAZ4205 ebit 矿板 PYNQ镜像制作详细步骤 zynq7010

此文章记录使用矿板搭建环境的步骤,和解决其中的问题 1、使用VMware搭建Ubuntu16.04版本的虚拟机,一定要注意虚拟机内存至少4G左右,否则后面会出现很多问题。 shell切换到bash sudo dpkg-reconfigure dash 选NO 2、根据网上教程安装petalinux2018.3 Vivado2018.3 。其中Vivado里面会包含SDK。这两个安装到哪个目录下都行,我一般安装到 /home/user/ 目录下。 有人喜欢安装到 /opt 目录下,安装到这个...

u013276653的博客 2205

EBAZ4205:Zynq EBAZ4205开发板的Vivado和PetaLinux项目

EBAZ4205 描述 该存储库包含使用Zynq EBAZ4205板所需的Vivado和PetaLinux项目。 要求 硬件 Zynq EBAZ4205板(降低成本的版本) 无需25MHz晶体(Y3)。 以太网收发器(U24)时钟由ZYNQ(U31)提供。 但是,它也可以在安装了晶体的板上工作 需要microSD卡插槽(U7) 需要SD卡引导支持。 短路电阻(R2577) 短路二极管(D24),以从电源连接器(J4)供电(可选) 安装触觉开关(S3),电容器(C2410)和电阻器(R2641A)。 可以将电阻器(R2641A)短路,而不是安装0欧姆电阻器。 我为电容器(C2410)使用了4.7uF(可选) 软件 赛灵思Vivado 2020.2 赛灵思PetaLinux 2020.2 如何建造 演示申请 参考 EBAZ4205 初次安装 原理图 Xilinx设计约束 mtd信息

zynq7010之EBAZ4205之helloworld

章鱼哥也想学zynq呀,zynq有arm a9双核的ps部分和和fpga的pl部分,突然发现zynq感觉是世界上最有技巧的一款芯片了,arm部分负责算法部分,pl部分可以用来增加外设,想想你的芯片支持好几个vga,hdmi,10几个串口,是不是很惊人。 为什么要有EBAZ4205呢,大家咸鱼一下50块,淘宝一下zynq 1000块。真香 废话不多说,我们这节课开始学习用arm部分的ps端通过串口输...

weixin_42741023的博客 1万+

基于zynq的buildroot制作根文件系统

本文基于xilinx的zynq 7z045芯片使用buildroot工具制作根文件系统,并添加网络工具:dropbear、vsftpd、tcpdump、iperf3等,移植mkfs.ext4工具,并添加交叉编译器lib库到根文件系统。

EBAZ4205 ZYNQ开发板——入门第一步

最近在某宝上看到一款很便宜的拆机板EBAZ4205,将其作为ZYNQ 7000系列开发板还是比较划算的。这块板子的FPGA芯片是ZYNQ 7Z010,其内部含有两块ARM A9硬核和一块Artix-7逻辑。板子上所包含的一些资源如下所示: 一颗主控芯片,型号:ZYNQ XC7Z010-1CLG400I 一颗DDR3芯片,内存容量128M x 16bit,型号:EM6GD16EWKG或者MT41...

leo_xu_的博客 1万+

基于zynqmp的根文件系统的建立(buildroot方式)

基于xilinx的zynqmp系列的芯片,搭建linux的根文件系统,使用buildroot方式进行编程,并移植mkfs.ext4工具、dropbear工具、vsftpd工具和tcpdump工具等。

MicroLogix1400编程(使用RSLogix 500 + RSLinx Classic Lite)

MicroLogix1400编程

noscallion的博客 1万+

EBAZ4205踩坑记录

这块ZYNQ-7000的二手板子很经典,最早在2019年被人发现。板子资源还是不错的,共引出了3*14个PL侧的IO,可用来研究PL、PS-PL交互,学习PS侧SDK,Linux开发。唯一的遗憾是Bank电压固定为3.3V,没法玩LVDS。

leida_wt的博客 3287

手把手拆解DGX GB200 NVL72:1个机柜如何塞进72块GPU?详解NVLink Switch铜缆背板设计

本文深度解析英伟达DGX GB200 NVL72系统如何通过NVLink Switch铜缆背板设计,在标准42U机柜中集成72块B200 GPU,实现1800GB/s的超高带宽。文章详细介绍了模块化架构、铜缆互连技术、液冷散热方案和高密度供电系统等核心创新,为AI算力需求提供突破性解决方案。

red88的博客 1570

玩转ebit EBAZ4205 zynq矿机控制卡

参考 基于Z7010的EBAZ4205矿板改造 zynq[1] 矿板helloworld 介绍 Column 1 Column 2 主控 XC7Z010CLG400-1 内存 256MB DDR3 EM6GD16EWKG/MT41K128M16 nand 128MB SLC Winbond W29N01HV 以太网 百兆网Phy芯片IP101GA 供电 12V,...

黑客三遍猪 8626

MACS2软件进行Peak calling

MACS2可以检出ChIP-Seq,ATAC-seq 以及 MeRIP-seq (RNA甲基化测序) 等富集的序列。peaks calling 有不同的方法,MACS2是最常用的call peaks工具。 MACS全称Model-based Analysis of ChIP-Seq,最初的设计是用来鉴定转录因子的结合位点,但是它也可以用于其他类型的富集方式测序。usage: macs2 [-h] [--version] {callpeak,bdgpeakcall,bdgbroadca

qq_27390023的博客 3789

SAP CO-PA数据传送避坑指南:销售开票与FI/MM记账的日常配置实操(含KEKF/KE4I/KEI2)

本文深入解析SAP CO-PA数据传送中的常见配置问题,特别是销售开票与FI/MM记账环节的实操避坑指南。通过KEKF/KE4I/KEI2等关键配置点的详细说明,帮助用户避免数据失真和重复记录,提升获利能力分析的准确性。文章结合实战案例,揭示官方文档未提及的'数据黑洞'形成机制,为SAP顾问提供实用的排雷手册。

weixin_26905487的博客 390

EBAZ4205 ZYNQ HDMI扩展板 显示Linux桌面&播放视频

之前的文章介绍了如何生成EBAZ4205矿板的u-boot和Linux内核,使用的硬件只有改完SD卡启动的EBAZ4205裸板,只能通过串口与板子通信。这次尝试启动桌面并播放视频(由于EBAZ4205没有引出USB,仍然通过串口控制),看看双核A9性能怎样。原板子是没有显示接口的,需要自己做一块HDMI扩展板。

helrori 1万+

【23】C++实战篇——C++报错:LNK2001:无法解析的外部符号 ,LNK2019: 无法解析的外部符号,原因分析及解决方法

该文分析了VS项目中出现的"无法解析的外部符号"LNK2001/LNK2019错误。问题表现为跨项目共享变量时,Projector项目无法解析Line项目中声明的外部变量ImgSavePath和ImgFormat。原因在于头文件声明了变量但未包含实现的源文件。解决方法是将getLine.cpp文件添加到Projector项目中。文章还总结了两种错误代码的区别:LNK2001通常对应变量缺失,LNK2019对应函数缺失。最后列出了具体的报错信息,包括无法解析的变量和函数符号。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2003
上一篇: 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(一)
下一篇: 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(三)
燕卫博
博客等级 码龄7年 312粉丝 49原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值