> 文章列表 > 制作四个文件启动的镜像

制作四个文件启动的镜像

制作四个文件启动的镜像

一 环境搭建:vivado2018.3,petalinux2018.3,

1.petalinux环境设置

所使用的编译环境需要使用petalinux这个软件,《第五章Petalinux 的安装》里面的5.1-5.4。有详细的安装过程,按照第五章的顺序把环境搭建好。可以不装XSDK,装好petalinux,到source setiing.sh之后用echo $PETALINUX有版本号,能够有hsi命令即可。JTAG也可以不装linux的,pl端的程序在Windows下的vivado里面写比linux方便。

petalinux2018.3安装路径:/home/geyuxi/opt/pkg/petalinux/2018.3/

source /home/geyuxi/opt/pkg/petalinux/2018.3/settings.sh

2,交叉编译工具链设置

交叉编译工具链版本要求需要大于7.0。安装方法有下面两种:

(1)只安装交叉编译器:选用的是7.5的交叉编译工具

文件名为gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz。和一半的交叉编译工具设置方式一样,将文件解压到/opt/目录下,再设置环境变量路径到目标位置:

sudo tar -xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/

sudo vim /etc/profile

在最后一行添加:

export PATH=$PATH:/opt/arm-linux/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin

退出profile

source /etc/profile

如果这个时候控制台的显示出问题,重启控制台即可。

再输入arm-linux-gnueabihf-gcc -v查看版本是否为7.5.0。若是,则设置成功。

(2)安装xilinx vivado xsdk 里面包含的有交叉编译器

     安装流程详见《第五章Petalinux 的安装》里面的5.5节。

     这里安装的路径放在了/home/geyuxi/opt/pkg/xsdk/SDK/2018.3/中,导入交叉编译器就输入source /home/geyuxi/opt/pkg/xsdk/SDK/2018.3/settings64.sh

二 ,FPGA硬件描述文件编译:获取hdf文件

hdf文件是硬件描述文件,通过在vivado设计硬件之后生成一个.bit文件,再通过file ->Export->Export Hardware生成,如图所示:

之后生成的hdf文件路径会打印在下方的Tcl Console中,如图2所示,在这里找到我们的hdf文件,放到linux的工作环境中,给hdf单独放一个文件夹

三,生成bit文件、dts文件、fsbl文件,u-boot.elf文件(用来合成BOOT.BIN文件)

名字

作用

编译来源

.bit文件

控制xilinx的FPGA部分的逻辑

.hdf文件或者vivado生成

.dts

设备树源文件

device-tree-xlnx-xilinx-v2018.3

.fsbl

用于xilinx的第一阶段启动文件

embeddedsw-xilinx-v2018.3

u-boot.elf

初始化硬件外设

alientek-uboot-2018.01-xlnx-v2018.3

1,生成.bit文件

.bit文件我们可以用之前在Windows下vivado里生成的那个,不过在linux下你用petalinux打开hdf文件的时候就会自己生成.bit文件,生成的文件统一是system.bit,所以直接用linux下的也行。

使能petalinux环境变量,每新开一个终端都需要执行一次

source  /home/geyuxi/opt/pkg/xsdk/SDK/2018.3/settings64.sh  

cd   /home/geyuxi/subomb_system/

hsi  //进入hsi,下面生成.bit文件

open_hw_design  /home/geyuxi/subomb_system/Navigator_7010.sdk/navigator_7010_wrapper.hdf

  exit

2,生成.dts设备树文件

.dts文件需要用hsi软件生成,要用到petalinux的devicetree的repo工具,工具的文件名为device-tree-xlnx-xilinx-v2018.3,使用的命令如下:

cd  /home/geyuxi/subomb_system/device-tree-xlnx-xilinx-v2018.3 

hsi

open_hw_design   /home/geyuxi/subomb_system/Navigator_7010.sdk/navigator_7010_wrapper.hdf

set_repo_path   ../device-tree-xlnx-xilinx-v2018.3

