本文将初尝试 跑一遍Petalinux 制作zynq的 linux启动镜像,以此来熟悉zynq的linux开发流程。
PS本文仅适用于 TinyFPGA板, 如是EBAZ4205的用户,请看4205的章节四(暂在制作笔记中,未发布)
我对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)选择芯片型号 我们板子上用的芯片是XC7Z010 ,并在列表栏中选择对应的封装型号,完整型号是XC7Z010CLG400-1 如下所示,选中后点NEXT
7)确认所选信息 点击“Finish”,完成vivado的工程创建
之后 工程就新建好了, vivado 进入到开发界面
Block Design 部分创建
此处需要创建一个ZYNQ CORE ,并在ZYNQ CORE中设置DDR 以及UART等参数
UART此处用 EMIO方式连接(Tiny FPGA 以及 EBAZ4205转接板都用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,本实验所用到型号:MT41K128M16JT 125,数据位宽选择16bit 最后点击“OK”,如下图所示。
5) 添加 uart功能,因为板子的UART功能是连接在PL端的,所以这里选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_0选择Make External
7)source→Design Source ,右键我们创建的BLOCK工程,点击create HDL wrapper,打包BLOCK文件并生成.v代码
8) 点击绿色箭头RUN 对代码进行编译
9) 完成后点击RTL 中的SCHEMATIC , 并选择右边出现的 IO Ports 来增加UART 0 EMIO部分的管脚定义(这一步也可以在约束文件中定义, 可看之前的例子)
将 UART 部分的 TX RX 分别设置成 U13,T12 电压属性设置成 LVCMOS33, 之后保存
10) 生成bit文件 :按下Generate Bitstream 完成综合以及生成bit文件,等待弹出综合完成的窗口
11)File→Export→Export hardware…在弹出的对话框中勾选“include bitstream”,点击“OK”确认,如下图所示。
12)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键,这样相同名称的文件夹就会跳出来)
进入文件夹后,按下下列代码, 指定导入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回到根菜单
d)设置加载位置,因为板子上的DDR是256MB 的,而默认的加载位置已经超过256M的边界了,所以这里需要调整加载位置
选择u-boot Configuration
选择 netboot offset 选项 按回车
修改为 0x08000000 按OK 确认 (0x08000000可以修改为其他值,它影响uboot中kernel的加载位置,以不会超区同时不会覆盖其他文件数据为准)
之后按多次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 工程中
回到SDK界面 点选Program Flash
Image File 选择工程工程目录下的 BOOT.bin, FSBL File 选择工程目录下 的zynq_fsbl.elf Flash Type 选择qspi-x4-single 然后将板子拨码开关调整到JTAG模式,并重新上电,之后再点击PROGRAM 开始下载(必须在JTAG模式下,拨码开关调整到JTAG 模式 并且重启板子)
再点击Program 选项
之后系统开始烧录固件到FLASH里
等待进度条消失,并且提示Successful的时候代表固化成功了
上电测试
将跳线位置换回到QSPI上
备注 实际测试过程中会发现 虚拟机 和windows 争抢串口的资源的情况,导致windows 下 无法访问串口,所以这里测试的时候(把串口默认设置连接到windows ) 或者临时挂起虚拟机
设置成Qspi 启动后重新上电后,打开串口助手,波特率设置成115200 ,之后我们就能看到linux 发出来的命令行了(这里也可以用 SDK 自带的Terminal 功能,如下图打开,串口号根据实际的选择,备注:部分JTAG下载器带串口功能,选择串口根据实际用的哪路串口去选择
系统此时停留在等待输入账号密码的状态, 此时输入用户名 root 输入密码 root (不同的串口助手有些需要带回车)
之后就正式登录 petalinux 了
之后就可以进行linux 的操作了 ,以上就是完整的zynq linux 开发简易流程
(因为我linux 也不是特别熟,所以暂时写到这里,大家其他功能自行研究 ),等我慢慢摸透了 再更新更多内容
以下是 VIVADO 的工程 (里面的image文件夹 里面是 Ubuntu 下编译的镜像文件)