ZYNQ7000搭建嵌入式Linux操作系统---基础篇

ZYNQ7000搭建Linux操作系统

  • ZYNQ7000搭建嵌入式Linux操作系统
    • 一、VIVADO工程的建立
    • 二、VIVADO工程设置
    • 三、在虚拟机环境下生成内核镜像uImage和uboot.elf
      • 在Linux下安装SDK
      • 安装依赖包
      • 编译内核
      • 编译uboot
    • 四、使用SDK生成BOOT.bin、设备树
    • 五、设备树的生成
    • 六、linaro文件系统
      • SD卡分区
    • 七、系统启动

ZYNQ7000搭建嵌入式Linux操作系统

分享下自己在搭建嵌入式操作系统的过程与心得。
使用平台:ALINX ZYNQ 7010(任意一款ZYNQ7000的板子都可以)
软件版本:VIVADO 2019.1 & SDK 2019.1
内核版本:linux-xlnx v2019.1
uboot版本:uboot-xlnx v2019.1
设备树工具:device-tree-xlnx v2019.1
linaro文件系统:linaro-vivid-gnome-20151215-714.tar.gz
之所以用2019.1,是因为后面的SDK被集成到vitis里了,不会用hhh。

一、VIVADO工程的建立

1.打开vivado,显示下面界面
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第1张图片
点击create project;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第2张图片
点击next;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第3张图片
选择你要保存工程的路径和工程名,点击next;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第4张图片
点击next;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第5张图片
点击next;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第6张图片
在add constraints这个界面,单击create file;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第7张图片
在file name对约束文件进行命名,单击ok后窗口关闭,单击next;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第8张图片
在search里面输入你的zynq的型号,alinx的是xc7z010clg400-1,单击选择,再单击next;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第9张图片
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第10张图片
单击finish,就完成了工程的建立。

二、VIVADO工程设置

执行完上一步骤后,进入下面的界面;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第11张图片
界面内容不介绍了,想学习vivado的朋友可以找找相关的资料。
单击左侧 PROJECT MANAGER里的IP INTEGATOR的create block design;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第12张图片
使用默认选项,单击ok;
稍等片刻,vivado界面显示了BLOCK DESIGN;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第13张图片
单击右侧Diagram窗口中的加号,两个加号都可以;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第14张图片
在窗口中输入zynq,显示如下;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第15张图片
双击中间的ZYNQ7 Processing System,稍等片刻,Diagram窗口中出现了zynq的ip核;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第16张图片
双击该ip核,进行配置;(p.s.:如果觉得配置zynq核很麻烦的话…可以直接点presets,在弹出的菜单中选择apply configuration,然后选择我分享的配置,zc010-simple.tcl这个文件)
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第17张图片
选择左边page navigator中的MIO Configuration,并按照下图进行配置;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第18张图片

这里要注意下MDIO,默认是EMIO,要选择MIO52-53
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第19张图片
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第20张图片
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第21张图片
然后要对DDR进行配置,更改DDR Configuration中的DDR controller configuration中的Memory part 为 MT41J128M16 HA-125;(这里是ALINX上带的DDR的型号)
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第22张图片
再选择PS-PL Configuration 取消选中AXI NON Secure enablement中的GP master AXI interface中的M axi gp0 interface;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第23张图片
再选择PS-PL Configuration 取消选中general中的enable clock resets中的FCLK_RESET0_N;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第24张图片
再选择Clock Configuration,取消选中PL Fabric Clocks中的FCLK_CLK0;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第25张图片
单击ok,完成配置。
现在单击Diagram窗口中的Run Block Automation,在弹出的窗口中,不做任何修改,直接单击ok;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第26张图片
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第27张图片
至此,完成ZYNQ的配置;
单击Sources,右键单击design_1,出现下面窗口;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第28张图片
单击 Create HDL Wrapper,在弹出的窗口选择第二个;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第29张图片
单击ok,稍等片刻,在sources窗口能看到创造了一个design_1_wrapper的verilog文件;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第30张图片
Ctrl+s保存,然后单击左下角的PROGRAM AND DEBUG中的Generate Bitstream,直接跑完综合,布线,生成bit流文件;如果遇到选项直接使用默认选项,点ok就完事。
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第31张图片
最终出现下面的窗口;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第32张图片
单击cancel;
单击左上角的file,出现菜单;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第33张图片