或者写绝对路径

set_repo_path  /home/geyuxi/subomb_system/device-tree-xlnx-xilinx-v2018.3

create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0

generate_target -dir ./        

或者写绝对路径

generate_target -dir  /home/geyuxi/subomb_system/linux/dts

exit

 之后就能再dts文件目录下找到生成的设备树文件了。

 

3,设备树文件生成之后,编译zynq_fsbl.elf文件

.fsbl文件也是需要用hsi软件生成的,需要用到petalinux的fsbl的repo工具,工具的文件名为embeddedsw-xilinx-v2018.3,使用如下命令:

建立一个软链接文件 gmake,链接到 make:

sudo  ln  -s /usr/bin/make /usr/bin/gmake

cd  /home/geyuxi/subomb_system/embeddedsw-xilinx-v2018.3  

hsi

open_hw_design /home/geyuxi/subomb_system/Navigator_7010.sdk/navigator_7010_wrapper.hdf

//这一步走通了最后一步才通,与navigator_7010_wrapper.bit前缀保持一致

set hwdsgn navigator_7010_wrapper   

    //设置 embeddedsw 仓库路径

set_repo_path ../embeddedsw-xilinx-v2018.3

// 定义 fsbl_dir 变量

set  fsbl_dir  /home/geyuxi/subomb_system/linux/fsbl

//编译zynq_fsbl,

generate_app -hw $hwdsgn -os standalone -proc ps7_cortexa9_0 -app zynq_fsbl -compile -sw fsbl -dir $fsbl_dir

exit

make clean    //在/home/geyuxi/subomb_system/linux/fsbl路径下输入make clean。

在/home/geyuxi/subomb_system/linux/fsbl目录下修Makefile文件,将编译产生的fsbl镜像文件名字改为 zynq_fsbl.elf,在fsbl 工程目录下,打开Makefile文件,修改EXEC变量

 

make   //生成在/home/geyuxi/subomb_system/linux/fsbl路径下,编译成功之后产生的镜像文件就成了 fsbl_zynq.elf。

 

1,编译uboot

#if 第一次操作

/home/geyuxi/subomb_system/ZYNQ_SUBOMB/linux/dts文件夹下生成的pcw.dtsi,pl.dtsi,system-top.dts 以及 zynq-7000.dtsi 四个文件拷贝到 u-Boot 源码目录

下的 arch/arm/dts 目录下

(1),添加设备树文件

/linux/dts 目录下)pcw.dtsi、pl.dtsi、system-top.dts 以及 zynq-7000.dtsi 四个文件拷贝到 u-boot 源码目录下的arch/arm/dts目录下。arch/arm/dts/system-top.dts做修改,具体查看正点原子手册;以上主要修改bootargs属性、添加model属性、网口0的MAC地址以及给qspi进行了分区操作。修改arch/arm/dts/system-top.dts文件。找到dtb-$(CONFIG_ARCH_ZYNQ)这里,将system-top.dtb(.dts 编译之后得到的就是.dtb 文件)。修改arch/arm/dts/Makefile 如下图所示,这样当CONFIG_ARCH_ZYNQ宏被选中的时候,system-top.dts才会被编译进去。

 

(2)修改 zynq- common.h 和 和 zynq_zc70x.h 配置 文件

zynq-common.h 和 zynq_zc70x.h 都在 include/configs 目录下,zynq-common.h 是xilinx 提供的用于配置 zynq 系列处理器的通用配置文件。zynq-common.h 头文件被zynq_zc70x.h 包含,下面我们要对这两个头文件进行一些简单地修改!主要是修改时钟频率、外设时钟、环境变量偏移量。

