0. 概述

ZYNQ生成uboot的时候和正常的ARM设备不太一样,ZYNQ属于二次辅助启动uboot然后由uboot启动内核,大概意思就是 ZYNQ内部有一个机制,该机制不可修改,可以通过拨码开关控制启动方式,比如从SD卡启动还是从QSPI启动,SD卡中要包含uboot的镜像信息。最大的不同就是,uboot编译完还不可以直接使用,还需要使用Vivado设计PL,再用SDK将uboot和设计PL的文件进行合成,最终合成后的文件拷贝到SD卡,由其启动。

我不会FPGA,本文也只概述在Linux端,SD卡如何做,如何制作一个全新的Linux系统。

映像文件BOOT.BIN一般包括:FSBL,Bitstream和SSBL这三个文件,其中Bitstream是配置PL端程序,是可选项,在我们制作Linaro系统的时候并不需要。FSBL是first stage boot loader,文件的制作需要使用Vivado环境;SSBL是Second Stage Boot Loader,这里使用的是Xilinx公司提供的u-boot。

来自参考文献1

1. 环境和材料

1.1 开发环境

  • 软件环境:Vivado 2017.02 Linux版本

  • 系统环境:Ubuntu 16.04 amd64

  • 交叉编译器: gcc-linaro-7.3-2018.05.tar.xz

    我的交叉编译环境放在/opt/toolschain/linaro/bin/arm-linux-gnueabihf-下,我编译的时候喜欢指定绝对编译器路径

1.2 准备材料

  • ARM端的linux内核源码:https://github.com/Xilinx/linux-xlnx
  • ARM端的uboot源代码:https://github.com/Xilinx/u-boot-xlnx
  • ARM端的Linaro文件系统:https://releases.linaro.org/archive/12.07/ubuntu/precise-images/ubuntu-desktop/linaro-precise-ubuntu-desktop-20120723-305.tar.gz (我用的是ubuntu 12.07)

2. 制作uboot

2.1 编译uboot

  • 获取xilinx的uboot源码:git clone https://github.com/Xilinx/u-boot-xlnx.git

  • 清除编译:make CROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf- ARCH=arm clean

  • 配置板级信息:make CROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf- ARCH=arm zynq_zc702_defconfig 板级信息在如图所示位置,我的是zc701的板子,但是没有,我就选择一个和这个最相近的。

  • menuconfig写入配置信息:make CROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf- ARCH=arm menuconfig

  • 编译uboot:make CROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf- ARCH=arm -j8

  • 编译成功后生产的是uboot,所以需要重命名uboot: mv uboot uboot.elf

拿到uboot.elf后,留存备用,再合成最终的boot程序需要这个uboot.elf文件。

2.2 FSBL、bit文件的制作

大体流程就是:用Vivado这个软件新建工程,然后添加ip设计,配置时钟、配置一些Linux需要的基本外设(SD卡卡、串口、以太网等),使用wrap HDL功能生成顶层设计.v文件,然后编译.v文件生成.bit文件,再生成硬件描述文件,launch SDK软件,会自动生成一个工程,编译后拿到fsbl文件。

具体过程很多博友都已经写的很清楚了,我这里贴出一个讲的比较好的,可以按照这个方法做:在未来的多核通信机制里面,PS和PL的通信,则PL文件就是这样设计好之后然后我们重新合成uboot文件。

https://blog.csdn.net/long_fly/article/details/78643258

我们通过这样的方式拿到vivado编译生成的bit文件,并且在SDK里面建立了工程,生成了一个硬件平台,接下来我们获取fsbl这个文件。fsbl文件需要在SDK里面建立一个FSBL工程,并且基于刚才我们生成的硬件平台。

建立完之后直接编译,就可以拿到fsbl文件。

到目前位置,拿到了:

  • vivado编译生成的:bit文件
  • sdk生成的:fsbl文件
  • 刚刚编译uboot生成的:uboot.elf文件

可以开始合成BOOT.bin文件了

2.3 合成BOOT.bin

这个操作还是在sdk软件里面进行。

使用create boot image功能:

到此完成BOOT.bin的合成。

2.4 文件权限(仅限Linux开发用户)

还有一个非常重要的事情,我试了很多次,zynq平台就是不启动,uboot也不输出任何的信息。这个小小的问题卡了我很久,不过在今天早上洗漱的时候,突然想到,Xilinx Vivado和SDK都是在root情况下启动,生成BOOT.bin也是可能有权限问题。所以....

我拿到板子,然后在SD卡里面,给定sudo chmod 777 BOOT.bin然后弹出SD卡,把SD放在ZYNQ上,居然成功启动了。如果你是在Linux系统下,不要忘记给定BOOT.bin权限。

3 Linux内核制作

