基于Zynq传统linux系统搭建

一、概述

根据官方wiki(https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841650/Xilinx+V4L2+CFA+driver),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,进行如下设置:
在这里插入图片描述
最后,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,所以:

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得到以下图片:
在这里插入图片描述
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是必须的,或者按照这个表格:
在这里插入图片描述
如果想自定义这个配置文件则使用:

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

跳出如下界面:
在这里插入图片描述
最后编译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
在这里插入图片描述

四、可能遇到的错误

  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文件中串口好调整即可

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值