选择Export中的Export Hardware,出现下面窗口;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第34张图片
勾选上include bitstream,单击ok;
再点击file,出现菜单;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第35张图片
选择Launch SDK;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第36张图片

出现的窗口中,单击ok;
稍等片刻,SDK 2019.1(Windows环境)就启动了。

三、在虚拟机环境下生成内核镜像uImage和uboot.elf

现在转到虚拟机下进行操作,
虚拟机使用的是Ubuntu 16.04 64位,虚拟机的安装与使用就不赘述了。主要讲述如何使用交叉编译器编译linux内核和uboot源码。
我使用的是VM16,Ubuntu16.04

在Linux下安装SDK

下载Linux下的SDK2019.1,后并安装;我建议使用Xilinx的软件和FPGA的朋友都去注册一个Xilinx账号,网上都有教程,甚至都不用输入自己的真实信息hhhh,从官方下载比从网盘啥的下载的更快更放心。
帮找了个教程,参照着弄就可以。
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第37张图片
安装过程不赘述了,和Windows没什么区别。
Ctrl+Alt+T,进入Terminal,获取root权限

sudo su 
<输入用户密码>
cd <安装包所在路径>
chmod 777 ./Xilinx_SDK_2019.1_0524_1430_Lin64.bin
./Xilinx_SDK_2019.1_0524_1430_Lin64.bin

就能进入安装的界面了。
截一些图作为参考吧。。
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第38张图片
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第39张图片
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第40张图片
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第41张图片
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第42张图片
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第43张图片
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第44张图片
等待下载和安装完成即可。网速快的话十分钟就装好了hhh。

安装依赖包

安装完SDK后,在命令行下(root用户下)

apt-get install bison -y
apt-get install flex -y
apt-get install u-boot-tools -y
apt-get install device-tree-compiler -y
apt-get install libssl-dev -y

编译内核

将从XilinxGithub上下载的Linux内核源码放到/home/<用户名>/Dowloads下,并解压;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第45张图片
进入linux-xlnx-xilinx-v2019.1,右键单击空白处;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第46张图片
选择open in Terminal;
输入下面命令;

sudo su
<输入密码>
source /tools/Xilinx/SDK/2019.1/settings64.sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig //这里是拷贝zynq的默认内核配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage LOADADDR=0x8000

等待一段时间,让内核完成编译,最后在/home/<用户名>/Downloads/linux-xlnx-xilinx-v2019.1/arch/arm/boot/下能看到生成的内核文件uImage。
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第47张图片
将生成的uImage拷贝到/home/<用户名>/Documents里

编译uboot

将从XilinxGithub上下载的uboot源码放到/home/<用户名>/Dowloads下,并解压;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第48张图片
进入u-boot-xlnx-xilinx-v2019.1。
搜索找到zynq-common.h;路径为:/home/<用户名>/Downloads/u-boot-xlnx-xilinx-v2019.1/include/configs/zynq-common.h
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第49张图片
双击此文件,进行编辑;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第50张图片
修改为下图:
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第51张图片

1.删除"load mmc 0 ${ramdisk_load_address} ${ramdisk_image} && " \
2.将 ${ramdisk_load_address} 替换为 - 

回到/home/<用户名>/Downloads/u-boot-xlnx-xilinx-v2019.1目录下,空白处右键单击选择open Terminal,进入Terminal。
输入命令

source /tools/Xilinx/SDK/2019.1/settings64.sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zynq_zed_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

稍等片刻,uboot就编译完成,在/home/<用户名>/Downloads/u-boot-xlnx-xilinx-v2019.1下,有uboot.elf文件,把这个文件拷贝到Windows环境下。在SDK生成BOOT.bin的时候会用到。

