CH02基于ZYNQ的嵌入式LINUX移植
1.1概述
实验环境:
- Windows 10 专业版
- Vmware workstation 14.1.1
- Ubuntu 16.04.3
- Xilinx SDx 2017.4
实验内容:
很多人问我怎么不用petalinux,说实话小编不会,记得之前有几个LINUX大神说petalinux四不像,不建议准备深入LINUX的学习者学习,所以小编就老老实实学习通用的LINUX方法。毕竟以后说不定就要搞其他不是XILINX的嵌入式平台了。
对于学习LINUX掌握移植的方法是非常重要的事情,本章的教程可以教会大家如何在ZYNQ的平台上移植LINUX系统,基本上目前市场主流的开发板都可以使用本章的方法,所以只要你有一个ZYNQ开发板就可以和我们一起来学习如何移植LINUX系统,本教材适合LINUX零基础入门,赶快加入我们吧(小编同样是一名初学者,以初学者的角度写这篇教程)。
2.1 开发环境的熟悉
2.1.1 解压开发包
由于是第一个example,压缩包包含的内容比较多,首先解压你下载的本章节开发板,然后复制到虚拟机workspace目录解压,解压后的目录。
2.1.2 目录介绍
本节主要介绍工程的相关目录,对于一个Linux开发者,至少要掌握bash编程,而本实验使用shell来工作的,所有的shell都存放在scripts目录下,如果对哪个脚本有疑问,请自行阅读脚本内容,如果需要觉得哪个脚本还不能满足你的需求或者发现在你的系统中运行有问题,可以自行修改脚本。请注意,每天工作前请切换到scripts目录下执行source settings64.sh脚本,以初始化实验所需要的环境变量,这样,你将可以在任意目录下执行scripts目录下的脚本。
$ ls
backup boards documents packages scripts sources tools
- 在boards/miz7x目录下存放的是基于mz7x(mz7x包括 MIZ702NMZ701AMZ701AminiMZ702BMZ702NMIZ7035MZ7100以及后面发布的板子,或者你自己的开发板,我们为每个板子配套的具体的代码)实验板子的相关实验,为什么要这么做呢,主要是因为uboot、内核、文件系统等这些源码是通用的,而对于不同的厂家板子,不同的实验,所需要的FPGA、内核模块、应用程序等是不一样的,为了统一管理不同厂家板子的不同实验,我们通过目录来区分他们。另外,我在scripts目录里提供了backup.sh脚本用于打包实验的所有源码,该脚本执行后把打包后的文件放在backup目录下。这样,我们是以实验为单位来备份,这样只要你获得一个实验的源码包,解包后即可进行实验,不再为缺失哪些源码而烦恼。
- Documents目录主要是用于存放一些公共的文件,比如Zynq-7000的相关文档,该目录不会被backup.sh脚本所打包,如果需要将其也添加到打包文件里的话,请修改backup.sh脚本。
- Packages目录主要是存放从网络下载的原始资源,而backup.sh仅仅会将buildroot目录添加到打包文件,该目录是编译根文件系统时,buildroot从网络下载的源代码。
- Sources目录主要是存放uboot、kernel、rootfs等源码。
- Tools目录主要存放交叉编译器等,但backup.sh打包时仅打包交叉编译器。
- 注意:如果你喜欢使用老版本的脚本进行工作,可以把所需要的源码放到老版本的相应位置即可,新脚本在不断优化着,如果对脚本不理解,请认真查看脚本内容。
2.2 创建用于移植LINUX的VIVADO工程
2.2.1 VIVAO硬件工程功能介绍
本项目硬件上需要实现支持 usb otg、uart串口、支持网络、EMMC(注意有的板子没有EMMC)、(TF卡)SD卡、HDMI输出,所以我们要设计这么一个VIVADO工程。
2.2.2 VIVAO硬件工程搭建
找到路径/mnt/workspace/osrc/boards/mz7x/mylinux/fpga/system/system.xpr,你会发现你熟悉的vivado工程,没错,在一堆眼花缭乱的文件夹中,我们找到了。读者可能会很奇怪,干嘛搞这么复杂,又是批处理命令,又是这么多文件夹。小编也问过,LINUX大神,大神告诉我,为了管理项目方便,而且利用批处理命令,都是自动化管理的,实际上更加规范。虽然小编刚开始有一百个不情愿,还是老老实实得学习大神的经验吧。不过小编要告诉读者,虽然利用了批处理命令方便了,但是作为学习者,一定要花费一些时间,把所有批处理命令看一遍,最好能自己写一遍。打好基础才能为自己以后在LINUX方面的深耕做好知识准备。小编现在大概介绍下,各个文件夹的功能。
Dts管理dts文件
FPGA管理VIVADO工程
Images管理最终编译好的系统文件,读者可以自己打开看下,里面有很多类型
Outpu 管理中间编译过程的文件
Standalone管理SDK工程方便以后需要用到的时候可以直接导入
创建以上的文件夹如果人工一个个手动操作,累都要累死,还不能确保不出错,所以这些就交给批处理命令来吧。
Ctrl +ALT 打开linux控制台
输入
cd /mnt/workspace/osrc/scripts
ls
可以看到一堆批处理命令,简直无从下手。不用担心,小编以一个初学者的方式,来实现我们第一个LINUX的实验。
先打开settings64.sh
输入 gedit settings64.sh
打开settings64.sh文件后
下图中红色方框内的就是定义板子的名字,你可以根据需要改为自己的名字,不管你买的什么型号的开发板,本教程中,全部以mz7x命名。本项目是一个Linux工程所以定义为mylinux。当然你如果是学习,建议保持我们一致,毕竟你还是一个初学者嘛,还没学会走路,不要先想着会跑。图片中还有一些获取路径的信息,读者需要弄明白。settings64.sh具有非常多的路径信息读者需要详细阅读的,打开阅读,小编这里只是拿出一些重点截图说明下,方便大家入门。
下图中,就是管理mz7x文件夹里面的,文件夹的路径了。
自动化创建所有的文件夹
设置交叉编译工具
由于vivado自带了交叉编译工具,所以就不要单独安装了,很早以前,大概2015年刚开始弄zynq的时候,参考zedboard得单独安装交叉编译工具。现在方便了,一步到位。
关闭settings64.sh文件
2.2.2 安装下载器驱动
和windows里面一样安装下载器驱动的时候要拔掉下载器。
在刚才打开的控制台里面输入
./ install_cable_drivers.sh
2.2.3 打开VIVADO软件
当然如果你准备全部自己实现一遍,建议吧boards文件夹里面的mz7x换个名字,这样执行批处理命令的时候会重头创建一遍文件夹,否则会默认不创建已经存在的文件夹。在学习本章课程的时候,小编认为你应该具备了,使用vivado软件的能力,所以vivado如何创建工程,如何设置,的问题小编就不说了。
在前天打开的控制台中输入
Source settings64.sh
如何你的文件夹都是空的就会创建以上的所有路径和文件夹。
小编用的是项目例子自带的已经创建好的。所以vivado工程就不重头搭建了。
继续在控制台输入
./run_vivado.sh
Vivado启动大概需要20s以上耐心等下,启动后就可以和windows下一样使用了。打开已经做好的工程。下面的界面大家一定很熟悉了。
2.2.3硬件构架设计
可以看到这是一个基于ZYNQ平台的构架,显示输出主要使用了VMDA IP 和 HDMI的输出IP。
为了让能够支持USB OTG、UART串口、以太网、EMMC、TF卡、QSPI FLASH,还要正确配置ZYNQ IP的设置。
注意:MZ7100开发板的配置页面有比较大的差异,读者做MZ7100的实验的时候不要把本截图设置成一样,否则你就不能成功移植LINUX了。
2.2.4 SDK工程
编译好VIVADO后倒入到SDK工程,以下图片是已经做好的SDK工程,可以看到有3类
- System_wrapper_hw_platform_0
是从VIVADO导入进来的硬件工程,里面包含了,SDK所需要的硬件信息。
- IMAGE工程 是裸机下测试HDMI输出到显示器是否正常的工程,我们测试看下输出结果,证明VDMA输出到HDMI部分的硬件搭建设计正确,展示图片是MZ7X系列的最新款MZ702N开发板。
- Fsbl 是启动文件里面文件,这个文件不用多介绍了,ZYNQ芯片必不可少的文件。
- Device_tree_bsp_0是导入的设备树,这个LINUX驱动部分要用到,这里的VMDA是需要驱动的。下面下如何导入并且产生PL部分的设备树。
1)、在菜单中选择Xilinx->Repositories
2)、导入设备树的源文件路径就可以了,如下图
2.3编译LINUX
硬件搭建好后,就可以编译了,在刚才的控制台中输入
make_all.sh就可以了
2.4测试
2.4.1复制嵌入式系统到TF卡
之后把TF卡通过读卡器插入电脑,并且连接到虚拟机中
执行
deploy_sdcard_image.sh
这样就把编译好的文件复制到了TF卡了,现在只要把TF卡插入开发板。
通电之前做几件事情
2.4.2查看串口设备
串口接到电脑,并且在控制台输入ls/dev查看串口设备,一般是ttySUB0,我这里是ttyUSB1,入下图。
开发板模式开关切换到SD模式(所有绿色板子,模式开关1脚切换到OFF 2脚无所谓)
在虚拟机打开putty软件,串口号设置以上你查到的串口号
2.4.3通电启动系统
2.4.4 查看设备
输入
root
/ls /dev
查看设备
2.4.5 EMMC测试 (必须有EMMC)
EMMC分区
给eMMC分区
当然,如果只分为一个分区的话,其它也可以不分区。在命令行下运行fdisk /dev/mmcblk1来对emmc进行分区。这里需要注意,确认有没有SD卡插入,也就是说确认当前eMMC是/dev/mmcblk1还是/dev/mmcblk0,还有对于有多个分区的,可能存在/dev/mmcblk0p1、/dev/mmcblk0p2等等。
fdisk /dev/mmcblk1mnp1回车
m
w将分区格式化为ext2格式
mkfs.ext2 /dev/mmcblk1p1
ls /mntmount /dev/mmcblk1p1 /mnt
测试emmc的性能
在Linux下,既可以使用dd命令来低格U盘等,也可以用来复制文件(类似于windows下的ghost功能),当然也可以用来测试硬盘等的性能,虽然没有专业软件的测试得准确,但用来对比性能已经足够了。对于/dev/zero和/dev/null两个设备的说明,可以google一下(需要说明下,估计是系统问题,测试的速度没有显示出来,但是文件读写是正常的,后面解决了再告诉大家)。
写性能下面使用dd命令将从/dev/zero设备中产生一个1GB的文件。写性能
dd if=/dev/zero of=/mnt/test.img bs=1M count=1024
读性能
dd if=/mnt/test.img of=/dev/null bs=1M count=1024
读写性能
dd if=/mnt/test.img of=/mnt/test.copy.img2.4.6 以太网测试
输入ifconfig eth0 192.168.1.199 设置开发板的 IP
设置电脑的网口IP是 192.168.1.100 并且设置
2.4.7 HDMI测试