最近手上压了一块米联客的Miz7035,一块xilinx zynq-7000系列的开发板,想着正好学习一下linux在ARM9上的移植,网上基本都是ZC70二、zed的教程,这对于买了非标准板的人来讲就不太友好,不少文件都不知道是怎么生成的。本着学习加分享的心态,把这两天移植linux的过程写下来,尽量详细。驱动和系统移植不是个人专长,不少地方我也是知其然不知其因此然,写得不对的地方欢迎指正。linux
一、一台安装好linux系统的主机,我安装的是centos7.2.git
二、一块zynq-7000系列的FPGA开发板,我手上的是米联客miz7035,其余zynq系列同样通用。github
三、vivado开发环境,我安装的2018.2版本centos
四、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)。bash
五、根文件系统,这里我裂墙推荐Debian,Debian这个Linux系统,底层很是稳定,内核和内存的占用都很是小,下载地址:https://pan.baidu.com/s/1eHmjGd-dTtgnITjG2D3CYA工具
由于最终运行在arm9上,因此uboot、内核,文件系统编译都须要用arm-linux交叉编译工具,zynq2000使用的是arm-linux-gnueabihf,交叉编译工具能够从网上单独下载,也可直接使用vivado自带的交叉编译工具。使用方法也很简单学习
source /opt/Xilinx/SDK/2018.2/settings64.sh
或者centos7
gedit /opt/Xilinx/SDK/2018.2/.settings64-SDK_Core_Tools.sh
将该文件中的内容所有复制到bashrc,更新环境变量,这样在新的终端中打开,环境变量也不会消失。spa
进入u-boot文件夹,操作系统
make distclean //清除配置文件和编译中间结果 make CROSS_COMPILE=arm-linux-gnueabihf- zynq_mz7x_defconfig //从新配置,生成makefile,具体板子不同,在U-Boot/configs文件夹下 make CROSS_COMPILE=arm-linux-gnueabihf- tools //编译开发所须要的工具 make CROSS_COMPILE=arm-linux-gnueabihf- //编译,完成后生成一个elf文件u-boot,uboot.bin,u-boot.srec等文件
最后把编译生成的u-boot后缀改为.elf,连同u-boot.img和spl/boot.bin,一共三个文件拷贝出来。
export PATH=${YOUR_UBOOT_DIR}/tools:$PATH //编译内核若是要生成uImage,则须要用到mkimage工具,该工具在u-boot/tools下有提供
make distclean //清除配置文件和编译中间结果 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_mz7x_defconfig //从新配置,生成makefile make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- prepare scripts //编译开发所须要的工具 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- UIMAGE_LOADADDR=0x8000 uImage //编译内核,且生成uImage
最后把{KERNEL_DIR}/arch/arm/boot/zImage,{KERNEL_DIR}/arch/arm/boot/uImage拷贝出来。
# zImage - compressed kernel image
# uImage - zImage plus U-Boot header
uImage是在zImage以前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,若是直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。
通过内核编译,在kernel文件夹下script/dtc中有编译好的设备树编译工具
cd kernel/scripts/dtc ./dtc -I dts -O dtb -o devicetree.dtb /FPGA工程目录/SDK目录/device_tree_bsp_0/system-top.dts //dts为sdx工程中生成,编译后在当前目录下生成一个名为devicetree.dtb)。
本文提供的rootfs是已经编译好的,若是想要从新编译或者更新文件系统,能够下载后解压,而后执行如下步骤
cd your_downlood_kernel_dir //打开编译好的内核文件夹 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules //编译内核模块, make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install INSTALL_MOD_PATH=../rootfs // 在上一步打开的终端中,从新安装内核模块,安装路径为解压出来的rootfs路径 tar -cvzf rootfs.tar.gz rootfs。//将安装好内核模块的根文件系统从新压缩
制做启动镜像须要用到三个文件:fsbl.elf、system.bit和第二步生成的u-boot.elf。
打开SDK工具,生成fsbl的方法网上不少,本身查阅,不赘述了,这里只介绍如何制做boot image
在fsbl工程目录上右键选择Create Boot Image
加入u-boot.elf的路径,而后Create Image,就会在指定的输出路径上生成BOOT.bin
新建一个uEnv.txt,输入内容:
optargs=console=tty0 consoleblank=0 vt.global_cursor_default=0
这部分不是很懂,有清楚的请留言。
找一张SD卡,经过系统自带的磁盘工具,首先格式化。而后建立两个分区,一个100M FAT格式,命名为UBOOT,剩余的8G ext4格式,命名为rootfs。如图所示:
将步骤六、七、四、3生成的BOOT.bin、uEnv.txt、devicetree.dtb、uImage拷贝到UBOOT分区下
将步骤5生成的rootfs.tar.gz解压到rootfs分区下。
至此,debian在zynq上的移植所有结束,以后,我将分享如何在linux基础上开发字符驱动,以及如何运行QT程序,并经过一个摄像头采集的例子做为具体应用。