四、使用SDK生成BOOT.bin、设备树

完成vivado工程部分的内容后,SDK就启动了;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第52张图片
单击上面的Xilinx,选择repositories;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第53张图片
出现窗口;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第54张图片
单击Global Repositories里面的new,出现浏览文件夹的界面。
把下载的设备树工具解压到某目录,然后选择到这个解压出来的文件夹;(我的是D:\device-tree-xlnx-xilinx-v2019.1)
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第55张图片
单击确定,可以看到Global Repositories窗口下多了个路径,这就是设备树工具的路径。
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第56张图片
单击下面的ok。
单击file,出现窗口;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第57张图片
选择Board Support Package,出现下面的窗口;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第58张图片
在左下角的Board Support Package OS中选择下面的device_tree,单击finish;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第59张图片
单击device_tree,在bootargs的一行里的value添加下面内容:

console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0

ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第60张图片
单击下面的ok,完成设备树的生成。
左边窗口的device_tree_bsp_0中能看到几个后缀为dts或dtsi的文件;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第61张图片
点击左上角的file,出现窗口
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第62张图片
选择new中的Application Project,出现窗口;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第63张图片
在project name中输出zynq,单击下面的next;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第64张图片
出现下面的窗口,选择zynq fsbl
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第65张图片
单击finish;稍等片刻,在左边project explorer中能看到多了两个文件夹zynq和zynq_bsp;
15
单击上面的Xilinx,出现窗口;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第66张图片
选择create boot image,出现窗口;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第67张图片
单击output bif file path右侧的browse…,选择BOOT.bin的存储文件夹;我选择了工程存放的文件夹。
单击Boot image partitions的add,出现窗口;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第68张图片
这里注意,第一次add,partition type为bootloader,必须选择刚刚生成的zynq.elf文件。
单击file path的browse…,前往工程文件夹下的project_1\project_1.sdk\zynq\Debug\zynq.elf,(我的是F:\chitanda_eru\project_1\project_1.sdk\zynq\Debug\zynq.elf)选择这个文件,单击打开,该文件就会被导入,Boot image partitions下可以看到该文件的目录。
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第69张图片
再次单击的Boot image partitions的add,出现窗口;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第70张图片
这次变为了datafile,单击file path的browse…,找到bit流文件,路径为工程文件夹下的project_1\project_1.sdk\design_1_wrapper_hw_platform_0\design_1_wrapper.bit,(我的是F:\chitanda_eru\project_1\project_1.sdk\design_1_wrapper_hw_platform_0\design_1_wrapper.bit),双击design_1_wrapper.bit,导入该文件。单击ok,发现在Boot image partitions下可以看到该文件的目录。
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第71张图片
再次单击的Boot image partitions的add,出现窗口;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第72张图片
单击file path的browse…,找到之前生成的uboot.elf文件,双击选择后点击ok,发现在Boot image partitions下可以看到该文件的目录。
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第73张图片
点击create image,在下方的控制台能看到BOOT.bin生成了。
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第74张图片
将这个BOOT.bin拷贝到虚拟机下,存放到/home/<用户名>/Documents里

五、设备树的生成

将SDK(Windows环境)生成的设备树文件夹传入虚拟机中;
我的文件夹路径为:F:\chitanda_eru\project_1\project_1.sdk\device_tree_bsp_0(工程路径\project_1\project_1.sdk\device_tree_bsp_0)
文件夹下有几个文件:
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第75张图片
我们需要用到的文件有:

pcw.dtsi
zynq-7000.dtsi
system-top.dts

如果你在PL端搭建了一些ip的话,那么还会有一个pl.dtsi的文件,这个后面有时间我会写一个搭pl的过程。
SDK生成的设备树格式有问题;双击打开system-top.dts

/*
 * CAUTION: This file is automatically generated by Xilinx.
 * Version: XSCT 2019.1
 * Today is: Mon Apr 19 17:45:40 2021
 */


