一 环境搭建: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