include/configs/zynq_zc70x.h#ifndef __CONFIG_ZYNQ_ZC70X_H#define __CONFIG_ZYNQ_ZC70X_H#include <configs/zynq-common.h>#endif /* __CONFIG_ZYNQ_ZC70X_H */include/configs/zynq-common.h/* CPU clock */#ifndef CONFIG_CPU_FREQ_HZ# define CONFIG_CPU_FREQ_HZ 666666687#endif/* QSPI */#ifdef CONFIG_ZYNQ_QSPI# define CONFIG_SF_DEFAULT_SPEED 50000000#endif/* Total Size of Environment Sector */#ifdef CONFIG_ENV_IS_IN_EEPROM# define CONFIG_ENV_SIZE CONFIG_SYS_EEPROM_SIZE# define CONFIG_EXTRA_ENV_SETTINGS#else# define CONFIG_ENV_SIZE 0x20000#endif

(3)配置并编译u-boot,就在uboot目录下

A,  defconfig配置

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zynq_zc702_defconfig

B,  menuconfig  图形化配置

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-  menuconfig

具体配置如下:

Boot media --->[*] Support for booting from SD/EMMC // 选择

SPL / TPL --->[ ] Enable SPL  // 取消

Command line interface --->

Memory commands --->[ ] eeprom - EEPROM subsystem // 取消

Device access commands --->[ ] i2c  // 取消

//将设备树设置为 system-top(也就是 system-top.dts)

Device Tree Control --->(system-top) Default Device Tree for DT control

Device Drivers --->Serial drivers --->[ ] Enable an early debug UART for debugging

配置完成之后保存退出。

 

C,执行下面这条命进行编译:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all  -j10

u-boot 文件是 elf 格式的镜像文件,而 u-boot.bin 则是纯二进制格式的镜像文件

 mv u-boot u-boot.elf //供后面打包BOOT.bin

至此,.bit文件,.dts文件,.fsbl,u-boot.elf文件全部制作完成。

四,Linux内核编译

生成zImage的xilinx arm官网kernel源码包:

linux-xlnx-xilinx-v2018.3.tar.gz。生成在arch/arm/boot/zImage

生成zImage的正点原子修改后的kernel源码包:

alientek-linux-4.14.0-xlnx-v2018.3.tar.gz。生成在arch/arm/boot/zImage

1,将前面 U-Boot 源码 arch/arm/dts 目录下的那四个设备树文件(pl.dtsi、 pcw.dtsi 、 system-top.dts 和 zynq-7000.dtsi ) 直 接 拷 贝 到 内 核 源 码 目 录 下 的 arch/arm/boot/dts 目录中。修改过的四个文件?

#if 第一次操作

将 system-top.dts 文 件 添 加 到 arch/arm/dts/Makefile 文件中,找到 dtb-$(CONFIG_ARCH_ZYNQ)这里,将 system-top.dtb添加上去

 

2,defconfig  配置

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig

3,menuconfig 配置驱动

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

如果添加axi_uartlittle串口驱动

(.config - Linux/arm 4.14.0 Kernel Configuration

 > Device Drivers > Character devices > Serial drivers)

Support for console on Xilinx uartlite serial port

( .config - Linux/arm 4.14.0 Kernel Configuration

 > Device Drivers > GPIO Support > Memory mapped GPIO drivers)

Xilinx GPIO support

Xilinx Zynq GPIO support

#endif

4,编译内核

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-  zImage  -j10

编译完成之后会在 arch/arm/boot/目录下生成一个名为 zImage 的内核镜像文件

5,编译设备树  文件夹下linux-xlnx-xilinx-v2018.3

内核与 u-boot 不同的是,U-Boot 的设备树默认是与内核一起编译的,并且产生的 dtb 文

件已经与 U-Boot 镜像文件集成在一起了;在内核里边我们需要单独编译出设备树的 dtb 文件,前面已经将我们所需要的设备树文件拷贝到内核的 arch/arm/boot/dts 目录下了,接下来执行这条命令编译 system-top.dtb 文件:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- system-top.dtb -j10

编译成功之后会在 arch/arm/boot/dts 目录下生成 system-top.dtb 文件

 

