分享下自己在搭建嵌入式操作系统的过程与心得。
使用平台: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。
1.打开vivado,显示下面界面
点击create project;
点击next;
选择你要保存工程的路径和工程名,点击next;
点击next;
点击next;
在add constraints这个界面,单击create file;
在file name对约束文件进行命名,单击ok后窗口关闭,单击next;
在search里面输入你的zynq的型号,alinx的是xc7z010clg400-1,单击选择,再单击next;
单击finish,就完成了工程的建立。
执行完上一步骤后,进入下面的界面;
界面内容不介绍了,想学习vivado的朋友可以找找相关的资料。
单击左侧 PROJECT MANAGER里的IP INTEGATOR的create block design;
使用默认选项,单击ok;
稍等片刻,vivado界面显示了BLOCK DESIGN;
单击右侧Diagram窗口中的加号,两个加号都可以;
在窗口中输入zynq,显示如下;
双击中间的ZYNQ7 Processing System,稍等片刻,Diagram窗口中出现了zynq的ip核;
双击该ip核,进行配置;(p.s.:如果觉得配置zynq核很麻烦的话…可以直接点presets,在弹出的菜单中选择apply configuration,然后选择我分享的配置,zc010-simple.tcl这个文件)
选择左边page navigator中的MIO Configuration,并按照下图进行配置;
这里要注意下MDIO,默认是EMIO,要选择MIO52-53
然后要对DDR进行配置,更改DDR Configuration中的DDR controller configuration中的Memory part 为 MT41J128M16 HA-125;(这里是ALINX上带的DDR的型号)
再选择PS-PL Configuration 取消选中AXI NON Secure enablement中的GP master AXI interface中的M axi gp0 interface;
再选择PS-PL Configuration 取消选中general中的enable clock resets中的FCLK_RESET0_N;
再选择Clock Configuration,取消选中PL Fabric Clocks中的FCLK_CLK0;
单击ok,完成配置。
现在单击Diagram窗口中的Run Block Automation,在弹出的窗口中,不做任何修改,直接单击ok;
至此,完成ZYNQ的配置;
单击Sources,右键单击design_1,出现下面窗口;
单击 Create HDL Wrapper,在弹出的窗口选择第二个;
单击ok,稍等片刻,在sources窗口能看到创造了一个design_1_wrapper的verilog文件;
Ctrl+s保存,然后单击左下角的PROGRAM AND DEBUG中的Generate Bitstream,直接跑完综合,布线,生成bit流文件;如果遇到选项直接使用默认选项,点ok就完事。
最终出现下面的窗口;
单击cancel;
单击左上角的file,出现菜单;
选择Export中的Export Hardware,出现下面窗口;
勾选上include bitstream,单击ok;
再点击file,出现菜单;
选择Launch SDK;
出现的窗口中,单击ok;
稍等片刻,SDK 2019.1(Windows环境)就启动了。
现在转到虚拟机下进行操作,
虚拟机使用的是Ubuntu 16.04 64位,虚拟机的安装与使用就不赘述了。主要讲述如何使用交叉编译器编译linux内核和uboot源码。
我使用的是VM16,Ubuntu16.04
下载Linux下的SDK2019.1,后并安装;我建议使用Xilinx的软件和FPGA的朋友都去注册一个Xilinx账号,网上都有教程,甚至都不用输入自己的真实信息hhhh,从官方下载比从网盘啥的下载的更快更放心。
帮找了个教程,参照着弄就可以。
安装过程不赘述了,和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
就能进入安装的界面了。
截一些图作为参考吧。。
等待下载和安装完成即可。网速快的话十分钟就装好了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下,并解压;
进入linux-xlnx-xilinx-v2019.1,右键单击空白处;
选择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。
将生成的uImage拷贝到/home/<用户名>/Documents里
将从XilinxGithub上下载的uboot源码放到/home/<用户名>/Dowloads下,并解压;
进入u-boot-xlnx-xilinx-v2019.1。
搜索找到zynq-common.h;路径为:/home/<用户名>/Downloads/u-boot-xlnx-xilinx-v2019.1/include/configs/zynq-common.h
双击此文件,进行编辑;
修改为下图:
即
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的时候会用到。
完成vivado工程部分的内容后,SDK就启动了;
单击上面的Xilinx,选择repositories;
出现窗口;
单击Global Repositories里面的new,出现浏览文件夹的界面。
把下载的设备树工具解压到某目录,然后选择到这个解压出来的文件夹;(我的是D:\device-tree-xlnx-xilinx-v2019.1)
单击确定,可以看到Global Repositories窗口下多了个路径,这就是设备树工具的路径。
单击下面的ok。
单击file,出现窗口;
选择Board Support Package,出现下面的窗口;
在左下角的Board Support Package OS中选择下面的device_tree,单击finish;
单击device_tree,在bootargs的一行里的value添加下面内容:
console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0
单击下面的ok,完成设备树的生成。
左边窗口的device_tree_bsp_0中能看到几个后缀为dts或dtsi的文件;
点击左上角的file,出现窗口
选择new中的Application Project,出现窗口;
在project name中输出zynq,单击下面的next;
出现下面的窗口,选择zynq fsbl
单击finish;稍等片刻,在左边project explorer中能看到多了两个文件夹zynq和zynq_bsp;
单击上面的Xilinx,出现窗口;
选择create boot image,出现窗口;
单击output bif file path右侧的browse…,选择BOOT.bin的存储文件夹;我选择了工程存放的文件夹。
单击Boot image partitions的add,出现窗口;
这里注意,第一次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下可以看到该文件的目录。
再次单击的Boot image partitions的add,出现窗口;
这次变为了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下可以看到该文件的目录。
再次单击的Boot image partitions的add,出现窗口;
单击file path的browse…,找到之前生成的uboot.elf文件,双击选择后点击ok,发现在Boot image partitions下可以看到该文件的目录。
点击create image,在下方的控制台能看到BOOT.bin生成了。
将这个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)
文件夹下有几个文件:
我们需要用到的文件有:
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里
至此,第一分区的准备工作就全部做完了。
在虚拟机下,使用读卡器将microSD卡连接到电脑
按下Ctrl+Alt+T,进入Terminal,输入下面的命令
sudo apt-get install gparted -y
<输入密码>
gparted
就能弹出gparted工具的窗口;
点击左上角GParted,在弹出的菜单中Devices–><你的SD卡>
右键单击这个黄条,出现菜单,选择unmount;
再右键单击这个黄条,出现菜单,选择Delete
现在我们要创建两个分区,一个FAT32,用于存放启动文件BOOT.bin、devicetree.dtb和uImage;一个EXT4,用于存放文件系统。
再右键单击这个黄条,出现菜单,选择new
在弹出的窗口中这样进行配置
再右键单击这个黄条,出现菜单,选择new
按照下图进行配置;
点击Add,完成配置。
点击上方的绿色对勾,在弹出的窗口中选择Apply,稍等片刻,SD卡就完成了分区操作。
关闭gparted,在Ubuntu左侧就能看到有两个USB设备了。
将之前放入Documents的三个文件拷入名为BOOT的分区
将下载的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下面有所有的根目录下的文件
使用下面命令把文件移动到rootfs下
mv /media/<用户名>/rootfs/binary/* /media/<用户名>/rootfs
这样SD卡就准备完成了,现在把SD卡插到开发板的SD卡插槽中,连接USB串口,上电启动。