一: 前言
最近手上压了一块米联客的 Miz7035, 一块 xilinx zynq-7000 系列的开发板, 想着正好学习一下 Linux 在 ARM9 上的移植, 网上基本都是 ZC702,zed 的教程, 这对于买了非标准板的人来说就不太友好, 很多文件都不知道是怎么生成的. 本着学习加分享的心态, 把这两天移植 Linux 的过程写下来, 尽可能详细. 驱动和系统移植不是我的专长, 很多地方我也是知其然不知其所以然, 写得不对的地方欢迎指正.
二: 前期准备
1, 一台安装好 Linux 系统的主机, 我安装的是 centos7.2.
2, 一块 zynq-7000 系列的 FPGA 开发板, 我手上的是米联客 miz7035, 其他 zynq 系列一样通用.
3,vivado 开发环境, 我安装的 2018.2 版本
4,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).
5, 根文件系统, 这里我裂墙推荐 Debian,Debian 这个 Linux 系统, 底层非常稳定, 内核和内存的占用都非常小, 下载地址: https://pan.baidu.com/s/1eHmjGd-dTtgnITjG2D3CYA
三: 操作步骤
1. 设置交叉编译环境
因为最终运行在 arm9 上, 所以 uboot, 内核, 文件系统编译都需要用 ARM-Linux 交叉编译工具, zynq2000 使用的是 ARM-Linux-gnueabihf, 交叉编译工具可以从网上单独下载, 也可直接使用 vivado 自带的交叉编译工具. 使用方法也很简单
source /opt/Xilinx/SDK/2018.2/settings64.sh
或者
gedit /opt/Xilinx/SDK/2018.2/.settings64-SDK_Core_Tools.sh
将该文件中的内容全部复制到 bashrc, 更新环境变量, 这样在新的终端中打开, 环境变量也不会消失.
2.u-boot 编译
进入 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, 一共三个文件拷贝出来.
3.kernel 内核编译
- 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 没有任何区别.
4, 设备树编译
经过内核编译, 在 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).
5. 编译并安装内核模块, 更新文件系统
本文提供的 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.// 将安装好内核模块的根文件系统重新压缩
6. 生成启动镜像文件
制作启动镜像需要用到三个文件: fsbl.elf,system.bit 和第二步生成的 u-boot.elf.
打开 SDK 工具, 生成 fsbl 的方法网上很多, 自己查阅, 不赘述了, 这里只介绍如何制作 boot image
在 fsbl 工程目录上右键选择 Create Boot Image
加入 u-boot.elf 的路径, 然后 Create Image, 就会在指定的输出路径上生成 BOOT.bin
7. 设置 UBOOT 环境变量
新建一个 uEnv.txt, 输入内容:
optargs=console=tty0 consoleblank=0 vt.global_cursor_default=0
这部分不是很懂, 有清楚的请留言.
8. 制作 SD 卡
找一张 SD 卡, 通过系统自带的磁盘工具, 首先格式化. 然后创建两个分区, 一个 100M FAT 格式, 命名为 UBOOT, 剩余的 8G ext4 格式, 命名为 rootfs. 如图所示:
将步骤 6,7,4,3 生成的 BOOT.bin,uEnv.txt,devicetree.dtb,uImage 拷贝到 UBOOT 分区下
将步骤 5 生成的 rootfs.tar.gz 解压到 rootfs 分区下.
四: 实验结果
五, 结束语
至此, debian 在 zynq 上的移植全部结束, 之后, 我将分享如何在 Linux 基础上开发字符驱动, 以及如何运行 QT 程序, 并通过一个摄像头采集的例子作为具体应用.
来源: https://www.cnblogs.com/yuzeren48/p/10282478.html