五,生成BOOT.BIN文件和rootfs文件

在自定义的文件夹下,创建一个petalinux工程使用虚拟机时使用bash命令关掉原来的设置才能设置正确的环境变量

1,创建 Petalinux 工程

petalinux-create -t project --template zynq -n ZYNQ_SUBOMB 

2, 导入 hdf 文件

cd  ZYNQ_SUBOMB  //进入到 petalinux 工程目录下

petalinux-config --get-hw-description ../Navigator_7010.sdk/   //获取硬件信息

3,配置petalinux

会自动进入配置界面,设置进入“Subsystem AUTO Hardware Settings”子菜单下的“Advanced bootable images storage Settings”菜单中,移动到“dtb image settings”选项,如下图所示:

 

进入“dtb image settings”选项并将 image storage media 设置为 primary sd,如下图所示:

配置完成后,返回到最初的配置界面,进入到“Image Packaging Configuration”菜单 下的“Root filesystem type (INITRAMFS)”子菜单下,如下图所示:

 

选择“SD card”,按键盘上的“Enter”键返回。 保存并退出。

 

编译生成跟文件系统petalinux-build -c rootfs。最终会在 images/linux下生成rootfs.tar.gz和rootfs.tar.bz2。这个是最简版本的,可以用可以不用。

 

文件名

生成的位置

内核源码目录

kernel/arch/arm/boot/zImage

system-top.dtb

内核设备树 dtb 文件,内核源码目录arch/arm/boot/dts/system-top.dtb

pl端bitstream

/home/geyuxi/subomb_system/Navigator_7010.sdk/design_navigator_7010_wrapper.bit

zynq_fsbl.elf

/home/geyuxi/subomb_system/linux/fsbl/zynq_fsbl.elf

我把它们全部放到/home/geyuxi/subomb_system/SD下面了,进入该路径后生成BOOT.BIN执行命令:生成BOOT.BIN

petalinux-package  --boot  -p  /home/geyuxi/subomb_system/ZYNQ_SUBOMB  --fsbl

/home/geyuxi/subomb_system/linux/fsbl/zynq_fsbl.elf --u-boot ./u-boot.elf -o ./BOOT.BIN --force

六 ,制作sd卡分区

分区必须从2048开始,可用SDFormatter进行格式化

umount /dev/sdb*

sudo fdisk /dev/sdb

输入d删除原来的分区,创建fat分区

输入“n”,并按如下创建分区

 

设置分区类型为W95 FAT32 (LBA)

 

输入“a”设为引导分区,创建ext4分区,输入n,后面一路默认

 

输入“p”检查分区表是否创建两个分区成功;输入“w”写入sd卡并退出

输入以下命令格式化分区,就可以将镜像分别放入对应分区了

sudo mkfs.vfat -F 32 -n boot /dev/sdb1

sudo mkfs.ext4 -L rootfs /dev/sdb2

Ext4分区放文件系统,通过如下命令将系统解压进去

rootfs

sudo tar -xzf rootfs.tar.gz -C /media/geyuxi/rootfs

改名design_navigator_7010_wrapper.bit->system.bit 和

改名system-top.dtb->system.dtb

 

卸载分区

umount /media/whitewizard/boot

umount /media/whitewizard/rootfs

启动时写boot的启动参数,参数如下:

setenv bitstream_load_address 0x100000

setenv bitstream_image system.bit

setenv bitstream_size 0x300000

setenv kernel_image zImage

setenv devicetree_image system-top.dtb

setenv sdboot 'if mmcinfo; then run uenvboot; echo Copying Linux from SD to RAM... && load mmc 0 ${bitstream_load_address} ${bitstream_image} && fpga loadb 0 ${bitstream_load_address} ${bitstream_size} && load mmc 0 ${kernel_load_address} ${kernel_image} && load mmc 0 ${devicetree_load_address} ${devicetree_image} && bootz ${kernel_load_address} - ${devicetree_load_address}; fi'

Saveenv