ZYNQ linux开发 章节四 设计zynq的linux启动镜像——QSPI Flash启动 ( Smart ZYNQ SP&SL 版)

本文将初尝试 跑一遍Petalinux 制作zynq的 linux启动镜像,以此来熟悉zynq的linux开发流程。

(备注 此章节内容适用于 Smart ZYNQ SP和SL 版的板子,如果是Smart ZYNQ 标准版请看对应板子目录)

我对linux的开发也只停留在十年前韦东山的阶段,很多东西也是 网上现学现卖的, 所以资料会尽量做的详细,这样下次自己忘记了 也可以回过头来再看看

本节因为只是为了熟悉开发流程,所以功能会做的尽量简单, linux部分 只保留uart命令提示行的功能,来查看系统是否正常启动了

以下是开发的完整图文过程:(程序都是在 2018.3版本下 进行的,其他版本请自行测试)

Vivado 部分的工程创建(Vivado 创建过程和之前uart 工程的一致,可以选择性对的跳看)

1)打开Vivado 新建一个项目, 新建一个VIVADO 工程,打开软件 选中Create Project, 如下图所示

2)点击NEXT ,在出现的第二个对话框“Project name”中输入工程名;在“Project location”中选择保存路径;勾选“Create project subdirectory”(默认),最后点击“Next” 备注,所有的路径均不能出现中文名称

3)点击 RTL PROJECT 选项,点击NEXT

4) 第四步Add Sources 选项直接留空,NEXT

5)第五步Add Constraints 选项直接留空,NEXT

6)选择芯片型号 XC7Z020CLG484-1

7)确认所选信息 点击“Finish”,完成vivado的工程创建

之后 工程就新建好了, vivado 进入到开发界面

Block Design 部分创建

此处需要创建一个ZYNQ CORE ,并在ZYNQ CORE中设置DDR 以及UART等参数

UART此处用 EMIO方式连接

1)创建一个BLOCK设计

2)搜索并添加ZYNQ7 Processing System,添加ZYNQ7 PROCESSING SYSTEM模块

3)软件自动生成了一个 zynq的block 如下图所示,接下来要做一些相应的设置,双击下图中的ZYNQ核

4)在zynq中设置DDR功能:

依次在弹窗里找到DDR Configuration→DDR Controller Configuration→DDR3,在Memory Part下拉菜单中根据自己板子上的DDR来选择相应的DDR3,本实验所用到型号:MT41K256M16RE-125,数据位宽选择16bit 最后点击“OK”,如下图所示。

5) 添加 uart功能

由下图可知, 主板的UART功能接在 ZYNQ PL端的 L17脚和M17脚了,即 ZYNQ的TX是 连接L17,ZYNQ的RX是连接M17 (备注 V1.0板子上的丝印 TX 和 RX标反了,以原理图为准)

使能UART 0 并在IO选项里选择EMIO方式

6). 在block design 的设置界面 使能QSPI的功能 如下图所示(当QSPI 时钟大于40MHZ的时候 就需要勾选Feedback clk)

7)随后点OK 保存修改, 点击“Run Block Automation”如下图所示。在弹出的选项中保持默认,点击“OK”,即可完成对ZYNQ7 Processing System的配置

8)用鼠标连接FCLK_CLK和 M_AXI_GP0_ACLK,得到下图

9) 引出UART 信号,因为我们增加了EMIO 的UART,所以这里需要将UART的引脚引出 ,右键选择ZYNQ模块的UART_0,然后选择Make External

10)source→Design Source ,右键我们创建的BLOCK工程,点击create HDL wrapper,打包BLOCK文件并生成.v代码

在弹出的菜单里直接点选OK

11) 点击绿色箭头RUN 对代码进行编译

12) 增加UART管脚定义

点击RTL 中的SCHEMATIC , 并选择右边出现的 IO Ports 来增加UART 0 EMIO部分的管脚定义(这一步也可以在约束文件中定义, 可看之前的例子) (备注 V1.0板子上的丝印 TX 和 RX 丝印标识标反了,以原理图为准)

将 UART 部分的 TX RX 分别设置成 L17,M17 电压属性设置成 LVCMOS33, 之后保存

13) 生成bit文件 :按下Generate Bitstream 完成综合以及生成bit文件,等待弹出综合完成的窗口

14)File→Export→Export hardware…在弹出的对话框中勾选“include bitstream”,点击“OK”确认,如下图所示。

