写在前面
做类嵌入式开发很久了,从51到STM32,Arduino,ESP8266,ESP32,树莓派,ZYNQ,做了很多小项目,虽然根本没有牛到有资格写博客,但也是记录下自己的工作给以后做一个备忘吧。
本文记录的是一个以太网转同步串口的活,导师给了一块7z030的板子,让在这上面做,这块板子的以太网居然是航空接插件接口,而且供电也得找电源,太麻烦了我还是用手里的7z010的黑金开发板吧,PS部分都一样完成之后再移植就是了。
文章中有大量部分参考了黑金的教程,本来不打算写重复的部分,但考虑到也许会有比我基础更差的同学需要学习,就把自己的工程建立流程分享出来。
Vivado工程建立
这里选择与黑金相同的版本2017.4,需要有配套的Ubuntu,petalinux以及linux-xilinx版本。
选择自己的芯片,这里本来贴了很多建立工程的详细过程,图太多了就删掉了。
建立一个block design
添加IP核ZYNQ7 PS。
双击IP核进行配置,先在PS-PL Configuration里面取消m axi GP0,图片里的标注有问题,应该默认勾选的是m。
之后进行IO的配置,从FLASH里启动Linux以及挂载jffs2文件系统,所以spi flash需要勾选,以太网透传,以太网0也需要勾选,注意选上下面的MDIO。还需要选上UART1作为系统控制台。所有的IO要根据自己的硬件来选择。
在下面还有以太网的复位管脚,这里要根据原理图,连上了的话就需要勾选。
在MIO Configuration里调整以太网的IO速度为fast。
选择相近的DDR型号。
确认调整后点击run block automation引出IO,我这里截的图没有取消勾选m axi gp0,如果取消了的话没有左边这部分。
切换到sources选项卡,右键选择create hdl wrapper。
生成bit文件。
将硬件信息导出。
如果大家有PL部分需要勾选包含bit文件。
petalinux工程建立
把刚才建立工程目录下的sdk文件夹复制到Linux主机。
首先配置环境,这里应该要根据大家的安装位置来,Linux真的不熟。
source /opt/pkg/petalinux/settings.sh
source /opt/Xilinx/Vivado/2017.4/settings64.sh
使用petalinux建立新的工程
petalinux-create --type project --template zynq --name 7z010_jffs2
进入工程目录。
cd 7z010_jffs2/
根据硬件信息建立工程,这里路径要正确,sdk文件夹在工程的上层目录中。
petalinux-config --get-hw-description ../7z010_jffs2.sdk/
之后会弹出config界面,这个界面可以通过petalinux-config命令重复进入。因为学校环境没有网络,需要更改Linux Components Selection为本地内核文件,如果使用的是有外网环境的Linux主机,这里可以使用默认配置从git上面下载Linux内核。
需要调整flash配置,我们需要预留一部分flash空间作为系统“硬盘”。在Sbusystem AUTO Hardware Settings -> Flash Settings。具体的size大家可以自己测试一下,这里的数字应该是扇区大小,spi flash在大学时研究过现在记不清也懒得看了,size过大会在erase为jffs2文件系统时破坏掉系统。这里的大小是测试出来的,能用就没研究了。这里我们并不需要将文件系统修改为jffs2,这个设置不知道对应的教程在哪里,直接配置成jffs2系统后我无法开机进入Linux系统了,不知道该如何解决,官方应该有教程吧,又找到的同学可以提供一下。
配置Linux内核,如果不需要加入额外驱动这里就不需要修改,直接保存退出就OK。
petalinux-config -c kernel
拷贝黑金提供的startup文件夹到工程目录下。
修改project-spec/meta-user/recipes-core/images/petalinux-image.bbappend文件,在最后加入一行
IMAGE_INSTALL_append = " startup"
我们需要修改一下7z010_jffs2/project-spec/meta-user/recipes-apps/startup/files下的startup.sh文件,这个文件就是开机后会执行的命令。黑金提供的内容是开机后自动挂载SD卡的第一分区到/sd文件夹下。这里我们修改为开机后挂载flash的mtd4,这个mtd4就是上面配置flash的第四分区jffs2。判断里面的-f路径写错了,就当没看见吧,这句不关键。。
回到petalinux工程的命令行,配置根文件系统。
petalinux-config -c rootfs
在apps中选择startup,按下‘y’键。保存退出。
编译工程
petalinux-build
这里需要的时间比较久了。
生成BOOT文件,因为只有flash启动,所以一切包括内核都要打包到BOOT中,因为我这里还没有PL部分,所以命令没有–fpga,PL部分有工程的同学记得加上–fpga
petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --u-boot --kernel --force
至此就完成了工程的建立。
下载程序,开机测试
我使用Vivado进行boot文件的烧写,打开硬件管理器,自动连接。
在PL部分右键选择add configuration memory device,选择你用的flash型号。
添加生成的boot.bin文件,在工程目录的7z010_jffs2/images/linux/下,添加FSBL elf文件,说实话这个文件的作用不太清楚是什么,猜测是根据flash的分区写入boot文件?那么是否修改了flash的前几个分区后需要使用不同的elf文件呢?没有测试过。
完成后上电进入系统,插上串口线查看控制台信息,由于我是边尝试边记录,不能保证这一套操作之后可以实现描述的功能。我这里目前已经成功了,挂载mtdblock4之后在/home/root/flash下vi一个文件,reboot或者断电再开机后这个分区都能正确挂载,并且vi的文件内容正常。
没成功的话看这里
写的第一个版本把flash_eraseall语句也放到startup.sh里面了,开机时控制台输出擦除信息立刻就反应过来,每次开机都擦除那我的文件不是都没了。。修改后直接挂载就可以正确挂载成功了,但是我认为没有进行eraseall的分区是不能正确作为jffs2文件系统挂载的(猜测,懒得试了。。)。所以没有挂载成功的同学可以在开机进入petalinux后输入
cat /proc/mtd
先看一下flash的分区是否和自己在petalinux-config里面配置的一样,一样的话可以直接把mtd4格式化为jffs2。
flash_eraseall -j /dev/mtd4
大家可以输入
flash_eraseall --help
查看一下信息,上面的-j就是format the device for jffs2,这也是为什么我猜测必须先eraseall一下,毕竟Windows也需要先按文件系统格式化不是?
已经存在jffs2系统的flash在重新分区为其他大小时,可以在下载boot.bin文件是选择全盘。
贴两个需要的文件,elf和startup
https://download.csdn.net/download/fadepurple/11196759
https://download.csdn.net/download/fadepurple/11196765