• 前言

最近在使用ZYNQ7020开发板,写个文章记录下,分享下过程也以便日后查看。在开发过程中需要使用到Linux系统,由于网速原因下载petalinux安装包时间过长,急性子,所以琢磨着使用传统的方式来进行移植。废话不多说,开始记录!

开发平台:vivado2017.4  SDK 2017.4 

  • 准备工作

1、如何新建工程以及如何进行硬件部分的配置在此不过阐述,请参考网上其它文章,主要完成SD卡,网卡以及QSPI的引脚配置。这里需要提一下的就是将网卡以及SD卡引脚设置为高速引脚。

2、u-boot,device-tree,kernel下载。地址分别是:https://github.com/Xilinx/u-boot-xlnx (u-boot)、https://github.com/Xilinx/linux-xlnx(kernel)、https://github.com/Xilinx/device-tree-xlnx(device-tree)。此处经过本人的血泪教训,建议u-boot下载跟开发平台配套的版本,否则可能导致一系列未知的问题,kernel可以下载最新的版本,另外使用使用传统方式移植时,需要安装arm-linux-gnueabihf交叉编译工具。

  • 安装32位支持工作包

在命令行中,输入安装 32 位支持包的命令,格式为:apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0 lib32stdc++6

  • 设置交叉编译器环境

我是直接在ubuntu中安装了一个vivado linux版本的,在安装目录下就能找到交叉编译器,或者直接网上下载随便放在一个目录下,我放在了/opt目录下。

设置环境变量有两种方式,一种临时的,一种永久的。为了方便我直接更改了~/.bashrc文件,该方式不必每次打开一个终端都重新配置。另一种就是每次打开终端,执行一次

source /opt/Xilinx/SDK/2017.2/settings64.sh

运行ARM +TAB两次,应该能看到环境下的交叉编译器

  • 一切准备工作完成之后,就开始u-boot和kernel的编译工作了

1、编译u-boot,进去下载好的u-boot文件夹,修改include/configs文件夹中的zynq-common.h文件的sdboot部分如下,去除ramdisk的启动。

依次执行

make distclean  //清除配置文件和编译中间结果
make CROSS_COMPILE=arm-linux-gnueabihf- zynq_zc702_defconfig 
//重新配置,生成makefile,具体板子不一样,在U-Boot/configs文件夹下
make CROSS_COMPILE=arm-linux-gnueabihf-

当 u-boot 编译成功后,在 u-boot 目录下会生成 u-boot(一个 elf 文件)、 u-boot.bin 和u-boot.srec 等文件,如下图所示,其中 u-boot(elf 文件)将用来制作最后启动的BOOT.bin文件。(这里可能会有看到生成一个uboot和一个uboot.elf文件,选uboot就行)

2、编译内核

进入内核目录,依次执行(时间会有点漫长)

make distclean //清除配置文件和编译中间结果
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zc702_defconfig  //重新配置,生成makefile 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- UIMAGE_LOADADDR=0x8000 uImage  //编译内核,且生成uImage

完成之后会在arch/arm/boot 目录下产生 uImage 文件

3、生成设备树

在网上很多都是直接使用了内核中的设备树文件,这里使用官方的另一种方式,利用SDK来生成对应工程的设备树文件。

将下载好的device-tree-xlnx-xilinx-v2017.4导入到SDK中

完成后生成设备树文件

将生成的设备树文件放入ubuntu中,使用内核的dtc工具生成devicetree.dtb,进入内核目录,执行

./scripts/dtc/dtc -I dts -O dtb -o /设备树文件目录/devicetrdeee.dtb /设备树文件目录/system-top.dts  

  • 制作SD卡

将SD卡利用读卡器插入Ubuntu,在Ubuntu搜索路径中,输入 disk,会出现磁盘

点击+号添加分区,第一个分区为FAT类型,用来存放引导文件,第二个分区为EXT4类型,存放文件系统,这里分区完毕后可以点击挂载。

  • 同步根文件系统

这里使用的是debian根文件系统,去网上下载。

1、这里主要注意的是解压方式,只能使用命令解压sudo tar zxvpf debian_rootfs.tar.gz,千万别使用右键解压

2、进入根文件系统,在命令窗口输入"sudo rsync -av ./ /media/alinx/EXT"(/media/user/EXT 为 SD卡 EXT4分区的路径,可能会有不同,请根据自己实际情冴修改),开始同步当前目录到 SD卡的EXT分区根目录, 同步可能需要十几分钟的时间。
 

  • 生成BOOT.bin文件

打开生成设备树工程的SDK,生成一个FSBL模板,完成后右键create boot image,选择存放路径,依次按fsbl.elf,平台bit文件,以及编译的u-boot文件(重命名为uboot.elf)顺序放入,生成BOOT.bin

  • 创建uEnv.txt文件

新建一个文本文件,命名为uEnv.txt,写入,保存

bootargs=console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait

将生成的BOOT.bin、uImage、devicetrdeee.dtb、uEnv.txt文件放入SDK的FAT分区。将SD卡放入板子,选择从SD卡启动,至此结束。

  • 末尾

其实这里可以不需要uEnv.txt文件,我也是在后续的过程中才知道,在生成的设备树文件中的system-top.dts文件中添加重新生成新的设备树文件就行。

后面有时间写下裸机双系统和Linux+裸机双系统的移植,第一次写文章,如有错误,敬请指出!

Logo

更多推荐