ZYNQ 7030 Linux 系统移植

手上有一块 ZYNQ-7030的演示板,是仿照Xilinx Zedboard设计的,但是与Zedboard又有所不同,因此花时间移植一下Linux系统。记录下这个过程,希望能够帮助到有类似需要的朋友。自己动手移植Zedboard Linux系统的过程和这个类似。

(0)准备SD卡

首先应当准备一张SD卡(8G即可),并利用分区工具分成两个区。

Linux上比较好用的分区工具是GParted.

至于Windows的话,可以使用Partition Manager.

第一个区大小为1G,FAT32格式,卷标为BOOT,存放引导文件Boot.bin和linux内核镜像uImage。实际上这个分区用到的大小是很小的,只有10M左右的样子。但是考虑到以后我们可以在这里备份一些源码的压缩包,所以设定为1G。

第二个区利用剩余的空间,划分为EXT3/EXT4格式,卷标为rootfs,用来存放根放文件系统。

玩过linux的同学可能都知道BootLoader,例如U-BOOT就是一种经常用到的BootLoader,那么BOOT.BIN是什么呢?其实BOOT.BIN是包含UBOOT的一种BootLoader。

ZYNQ芯片和其他纯ARM芯片有所差异,是ARM+FPGA的结构,所以上电后除了在ARM(称为PS端,Processing System,处理器系统)引导操作系统之外,还要做FPGA(称为PL端,Programmable Logic)的一些操作。

Boot.bin的构成如下:

FSBL(第一阶段启动代码,用来完成全局初始化和硬件配置)

[system.bit](可选,用来配置PL端,若不添加此项,可启动后由软件配置)

u-boot(用来初始化ARM端,引导linux操作系统)

(1)硬件位流(BitStream)生成

硬件位流决定了总体的系统结构。虽然说位流文件主要是用来配置PL端的,实际上和PS端关系也十分密切,FSBL的生成依赖于具体的硬件(主要是依赖于hdf文件(Hardware Definination File)),所以这里首先要生成硬件位流。

新建一个Vivado工程,选择合适的器件(我这里是xc7z030fbg484-3),然后建立原理图文件。把zynq添加进来。

点击Run Block Automation,自动连接DDR和FIXED_IO。把FCLK_CLK0连接到M_AXI_GPO_ACLK上。

在原理图上Creat HDL Wrapper,综合,生成位流文件。这样就完成了zynq的“最小系统”设计,并生成了比特流。

然后将我们的硬件设计(虽然我们没加什么硬件模块进来)导出到SDK。方便起见,直接选择File->Export->Export Harware。SDK工程直接和Vivado共享一个工程根路径。

选择OK。

(2)第一阶段启动代码BootLoader(FSBL)生成

不要关闭刚才的Vivado工程。选择File->Lauch SDK。OK。基于Eclipse的SDK就启动了。可以看到硬件配置信息都导入进来了。

新建一个应用工程,工程名字叫zc703_fsbl,类型选择StandAlone,选择下一步。

在工程模板中选择fsbl工程。

为了方便调试,可以查看fsbl阶段的打印结果。可以通过查看fsbl阶段打印输出,结合JTAG调试排查问题所在。

具体做法是在fsbl_debug.h文件中增加宏定义

#define FSBL_DEBUG_INFO

然后生成zc703_fsbl.elf.

(3)U-boot生成

从xilinx 官方下载uboot源码。

https://github.com/Xilinx/u-boot-xlnx

在linux系统里面解压。

当然Linux系统里面要提前配置好arm-xilinx-linux-gnueabi- 交叉编译环境。

解压好之后,进入uboot-xlnx-master目录,

修改一下Makefile.为了方便起见,直接修改ARCH和CROSS_COMPILE的设置。在250行左右,修改成下图:

保存。

然后拷贝一份zc702的配置文件。

在configs目录下,cp zynq_zc702_defconfig zynq_zc703_defconfig,然后把702相关的内容改成703。

可以通过make menuconfig配置一下选项,也可以不修改。试你的硬件而定。

这时候默认生成的uboot默认使用的是ramdisk作为文件系统。我们使用sd卡上的文件系统,所以还需修改一下 include/configs/zynq-common.h

我是通过sd卡启动的,所以把sd卡启动处的ramdisk代码删掉了一行,并且修改了bootm命令执行的内容。

然后拷贝到windows系统中来。

还要修改一下设备树(zynq_zc702.dts)里面的启动配置,默认是没有的,需要自己添加:

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

具体的rootfstype根据你格式化的格式来。不过选ext4是可以兼容ext3的。

make

等待大概2分钟,就可以生成uboot了。

修改u-boot的文件名为u-boot.elf

mv u-boot u-boot.elf

同时把dts目录下生成的dt.dtb拷贝到windows系统中,改名为devicetree.dtb

可能有一部分开发人员想要限制PS端使用的内存大小,以往的修改方式是修改zynq_xxxx.h头文件里面的一个宏定义( CONFIG_SYS_SDRAM_SIZE),并且修改设备树的memory分支。在新版本的u-boot里面,把这个宏定义删掉了,所以直接修改设备树即可,但必须在编译u-boot的时候修改,否则单独编译设备树是不会起到实质性的作用的。按照我的理解,应该是u-boot编译的时候参照设备树的一些定义生成了一些配置,具体机制尚不明了,还希望有大牛能够多多指教~

(4)生成引导文件Boot.bin

在SDK中,选择Xilinx Tools->Create Boot Image,依次将生成的zc703_fsbl.elf、zc703_test.bit(可选)和u-boot.elf添加进来。即可生成BOOT.BIN文件。

(5)Linux内核定制

从xilinx Git下载内核源码,运用与u-boot类似的方法,即可编译内核。解释一下为什么这里选zc702,这是由于zc703与zc702的ARM核心是相同的,而且不像zedboard在板上集成了那么多外设。具体的配置可以根据你自己的硬件来。

注意生成uImage时,命令为:

Make uImage LOADADDR = 0x8000

这个loadaddr可以根据需要进行修改。

将Boot.bin、devicetree.dtb、uImage拷贝到sd卡的boot分区。

(6)解压根文件系统

http://releases.linaro.org 下载你想要的文件系统版本。我选择了桌面版。

在linux系统下,将其解压到rootfs分区。

解压命令:

tar -xvf --strip-components=1 liaro-[tab] /media/rootfs

即可。

但是要做一个软链接,否则执行可执行文件会出现如下错误(No such file or directory):

执行如下命令,即可:

ln -s /lib/ld-linux-armhf.so.3 /lib/ld-linux.so.3

(7)测试

将SD卡插入板卡,连接好串口,打开串口终端,即可看到启动信息:

FSBL启动信息:

Uboot启动信息:

linux启动过程:

剩下的时间,尽情享受开发的乐趣吧~~

文章来源:Deeply的博客