/dts-v1/;
#include "zynq-7000.dtsi"
#include "pcw.dtsi"
/ {
	chosen {
		bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0 earlycon";
		stdout-path = "serial0:115200n8";
	};
	aliases {
		ethernet0 = &gem0;
		serial0 = &uart1;
		spi0 = &qspi;
	};
	memory {
		device_type = "memory";
		reg = <0x0 0x20000000>;
	};
};

应该把include前的#删掉,然后写成/include/这样的格式,如下:

/*
 * CAUTION: This file is automatically generated by Xilinx.
 * Version: XSCT 2019.1
 * Today is: Mon Apr 19 17:45:40 2021
 */


/dts-v1/;
/include/ "zynq-7000.dtsi"
/include/ "pcw.dtsi"
/ {
	chosen {
		bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0 earlycon";
		stdout-path = "serial0:115200n8";
	};
	aliases {
		ethernet0 = &gem0;
		serial0 = &uart1;
		spi0 = &qspi;
	};
	memory {
		device_type = "memory";
		reg = <0x0 0x20000000>;
	};
};

然后在这个文件夹界面下的空白处,单击右键,选择open Terminal,进入Terminal。
输入命令

dtc -I dts -O dtb -o devicetree.dtb system-top.dts

就能在当前目录下发现生成的devicetree.dtb了。
将生成的devicetree.dtb拷贝到/home/<用户名>/Documents里
至此,第一分区的准备工作就全部做完了。

六、linaro文件系统

SD卡分区

在虚拟机下,使用读卡器将microSD卡连接到电脑
按下Ctrl+Alt+T,进入Terminal,输入下面的命令

sudo apt-get install gparted -y
<输入密码>
gparted

就能弹出gparted工具的窗口;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第76张图片
点击左上角GParted,在弹出的菜单中Devices–><你的SD卡>
2
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第77张图片
右键单击这个黄条,出现菜单,选择unmount;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第78张图片
再右键单击这个黄条,出现菜单,选择Delete
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第79张图片
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第80张图片
现在我们要创建两个分区,一个FAT32,用于存放启动文件BOOT.bin、devicetree.dtb和uImage;一个EXT4,用于存放文件系统。
再右键单击这个黄条,出现菜单,选择new
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第81张图片
在弹出的窗口中这样进行配置
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第82张图片
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第83张图片
再右键单击这个黄条,出现菜单,选择new
按照下图进行配置;
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第84张图片
点击Add,完成配置。
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第85张图片
点击上方的绿色对勾,在弹出的窗口中选择Apply,稍等片刻,SD卡就完成了分区操作。
关闭gparted,在Ubuntu左侧就能看到有两个USB设备了。
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第86张图片
将之前放入Documents的三个文件拷入名为BOOT的分区
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第87张图片
将下载的linaro文件系统解压到rootfs,建议在命令行下进行解压,否则启动时可能会出现奇奇怪怪的问题hhhh。
将linaro-vivid-gnome-20151215-714.tar.gz拷贝到/home/<用户名>/Downloads下,使用下面的命令

tar -xvf /home/<用户名>/Downloads/linaro-vivid-gnome-20151215-714.tar.gz -C /media/<用户名>/rootfs

然后在rootfs下能看到生成了一个binary的文件夹,然后也可以看到binary下面有所有的根目录下的文件
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第88张图片
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第89张图片
使用下面命令把文件移动到rootfs下

mv /media/<用户名>/rootfs/binary/* /media/<用户名>/rootfs

这样SD卡就准备完成了,现在把SD卡插到开发板的SD卡插槽中,连接USB串口,上电启动。

七、系统启动

在putty中设置串口的参数(串口名在设备管理器中查看,波特率为115200)就可以看到系统正常启动了。
ZYNQ7000搭建嵌入式Linux操作系统---基础篇_第90张图片

你可能感兴趣的:(交叉编译,嵌入式,linux,fpga)