3.1 Linux内核编译出uImage文件

  • 获取Linux内核:git clone https://github.com/Xilinx/linux-xlnx.git
  • 切换到Linux内核源码目录,开始清理内核:make CROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf- ARCH=arm clean
  • 配置板级信息:make CROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf- ARCH=arm xilinx_zynq_defconfig
  • 使用menuconfig写入.config文件:make CROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf- ARCH=arm menuconfig 进来之后退出就行。
  • 编译内核:make CROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf- ARCH=arm -j8
  • 制作uImage文件:make CROSS_COMPILE=/opt/toolschain/linaro/bin/arm-linux-gnueabihf- ARCH=arm uImage LOADADDR=0x00008000
  • 编译完成后,在linux-xlnx/arch/arm/boot的uImage文件留着备用。

3.2 制作设备树文件

在linux-xlnx/arch/arm/boot/dts目录内新建zynq-7010.dts文件,文件内容:

/dts-v1/;
/include/ "zynq-7000.dtsi" / {
model = "HLF";
compatible = "ALINX,zynq", "xlnx,zynq-7000"; aliases {
ethernet0 = &gem0;
serial0 = &uart1;
spi0 = &qspi;
mmc0 = &sdhci0;
}; memory@0 {
device_type = "memory";
reg = <0x0 0x20000000>;
}; chosen {
bootargs = "";
stdout-path = "serial0:115200n8";
}; usb_phy0: phy0 {
compatible = "usb-nop-xceiv";
#phy-cells = <0>;
reset-gpios = <&gpio0 46 1>;
};
}; &clkc {
ps-clk-frequency = <50000000>;
}; &gem0 {
status = "okay";
phy-mode = "rgmii-id";
phy-handle = <&ethernet_phy>; ethernet_phy: ethernet-phy@0 {
reg = <0>;
};
}; &qspi {
u-boot,dm-pre-reloc;
status = "okay";
};

切换到内核的主目录里面:./scripts/dtc/dtc -I dts -O dtb -o ./arch/arm/boot/devicetree.dtb ./arch/arm/boot/dts/zynq-7010.dts

然后在linux-xlnx/arch/arm/boot/目录下即可发现devicetree.dtb文件,同样留着备用。

3.3 启动配置文件制作uEnv.txt

随便找个位置新建一个uEnv.txt 文件,文件内写入boot的配置信息:

uenvcmd=run linaro_sdboot

linaro_sdboot=echo Copying Linux from SD to RAM... && \
fatload mmc 0 0x3000000 ${kernel_image} && \
fatload mmc 0 0x2A00000 ${devicetree_image} && \
if fatload mmc 0 0x2000000 ${ramdisk_image}; \
then bootm 0x3000000 0x2000000 0x2A00000; \
else bootm 0x3000000 - 0x2A00000; fi bootargs=console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait

保存,留着备用。

4 SD卡制作

准备一张空白的超过8G的SD卡,读卡器读取该卡,我们使用Linux系统进行格式化,Windows用户可以通过diskgen等格式化分区的软件制作也好。

  • 查看SD卡格式化分区:sudo fdisk -l 假如查看到的SD卡是/dev/sde分区,(不要格式化错了,在我年轻的时候我曾经把整个硬盘都格式化了,很危险的操作,看清楚是/dev/sd* 后面是c 还是d还是e还是f)。
  • 进入分区管理:sudo fdisk /dev/sde

  • 以下步骤按照这个OMAPL138制作SD卡启动盘及重装Linux系统,我的这个博客来。注意不同的是,我们建立启动分区的大小是100M即可,创建boot的分区的类型也为Linux。

  • 然后格式化boot分区:sudo mkfs.vfat -F 32 -n "boot" /dev/sde1

  • 格式化rootfs分区:sudo mkfs.ext4 -L "rootfs" /dev/sde2

    到此我们完成了SD卡制作。

5 烧写SD启动卡

  • sd卡的boot分区:使用命令将 BOOT.bin / devicetree.dtb / uImage / uEnv.txt 四个文件拷贝到boot分区。

  • 解压Linaro的文件系统: 在第一章写的 ARM端的Linaro文件系统:linaro-precise-ubuntu-desktop-20120723-305.tar.gz 解压到SD卡的root分区

    sudo tar --strip-components=3 -C /media/delvis/rootfs -xzpf linaro-precise-ubuntu-desktop-20120723-305.tar.gz binary/boot/filesystem.dir

  • 最好找一个带知识灯的读卡器,解压命令执行完了,不代表SD卡写入完毕,如果有指示灯,指示灯不闪烁之后弹出SD卡。

到此,一个完整的Linaro系统就写入了SD卡,将FPGA板子的boot拨码开关拨到SD卡启动位置,就可以看到Linaro系统启动了。

参考文献:

[1] long_fly, ZYNQ跑系统 系列(一) 传统方式移植linux, 2017年11月28日

[2] 雅可, Zedboard上运行Linaro系统(二):生成BOOT.BIN, 2016年07月26日

[3] 带你高飞, 03-ZYNQ学习(启动篇)之程序的固化, 2018年05月22日