15)File→Lauch SDK,在弹出的对话框中,保存默认,点击“OK”,如下图所示。

系统将自动打开SDK开发环境

其中SDK工程下的 下图hdf文件就是我们需要的系统硬件描述文件,这个需要交给petalinux 进行交叉编译用。

PetaLinux 工程创建

1)打开虚拟机下的 Ubuntu系统,打开命令行

输入 source /opt/pkg/petalinux/2018.3/settings.sh 对Petalinux 的环境进行加载

source /opt/pkg/petalinux/2018.3/settings.sh

2)在Ubuntu下创建工程目录(两种方式 a 命令行,或者 b 图形界面 可二选一)

a 用mkdir 命令创建一个文件夹(普通用户 非root用户)

mkdir Petalinux

b 其实这个文件夹就被创建在 普通用户(这里是user)的home文件夹下 ,图形界面打开home可以直接找到(这里也可以在Home 文件夹图形界面下直接右键新建一个Petalinux 效果一样)

3) 创建Petalinux 工程

在工程文件夹的空白处 右键,然后点选Open in Terminal 打开终端命令行(这种方式打开命令行会自动定位到当前文件夹),当然也可以普通方式打开终端 ,再用CD的方式定位到此文件夹

(备注 如果用此方法,必须重新在这个新打开的命令行中对petalinux 开发环境进行预加载,否则后面会失败,每次打开新的命令行都需要执行这个命令)

source /opt/pkg/petalinux/2018.3/settings.sh

在命令行输入

petalinux-create --type project --template zynq --name Petalinux_qspi_flash

按下回车后 名为Petalinux_qspi_flash的工程会被创建,并且刚才的文件夹下多了一个对应的工程文件夹

为了方便以后的工程管理,我们将刚才生成的system.hdf 也拖到Petalinux_qspi_flash文件夹中

4) 复制hdf文件到刚才创建的工程文件夹中

在图形界面下双击打开这个Petalinux 文件夹

打开刚才SDK的软件界面, 右键hdf文件,选择copy 复制

然后在图形界面打开 Ubuntu 的Petalinux 文件夹下的Petalinux_qspi_flash文件夹内, 右键空白处 点选Paste (粘贴)

5)设置路径并启动Petalinux 配置页

在刚才的界面下先CD进入 工程文件夹(Petalinux_qspi_flash) 备注(CD 的时候 可以输入文件夹的第一个字母然后按tab键,这样相同名称的文件夹就会跳出来)

cd Petalinux_qspi_flash

进入文件夹后,按下下列代码, 指定导入hdf的路径(因为是当前命令行的路径所以这里 带一个”.”就可以了,不然=号后跟具体路径) 并按下回车

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

之后系统将启动配置页

6) 对Petalinux 进行配置

a) 修改启动项

用键盘上的上下左右键移动光标,选择Subsystem AUTO Hardware Settings 按下回车(按两下ESC可以退回上一层)

选择Advanced bootable images storage Settings ,按下回车

选择 boot image settings选项 回车

选择 image storage media 回车

选择 primary flash并按回车

之后连按两次ESC 可以返回上一级, 一直返回,直到回到最初的初始界面

然后用同样的方式 将 Subsystem AUTO Hardware Settings–>Advanced bootable images storage Settings–> kernel image settings –>image storage media 也修改成 primary flash 并回车

b )分配flash 的空间大小

选择Subsystem AUTO Hardware Settings 按下回车

选择Flash Settings 设置分配flash 的空间大小

里面可以设置boot 的大小 kernal的大小以及env的大小,一般默认即可(当设置的flash大小超过了硬件flash 的大小,这个时候就需要进行大小的调整了)

之后用双击ESC的方式回到初始菜单

c) root 文件系统 类型选择

选择Image Packaging Configuration

选择 Root filesystem type

选择 INITRAMFS

之后按多次ESC回到根菜单

e)保存设置 选择save 并点选ok 对设置进行保存

f )退出 设置界面

主菜单选择EXIT 退出

之后 系统进行配置 ,此时等待配置结束

g ) 编译整个工程

petalinux-build

之后系统就开始编译了 ,需要等很久 视机器性能而定

直接到出现提示 successfully built project 代表编译完成了

h) 打包boot.bin

编译完成后,项目工程文件夹下会有image文件夹,执行petalinux -package 命令 将zynq_fsbl.elf, system_wrapper.bit,u-boot.elf,image.ub 四个文件打包生成
BOOT.bin 文件

petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --u-boot --fpga --kernel --force

如下图所示,代表打包完成(有警告,直接忽略)

QSPI FLASH 程序固化

在Ubuntu 系统内 打开 工程文件夹内 编译生成的image文件夹

再打开linux 文件夹

复制这4个文件 BOOT.bin、u-boot.elf、 zynq_fsbl.elf、 image.ub

然后回到windows 下,粘贴到我们之前创建的Vivado 工程的images(临时创建)文件夹中

回到SDK界面 点选Program Flash

Image File 选择工程工程目录下的 BOOT.bin, FSBL File 选择工程目录下 的zynq_fsbl.elf Flash Type 选择qspi-x4-single 然后将板子拨码开关调整到JTAG模式,并重新上电,之后再点击PROGRAM 开始下载(必须在JTAG模式下,拨码开关调整到JTAG 模式 并且重启板子或按下POR RST按键重启)

再点击Program 选项

之后系统开始烧录固件到FLASH里

等待进度条消失,并且提示Successful的时候代表固化成功了

上电测试

将跳线位置换回到QSPI上

备注 实际测试过程中会发现 虚拟机 和windows 争抢串口的资源的情况,导致windows 下 无法访问串口,所以这里测试的时候(把串口默认设置连接到windows ) 或者临时挂起虚拟机

设置成Qspi 启动后重新上电后,打开串口助手,波特率设置成115200 ,之后我们就能看到linux 发出来的命令行了(这里也可以用 SDK 自带的Terminal 功能,如下图打开,串口号根据实际的选择,备注:部分JTAG下载器带串口功能,选择串口根据实际用的哪路串口去选择

系统此时停留在等待输入账号密码的状态, 此时输入用户名 root 输入密码 root (不同的串口助手有些需要带回车)

之后就正式登录 petalinux 了

之后就可以进行linux 的操作了 ,以上就是完整的zynq linux 开发简易流程

另外备注 一般linux 的命令行远程调试习惯上用 putty这样的专业工具替代串口助手(这样诸如CTRL+C这样的指令就可以用键盘的形式直接发送了,putty官网可以免费下载到)

打开后配置界面如下 模式选择serial ,并设置好串口号(查看设备管理器得到) 和波特率115200就行

(因为我linux 也不是特别熟,所以暂时写到这里,大家其他功能自行研究 ),等我慢慢摸透了 再更新更多内容

以下是 VIVADO 的工程 (里面的image文件夹 里面是 Ubuntu 下编译的镜像文件可以直接固化到FLASH查看结果,用户名 root 输入密码 root )

“ZYNQ linux开发 章节四 设计zynq的linux启动镜像——QSPI Flash启动 ( Smart ZYNQ SP&SL 版)”的2个回复

  1. Hello! I’m using version 2023.1. According to your description, I got a file BOOT.BIN with a size of 28030484 bytes. How can it be written to a 16 megabytes SPI flash? The bif-file contains the following:
    the_ROM_image:
    {
    [bootloader] /home/dimonira/petalinux/petalinux_qspi/images/linux/zynq_fsbl.elf
    /home/dimonira/petalinux/petalinux_qspi/project-spec/hw-description/ZYNQ_CORE_wrapper.bit
    /home/dimonira/petalinux/petalinux_qspi/images/linux/u-boot.elf
    [load=0x00100000] /home/dimonira/petalinux/petalinux_qspi/images/linux/system.dtb
    [offset=0x9C0000, partition_owner=uboot] /home/dimonira/petalinux/petalinux_qspi/images/linux/boot.scr
    [offset=0x9C1000, partition_owner=uboot] /home/dimonira/petalinux/petalinux_qspi/images/linux/image.ub
    }
    I had to add the offset 0x9C1000 to the command:
    petalinux-package –boot –fsbl ./images/linux/zynq_fsbl.elf –u-boot –fpga –kernel –offset 0x9C1000 –force
    otherwise, the last part image.ub overlapped with the previous one.

    1. FLASH is only used to store simple programs. If the program is more complex, you can create an SD boot image for it and copy the program to a FAT32 formatted TFT card.
      (FLASH 仅用于存放简单的程序,如果程序比较复杂,你可以把程序做成SD启动镜像,并将程序拷贝到FAT32格式的TFT卡中)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注