EBAZ4205 ZYNQ 7Z010 u-boot & Linux 生成方法记录

上一篇文章介绍了EBAZ4205如何裸机固化,从NAND启动,并生成了.bit和fsbl.elf文件。本文记录如何生成u-boot & Linux。注意:在这之前需要移动电阻将zynq改为从SD卡启动。


使用vivado/Xilinx SDK生成.bit和fsbl.elf

上一篇文章生成的.bit和fsbl.elf并没有使用到所有的硬件。重新配置ZYNQ后产生FPGA下载文件:.bit和first stage bootloader:fsbl.elf,留着备用。除此之外还会产生 .hdf(.xsa)硬件描述文件。.hdf文件主要用于给petalinux自动生成镜像,本文不使用petalinux的全自动镜像生成功能,而是下载u-boot和linux源码手动编译。


在ubuntu16.04环境编译 u-boot & Linux

  1. ubuntu必须是16.04版本,本文使用ubuntu-16.04.4-desktop-amd64.iso

  2. 安装petalinux依赖

    sudo apt-get install tofrodos iproute2 gawk gcc g++ git make net-tools libncurses5-dev \
    tftpd zlib1g:i386 libssl-dev flex bison libselinux1 gnupg wget diffstat chrpath socat \
    xterm autoconf libtool tar unzip texinfo zlib1g-dev gcc-multilib build-essential \
    libsdl1.2-dev libglib2.0-dev screen pax gzip automake
    
  3. 在Xilinx官网下载 petalinux-v2018.3-final-installer.run 。这里统一采用v2018.3版本(petalinux、
    u-boot-xlnx、linux-xlnx),不同版本不要交叉使用。v2019.1之后的petalinux版本不带交叉编译器,只能选择安装VIVADO进行编译。

    #安装petalinux到petalinux-v2018.3目录
    ./petalinux-v2018.3-final-installer.run ./petalinux-v2018.3
    
  4. 下载 xilinx uboot https://github.com/Xilinx/u-boot-xlnx/archive/refs/tags/xilinx-v2018.3.zip

    下载 xilinx linux内核 https://github.com/Xilinx/linux-xlnx/archive/refs/tags/xilinx-v2018.3.zip

    解压到当前目录,先进入u-boot-xlnx-xilinx-v2018.3目录:

    touch run.sh
    chmod a+x run.sh
    gedit run.sh
    

    添加以下脚本备用,该脚本用来一键生成BOOT.BIN:

    #!/bin/bash
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zynq_ebaz4205_defconfig
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
    mv u-boot u-boot.elf
    echo the_ROM_image: \
    { \
       [bootloader]./fsbl.elf \
       ./top_pl.bit \
       ./u-boot.elf \
    } > boot.bif
    bootgen -image boot.bif -o i BOOT.bin -w
    
  5. 增加ebaz4205配置文件

    u-boot支持设备树。添加设备树 zynq-ebaz4205.dts到 ./arch/arm/dts/:注意:最新版本的Linux内核已经添加了EBAZ4205的设备树文件,但本次采用的v2018.3版本会出现zynq-7000.dtsi兼容问题遂不采用。文件内容:

       // SPDX-License-Identifier: GPL-2.0+
    /*
    *  Copyright (C) 2011 - 2015 Xilinx
    *  Copyright (C) 2012 National Instruments Corp.
    */
    /dts-v1/;
    #include "zynq-7000.dtsi"
    //  /include/ "zynq-7000.dtsi"
    #define GPIO_ACTIVE_HIGH 0
    #define GPIO_ACTIVE_LOW  1
    / {
       model = "Ebang EBAZ4205";
       compatible = "ebang,ebaz4205", "xlnx,zynq-7000";
    
       aliases {
          ethernet0 = &gem0;
          serial0 = &uart1;
          mmc0 = &sdhci0;
       };
    
       memory@0 {
          device_type = "memory";
          reg = <0x0 0x10000000>;
       };
    
       chosen {
          bootargs = "";
          stdout-path = "serial0:115200n8";
       };
    
       ebaz-keys {
          compatible = "gpio-keys";
          autorepeat;
          s2 {
                label = "s2";
                gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>;
                /*KEY_POWER*/
                linux,code = <116>;
                wakeup-source;
                autorepeat;
          };
    
          s3 {
                label = "s3";
                gpios = <&gpio0 32 GPIO_ACTIVE_HIGH>;
                /*KEY_HOME*/
                linux,code = <102>;
                wakeup-source;
                autorepeat;
          };
       };
       ebaz-leds {
          compatible = "gpio-leds";
    
          led-green {
             label = "green";
             gpios = <&gpio0 54 GPIO_ACTIVE_LOW>;
             default-state = "on";
          };
          led-red {
             label = "red";
             gpios = <&gpio0 55 GPIO_ACTIVE_LOW>;
             default-state = "on";
          };
       };
    
    };
    
    &clkc {
       ps-clk-frequency = <33333333>;
    };
    
    &gem0 {
       status = "okay";
       phy-mode = "mii";
       phy-handle = <&phy>;
    
       /* PHY clock */
       assigned-clocks = <&clkc 18>;
       assigned-clock-rates = <25000000>;
    
       phy: ethernet-phy@0 {
          reg = <0>;
       };
    };
    
    &smcc {
       status = "okay";
    };
    
    &nand0 {
       status = "okay";
       pinctrl-names = "default";
       pinctrl-0 = <&pinctrl_nand0_default>;
       partition@0 {
          label = "nand-fsbl-uboot";
          reg = <0x0 0x300000>;
       };
       partition@1 {
          label = "nand-linux";
          reg = <0x300000 0x500000>;
       };
       partition@2 {
          label = "nand-device-tree";
          reg = <0x800000 0x20000>;
       };
       partition@3 {
          label = "nand-rootfs";
          reg = <0x820000 0xa00000>;
       };
       partition@4 {
          label = "nand-jffs2";
          reg = <0x1220000 0x1000000>;
       };
       partition@5 {
          label = "nand-bitstream";
          reg = <0x2220000 0x800000>;
       };
       partition@6 {
          label = "nand-allrootfs";
          reg = <0x2a20000 0x4000000>;
       };
       partition@7 {
          label = "nand-release";
          reg = <0x6a20000 0x13e0000>;
       };
       partition@8 {
          label = "nand-reserve";
          reg = <0x7e00000 0x200000>;
       };
    };
    
    &pinctrl0 {
       pinctrl_nand0_default: nand0-default {
          mux {
                groups = "smc0_nand8_grp";
                function = "smc0_nand";
          };
    
          conf {
                groups = "smc0_nand8_grp";
                bias-pull-up;
          };
       };
    
       pinctrl_uart1_default: uart1-default {
          mux {
                groups = "uart1_4_grp";
                function = "uart1";
          };
    
          conf {
                groups = "uart1_4_grp";
                slew-rate = <0>;
                io-standard = <3>;
          };
       };
    };
    
    &sdhci0 {
       u-boot,dm-pre-reloc;
       status = "okay";
    };
    
    &uart1 {
       u-boot,dm-pre-reloc;
       status = "okay";
       pinctrl-names = "default";
       pinctrl-0 = <&pinctrl_uart1_default>;
    };
    
  6. 参考zynq_zc702_defconfig 添加 zynq_ebaz4205_defconfig

    cp configs/zynq_zc702_defconfig  configs/zynq_ebaz4205_defconfig
    gedit zynq_ebaz4205_defconfig
    

    删除:

    CONFIG_ENV_IS_IN_SPI_FLASH=y.

    修改:

    CONFIG_SYS_CONFIG_NAME="zynq_ebaz4205"

    CONFIG_IDENT_STRING=" Xilinx Zynq EBAZ4205"

    CONFIG_DEFAULT_DEVICE_TREE="zynq-ebaz4205"

    CONFIG_DEBUG_UART_BASE=0xe0001000

    增加:

    CONFIG_NAND=y

    CONFIG_NAND_ZYNQ=y

    CONFIG_BOOTDELAY=3

    CONFIG_DEFAULT_DEVICE_TREE对应之前新增的设备树名,CONFIG_DEBUG_UART_BASE=0xe0001000说明使用uart1(个人猜测fsbl对fpga配置完成后,uart1 ip就连上了特定的mio/emio,只要告诉uboot,使用uart1的地址而不是uart0)

  1. 增加头文件

    cp include/configs/zynq_zc70x.h include/configs/zynq_ebaz4205.h
    

    增加: #define CONFIG_CPU_FREQ_HZ 666666667

  2. gedit arch/arm/mach-zynq/Kconfig 改动点如下:

    config SYS_CONFIG_NAME
       string "Board configuration name"
       default "zynq_ebaz4205"
    
  3. petalinux工具需要使用bash。

    sudo dpkg-reconfigure dash
    

    出现对话框选择no

  4. 把之前.bit和.elf文件复制到当前目录,名字改为top_pl.bit fsbl.bit。然后执行:

    # 设置petalinux编译器环境变量
    source ../petalinux-v2018.3/settings.sh
    ./run.sh
    

    产生BOOT.bin和devicetree.dtb

  5. 进入linux-xlnx-xilinx-v2018.3目录直接编译zynq Linux内核

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
    cp ./arch/arm/zImage ./
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- UIMAGE_LOADADDR=0x8000 uImage
    cp ./arch/arm/uImage ./
    

    产生./arch/arm/zImage

    产生./arch/arm/uImage

  6. 新建 uEnv.txt 定制启动命令。没有uEnv.txt文件时,u-boot内的bootargs变量是空的,也可以在dts文件中加入
    bootargs。 使用uEnv.txt文件的另一个好处是可以设置设备树和内核的内存存放地址。

    ZYNQ上电后首先运行FAT32文件系统内的BOOT.bin。BOOT.bin内包含了fsbl.elf、top_pl.bit、u-boot.elf。fsbl.elf
    首先在片内RAM被执行,完成外部存储器初始化、使用top_pl.bit配置FPGA等操作。随后将应用程序载入内存执行。u-boot.elf
    就是应用程序。u-boot.elf一般被载入内存的高地址区域,因此kernel_image应当放置在低地址区域。kernel_image地址之
    前需要预留一些空间存放页表,因此存放在0x8000。uEnv.txt中的ramdisk_image是内存盘,本文使用了ext4分区根文件系统
    因此可以把判断删除。

    bootargs=console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait
    uenvcmd=run linaro_sdboot
    linaro_sdboot=echo Run uEnv.txt copying Linux from SD to RAM... && \
    fatload mmc 0 0x0 ${devicetree_image} && \
    fatload mmc 0 0x8000 ${kernel_image} && \
    if fatload mmc 0 0x1000000 ${ramdisk_image}; \
    then bootm 0x8000 0x1000000 0x0; \
    else bootm 0x8000 - 0x0; fi
    
  7. 将以下文件放入fat32分区的SD卡就可以启动了,uboot默认识别devicetree.dtb、uImage、uEnv.txt文件名

    BOOT.bin
    devicetree.dtb
    uImage
    uEnv.txt 
    
  8. 进入Linux后会报根文件系统挂载错误。下载一个根文件系统解压到SD卡的ext4分区就可以启动了。

    可以直接使用的根文件系统:linaro-precise-ubuntu-desktop-20120723-305.tar.gz(https://releases.linaro.org/archive/12.07/ubuntu/precise-images/ubuntu-desktop/)

    建议在命令行解压到SD卡ext4分区:

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

    启动后在ebaz4205的串口登录,执行一些必要的修改:

    vi /etc/apt/sources.list
    # 源改为以下内容
    deb http://mirrors.ustc.edu.cn/ubuntu-old-releases/ubuntu/ precise main universe
    deb-src http://mirrors.ustc.edu.cn/ubuntu-old-releases/ubuntu/ precise main universe
    deb http://mirrors.ustc.edu.cn/ubuntu-old-releases/ubuntu/ precise-security main universe
    deb-src http://mirrors.ustc.edu.cn/ubuntu-old-releases/ubuntu/ precise-security main universe
    deb http://mirrors.ustc.edu.cn/ubuntu-old-releases/ubuntu/ precise-updates main universe
    deb-src http://mirrors.ustc.edu.cn/ubuntu-old-releases/ubuntu/ precise-updates main universe
    # 安装sshd
    apt-get update
    apt-get openssh-server
    
  9. 控制LED灯和读取按键的目录

    echo 1 > /sys/bus/platform/devices/ebaz-leds/green/brightness #具体路径可能不一样
    hexdump /dev/input/event0 # 所有事件输入
    

    向特定的文件写入数组用来控制LED的亮灭。该目录内的文件是根据设备树生成的,默认配置编译的内核自带led驱动。内核驱动识别设备树的"gpio-leds" 字段,再根据gpios = <&gpio0 54 GPIO_ACTIVE_LOW>字段使用具体的IO口。在zynq架构中arm自带的54个mio编号从0-53,arm外扩到FPGA的emio编号从54开始。我们在配置emio的时候,vivado会让你选择使用几个emio,例如这边我使用2个,则编号从54-55。<&gpio0 54 GPIO_ACTIVE_LOW>说明我们使用第一个emio,而这个emio通过FPGA管脚约束已经被连到绿色LED上。因此在运行这个Linux内核之前必须通过boot.bin完成FPGA初始化。

  10. 网络测试

    200M下测试了下百兆口的网速,应该可以跑满,如图

    ebaz0-1.png

    使用iperf测试UDP丢包率。以100M速率发送到板子时,丢包率为5.6%。50M时是1.4%。

    ebaz0-2.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容