ZYNQ的Linux Linaro系统镜像制作SD卡启动(仅使用mkfs部分,其他部分待看)的更多相关文章

  1. ZYNQ的Linux Linaro系统镜像制作SD卡启动

    ZYNQ的Linux Linaro系统镜像制作SD卡启动 0. 概述 ZYNQ生成uboot的时候和正常的ARM设备不太一样,ZYNQ属于二次辅助启动uboot然后由uboot启动内核,大概意思就是 ...

  2. OMAPL138制作SD卡启动介质及重装Linux系统

    OMAPL138制作SD卡启动盘及重装Linux系统 手里的创龙的OMAPL138平台的系统SSH坏掉了,我重新移植了openssh还是不好使,没有办法了只能重装OMAPL138的系统了,按照创龙给的 ...

  3. Samsung_tiny4412(驱动笔记01)----linux 3.5,U-Boot,Busybox,SD卡启动环境搭建

    /*********************************************************************************** * * linux 3.5,U ...

  4. [i.MX6q]i.MX6q处理器,linux操作系统平台搭建 从SD卡启动系统

    转自:http://www.07net01.com/linux/2016/02/1232094.html 参照1:http://blog.csdn.net/girlkoo/article/detail ...

  5. 制作SD卡启动自己编译的uboot.bin

    README for FriendlyARM Tiny4412 -----------------------------------------------------1. Build uboot ...

  6. raspberry 烧写镜像到SD卡

    刚开始接触树莓派,需要烧写系统镜像到SD卡,网上找了些资料,记录于此. raspberry镜像下载: https://www.raspberrypi.org/downloads/ 烧写工具: wid3 ...

  7. Linux命令行烧录树莓派镜像至SD卡

    首先下载镜像压缩包 验证压缩包的未被串改 1 sha1sum 2013-09-25-wheezy-raspbian.zip 对此命令的输出结果和官网给出的SHA-1 Checksum进行比对,如果一致 ...

  8. Exynos4412从SD卡启动的简单网络文件系统制作

    Exynos4412从SD卡启动的简单网络文件系统制作 1. 简介 嵌入式系统能够在开发板上正常运行,需要先进行系统配置,一个完整的嵌入式系统应该包含的几个部分::uboot,kernel,rootf ...

  9. 用QEMU模拟运行uboot从SD卡启动Linux

    平台:Qemu + vexpress-a9 u-boot:u-boot-2019.10 Linux:linux-4.14.13       之前介绍过用Qemu模拟运行uboot,然后从网络启动lin ...

随机推荐

  1. map接口详解

    1.Map接口详解(1)映射(map)是一个存储键.键值对的对象,给定一个键,可以查询得到它的值,键和值都可以是对象(2)键必须是唯一的,值可以重复(Map接口映射唯一的键到值)(3)有些映射可以接收 ...

  2. 如何安装 mcrypt

    #cd libmcrypt-2.5.8 #./configure #make #make install 说明:libmcript默认安装在/usr/local3.安装mhash #tar -zxvf ...

  3. 数据库的特性与隔离级别和spring事务的传播机制和隔离级别

    首先数据库的特性就是 ACID: Atomicity 原子性:所有事务是一个整体,要么全部成功,要么失败 Consistency 一致性:在事务开始和结束前,要保持一致性状态 Isolation 隔离 ...

  4. 关于Calendar和Reminder(日历和提醒)编程指南

    Event Kit框架使你能访问用户的Calendar.app和Reminders.app信息.虽然这是两个不同的app,但是他们使用相同的框架处理数据.类似地,存储这些数据的数据库,被称为日历数据库 ...

  5. vue实现动态显示与隐藏底部导航的方法分析

    本文实例讲述了vue实现动态显示与隐藏底部导航的方法.分享给大家供大家参考,具体如下: 在日常项目中,总有几个页面是要用到底部导航的,总有那么些个页面,是不需要底部导航的,这里列举一下页面底部导航的显 ...

  6. codecs模块, decode、encode

    使用codecs模块,在Python中完成字符编码   字符的编码是按照某种规则在单字节字符和多字节字符之间进行转换的某种方法.从单字节到多字节叫做decoding,从多字节到单字节叫做encodin ...

  7. LightOJ 1342 Aladdin and the Magical Sticks [想法题]

    题目链接 : http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27050 --------------------------- ...

  8. 初步学习JS中的闭包

    JS高级程序设计(3rd)中对闭包的定义就是一句话,首先闭包是一个函数,怎样的函数呢?有权访问另一个函数作用域中的变量 的函数.而创建闭包的常见方式就是在一个函数的内部创建另一个函数,就是嵌套函数. ...

  9. 深入RESTful无状态原则

    目录 目录 前言 无状态原则 Web服务的状态 基于状态的Web服务 基于无状态的Web服务 总结两者的区别 前言 在上篇RESTful基础知识中整体的介绍了RESTful架构设计思想的框架,在往后的 ...

  10. ETCD 简介及基本用法

    ETCD 项目地址 ETCD 官方文档 1. 简介 ETCD 是一个高可用的分布式键值数据库,可用于服务发现.ETCD 采用 raft 一致性算法,基于 Go 语言实现. 特点 简单:安装配置使用简单 ...