欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于Zynq传统linux系统搭建

程序员文章站 2024-03-22 09:54:10
...

一、概述

根据官方wiki(https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841650/Xilinx+V4L2+CFA+driver),Zynq上跑linux系统总体概述如图所示:

基于Zynq传统linux系统搭建
从上图来看,主要分为三部分完成:
1.硬件设计
2.系统软件设计
3.APP设计

二、步骤整理

2.1 完成硬件设计部分,并导入到SDK中

2.2 create FSBL

2.3 create device tree

首先需要下载官方github上的相关库,在上面提到的wiki中也有提到需要这几个库:

```bash
$ cd /opt/Xilinx/xil-sources
$ git clone https://github.com/Xilinx/u-boot-xlnx.git
$ git clone https://github.com/Xilinx/linux-xlnx.git
$ git clone https://github.com/Xilinx/device-tree-xlnx

注:在linux中完成

然后,打开SDK软件,在其中设置引用库:Window -> Preferences -> Repositories,进行如下设置:
基于Zynq传统linux系统搭建
最后,File -> New -> Board support project,选择device tree
确定之后就会产生一个device tree文件。
上图文件说明:dts结尾的为device tree source,dtb为device tree blob,dtsi文件则存储了各个参数信息,详情见:https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842279/Build+Device+Tree+Blob

上图有一个system_top.dts文件,包含了内存信息,控制台以及引导参数。
最后,就需要产生.dtb文件,其产生需要DTC编译器,所以需要source到SDK的settings64.sh,然后进行下述操作:

$ cd /mnt/shared/video_linux/video_linux.sdk/device_tree_bsp_0
$ cpp -nostdinc -I include -I arch -undef -x assembler-with-cpp system-top.dts system-top.dts.preprocessed(可以省略,因为system.top中已经在SDK软件中生成)
$ dtc -I dts -O dtb -i . -o devicetree.dtb system-top.dts.preprocessed

上述文件的操作就是用DTC编译器,编译dts文件,以产生dtb文件,这个文件名也就是devicetree.dtb。这个文件需要在后面linux内核中用到。

2.3 编译u-boot

执行以下命令:
首先:cd /opt/Xilinx/xil-sources/u-boot-xlnx
并且source /opt/Xilinx/Vivado/2018.2/setting64.sh(根据自己的Vivado安装位置不同定)
然后根据不同的板子类型进行下一步:
基于Zynq传统linux系统搭建
我的板子是Zynq,所以:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf- 

紧接着,不同的平台执行不同的操作:

make distclean
make zynq_zc702_defconfig
make
cp u-boot u-boot.elf
arm-linux-gnueabihf-objdump -h u-boot 查看u-boot 文件的不同段的

内存分配情况
这里zynq_zc702_defconfig与平台类型相关,数据表见:https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841973/Build+U-Boot
上述操作会产生一个u-boot文件,后缀为ELF文件,将用来产生BIN文件。此外还会产生一个mkimage模块,为了使这个文件能够在其他步骤使用,采取以下命令:

cd tools
export PATH=`pwd`:$PATH

上述可能会出现提示版本低于6.0出错等相关问题,要么是因为没有进行source,要么是下载的uboot库版本与Vivado自带的交叉编译器相差太大,因为GitHub上库一直在更新,如果使用Vivado版本太低,就会出现一些问题。

2.4 产生BIN文件

在SDK中,选择Xilinx -> Create Boot Image得到以下图片:
基于Zynq传统linux系统搭建
Add上文得到的两个ELF文件,一个是FSBL文件,一个是u-boot产生的ELF文件,会生成一个bif文件,这个文件描述了BIN文件的分区信息,点击create即可生成BIN文件。另外上述文件没有加入bit文件,当然也可以加入进去但是在生成FSBL时,就用到了bit文件,所以这里不需要加入也可以。在console文输出以下信息:

bootgen -image boot.bif -arch zynq -o \ /home/tavish/vivado/video_linux/video_linux.sdk/BOOT.bin -w on

表明了文件位置。
另外,在bootgen文件中会有以下说明:

	//arch = zynq; split = false; format = BIN
	the_ROM_image:
	{
	[bootloader]/home/tavish/vivado/video_linux/video_linux.sdk/fsbl/Debug/fsbl.elf
	/opt/Xilinx/xil-sources/u-boot-xlnx/u-boot.elf
	}

这里也表明了两个ELF文件信息。
如果说,我们已经生成BIN文件,想要加入bit文件,可以打开上述生成的bif文件,在其中加入bit文件路径即可,改为:

//arch = zynq; split = false; format = BIN
the_ROM_image:
{
[bootloader]/home/tavish/vivado/video_linux/video_linux.sdk/fsbl/Debug/fsbl.elf
/home/tavish/vivado/video_linux/video_linux.sdk/top_wrapper_hw_platform_0/top_wrapper.bit
/opt/Xilinx/xil-sources/u-boot-xlnx/u-boot.elf
}

这里一定要顺序,fsbl.elf、bit、 u-boot.elf
然后运行:

bootgen -image boot.bif -arch zynq -o \
/home/tavish/vivado/video_linux/video_linux.sdk/BOOT.bin -w on 

即可重新生成BIN文件。此时的bootlog中应该显示的Partition Count: 3即分区数目为3.

bootgen -image output.bif -arch zynq -o /home/mirrorl/XIlinx/BOOT.bin -w on

这里的bootgen要先source以下才可以的,也就是官网发布的Bootgen工具,方便不使用SDK软件的客户使用,怕麻烦的可以在SDK软件中合成,网上也有步骤。

2.5 Build the Linux kernel

首先,确保cd到了linux-xlnx,然后也source了settings64.sh;
然后,找到我们的配置文件:

find . -name *defconfig | grep zynq

这个指令会找到defconfig后缀文件,根据找到的defconfig文件,执行:

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

由于不同的开发平台,defconfig会不同,所以这个find是必须的,或者按照这个表格:
基于Zynq传统linux系统搭建
如果想自定义这个配置文件则使用:

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

跳出如下界面:
基于Zynq传统linux系统搭建
最后编译kernel:

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- UIMAGE_LOADADDR=0x8000 uImage

即可在在linux-xlnx-master/arch/arm/boot目录下可以发现uImage文件,待用。
这一步可能会缺失一些文件报错,例如/bin/sh: 1: flex: not found或者/bin/sh: 1: bison: not found
解决方案:sudo apt install flex 后者sudo apt install bison –y

2.5 制作uEnv.txt

创建一个TXT,里面输入:

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

2.6 运行

将devicetree.dtb、BOOT.bin、uEnv.txt、uImage等文件,拷贝到内存卡的FAT分区中,根文件系统放在EXT4分区中,FPGA上电,并插上串口,运行putty,设置好串口参数,工作正常时,就会打印一些信息。文件系统的下载见:releases.linaro.org/archive选择12.09->ubuntu->précises-images->Ubuntu-desktop->linaro-precise-unbutu-desktio-20120923-436.tar.gz

三、用户端

上述进入到linux系统中之后,便可以进行ls、cd等命令的操作,如果在Vivado工程中,已经创建了emio的输出,就可以点亮我们的GPIO,详情可见:https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842398/Linux+GPIO+Driver
下面可以写一个简单的代码运行:
首先导出GPIO

echo 961 > /sys/class/gpio/export

然后:

while :
do
  echo 1 > /sys/class/gpio/gpio960/value;
echo on;
sleep 1s; 
echo 0 > /sys/class/gpio/gpio960/value ;
echo off;
sleep 1s;
done

可以看见LED开始闪烁,并且屏幕对应打印on,off
基于Zynq传统linux系统搭建

四、可能遇到的错误

  1. FSBL Status = 0xA008 #define NO_DDR 0xA008 /**< DDR missing
    */

    原因:上述表明是没有DDR 解决:加入DDR重新生成dtb文件、BIN文件即可解决

  2. FSBL Status = 0xA009
    #define SD_INIT_FAIL 0xA009 /**< SD Init fail */ 原因:SD卡初始化失败 解决:将SD的电压改为1.8V的

  3. Bitstream not loaded into PL 原因:在生成bin文件时,没有按照fsbl.elf bit
    u_boot.elf的顺序 解决:调整顺序即可

  4. 无法启动boot,只运行到了FSBL 原因:dts文件中串口没有设置对 解决:将dts文件中串口好调整即可

相关标签: Zynq