这几天比较闲,正好我新买的SD卡也到了,花了两天的时间摸索,编译好了运行于zedboard上的u_boot,uImage,并将其存放到到SD卡中在zedboard上成功启动了linux
不得不吐槽一下我参考的网上教程没有一份从开始到最后都是准的。。出了好多的错误,我都是费劲的一个个错误进行调试的,以本人的低水平,最终能调好已经是万幸了,最后以此文记载一下过程,以免新手继续走弯路。
首先是linux编译环境,我这里用的不是大多数人所用的虚拟机,是用的学校的服务器,这台服务器装的是Redhat操作系统,而且由于我在上面安装过很多东西,所以并不缺库,所以安装相关的软件就被我直接省略掉了。
第一步:下载并安装arm-xilinx-linux-gnueabi-工具链。
直接从网盘下载https://pan.baidu.com/s/1pLlVcaJ,下载到linux系统中,直接./运行即可。运行后会出来安装界面
这个很简单,正常安装好就行,然后将其安装目录下bin文件夹添加到自己的PATH路径中,这样交叉工具链就安装好了。
第二步,下载并编译U-boot
选用的U-boot的网站为https://github.com/Xilinx/u-boot-xlnx,直接命令git clone https://github.com/Xilinx/u-boot-xlnx,下载完成后
cd u-boot-xlnx
确保交叉编译链在环境变量中:export CROSS_CONPILE=arm-xilinx-linux-gnueabi-
然后输入命令
make arch=ARM CROSS_CPMPILE=arm-xilinx-linux-gnueabi- zynq_zed_config
成功执行后 再输入命令
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-
若出现问题
*** Your GCC is older than 6.0 and is not supported
解决方法如下
vim arch/arm/config.mk
将64,65,68-73行注释掉,如图所示
执行成功后,目录下出现u-boot.bin 将其更名为u-boot.elf
mv u-boot.bin u-boot.elf
第三步,生成BOOT.bin文件
上面生成的u-boot是不可以单独使用的,必须配合vivado的fsbl,和配置fpga的文件.bit一起使用。
我的vivado是2018.1版本的,其余版本可能也是大同小异。
首先打开vivado,新建一个工程,选择器件的时候选择开发板zedboard,点击Create Block Design,添加一个ZYNQ Processing System,如图所示就可以
然后在Source栏里,右键这个Block,选择Create HDL Wrapper,生成好wrapper之后,生成bitstream,生成完事后,File->Export->Export Hardware,勾中Include bitstream。然后File->Launch SDK登录SDK界面。
在SDK界面里 File->New->Application Project,设置如下:
注意!!名字随便取,但是那个Hardware Platform一定要选 zed_hw_platform(pre-defined),否则不好使
Next后选择Zynq FSBL
Finish后,等待系统编译生成fsbl.elf文件,若工程名字不是fsbl,则该文件为工程名.elf
然后选择Xilinx->Create Boot Image
随便选一个输出路径,然后在底下将三个文件填加进去,注意顺序不能错。分别是fsbl.elf(bootloader) .bit(datafile) u-boot.elf(datafile)。
然后Create即可。生成出来的BOOT.bin放在SD卡中,即可在zedboard上启动u-boot了。
附一张我的SD卡分区图,分两块,第一块文件格式fat32,标签为boot,用于存放本文所有文件,我给的大小是256M,第二块分区是ext4文件系统,标签为rootfs,用于linux系统解压文件系统。BOOT文件放置在fat32分区上即可。
第4步,制作内核文件
网址:https://github.com/Digilent/linux-digilent-Dev(我也不到当时为什么u-boot用xilinx,内核用digilent的。。能用就行)
git clone https://github.com/Digilent/linux-digilent-Dev
下载完成后
cd linux-digilent-Dev
检查环境变量CROSS_COMPILE,若没有则添加上,同u-boot添加方法。继续
make ARCH=arm CROSS-COMPILE=arm-xilinx-linux-gnueabi- xilinx_zynq_defconfig
make ARCH=arm CROSS-COMPILE=arm-xilinx-linux-gnueabi-
在arch/arm/boot文件夹中生成了zImage。
将刚才的u-boot文件夹下的tool文件夹配置到环境变量PATH中(需要里面的mkimage工具)
export PATH=$PATH:~/zedboard/u-boot-xlnx/tools/
make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage
若执行无误,在arch/arm/boot文件夹中生成了uImage,这个文件是我们最后需要的文件。
第五步,生成设备树和下载文件系统
cd arch/arm/boot/dts
dtc -I dts -O dtb -o devicetree.dtb zynq-zed.dts
生成的devicetree.dtb即我们需要的文件
文件系统没有编译,直接下载的官方的,以后有空补上
网址 https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842473/Build+and+Modify+a+Rootfs
注意,该文件系统不能直接使用,要对其进行包装,确定刚才添加的mkimage在环境变量中,执行命令
mkimage -A arm -T ramdisk -C gzip -d ramdisk.image.gz uramdisk.image.gz
生成可以使用的文件系统。
第六步,运行Linux系统
将四个文件,分别是BOOT.bin uImage devicetree.dtb uramdisk.image.gz拷贝到SD卡中的fat32分区中。
上电运行zedboard。
串口输出
至此,linux系统被成功运行在zedboard之上。
四个文件的下载地址https://download.csdn.net/download/dongze2/10720546