zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO

 zynq-7000系列基于zynq-zed的vivado初步设计

                              作者:卢浩  

                                     时间:2017.2.13

                                    转载请注明出处

                                                                 嵌入式爱好者开发群:122879839


大家都知道,zynq的核心,是arm与fpga互相配合,才能发挥出zynq的长处,如果只是用zynq来做arm处理器的话,有点杀鸡用牛刀的感觉。

来,开始设计吧。

首先打开vivado,open Example project,选择Embedded Design.接下来Base Zynq Design,选择Zedboard,然后finish.

如图:

zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第1张图片


这是一个demo设计,我们可以看到PL段默认是扩展了AXI GPIO的,8位的LED。我们先来个简单的,在linux下控制PL端扩展的8位LED。

直接综合设计,Run Implementation.结束后打开设计,进行约束,如图:

zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第2张图片

我们可以看到8位LEDpin配置已经配置好了,这是demo板的,bank电压也是配置好的,3V3,大家可以根据自己的实际情况,进行配置。

接下来生成BIT文件,Generate Bitstreadm.生成BIT文件之后,FILE->Export->Export Hardware,如图:

zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第3张图片


接下来File->Launch SDK,从vivado打开SDK软件,zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第4张图片

File->NEW->Application project,project name输入fsbl,我们要生成一个FSBL文件,这里大概说一下zynq的启动,BOOTROM->FSBL->BIT->UBOOT->DTS->KERNEL->FILESYSTEM.

选择NEXT->Zynq FSBL,然后Finish.如图:

zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第5张图片

右键FSBL,如图:

zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第6张图片

选择release。

编译生成fsbl.elf文件。

接下来右键fsbl,点击Create Boot Image.这一步是生成BOOT.BIN。如图:

zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第7张图片

这个uboot.elf文件就是之前编译uboot生成的。点击Create image生成BOOT.BIN。

zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第8张图片


可以看到生成的BOOT.bin文件。

接下来我们需要借助SDK生成DTS文件,熟悉DTS的工程师,可以直接去dts文件里面添加相关的GPIO信息,这一步也可以省去。

zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第9张图片

里面的内容可以去git上下载,链接:https://github.com/Xilinx/device-tree-xlnx/releases 

我选择的是2016.4,zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第10张图片

注意看一下我的环境变量的设置,目录名称的设置。不要搞错。

接下来生成dtb文件,FILE->New->Board Support Packagezynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第11张图片

如图,然后点击finish。

zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第12张图片


可以看到PL扩展的GPIO的dts描述信息,这里介绍下,pl.dtsi就是专门用来描述PL扩展的外设信息的,只需要包含到对应的dts文件里面就行了,比如这里就是把pl.dtsi包含进system.dts里面去的。简单描述一下他们的关系system.dts->pl.dtsi->zynq-7000.dtsi.

这里可以直接把生成的相关文件复制粘贴到zynq的dts文件里面去。

system.dts需要稍微修改一下,关于第一个网卡gem0的描述,

 41 &gem0 {
 42         status = "okay";
 43         phy-mode = "rgmii-id";
 44         phy-handle = <ðernet_phy>;
 45         ethernet_phy: ethernet-phy@0 {
 46                 reg = <0>;
 47               };
 48 };

如图

zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第13张图片

接下来就按照linux kernel编译办法进行编译,生成uImage和system.dtb。如图SD卡启动的话,把system.dtb改名成devicetree.dtb。

对了,要说一下,内核需要做一些配置,增加如下

CONFIG_GPIO_SYSFS=y
CONFIG_SYSFS=y
CONFIG_GPIO_ZYNQ=y
。这样生成的内核才能支持AXI_GPIO的驱动。

 编译如下

make -j4
make UIMAGE_LOADADDR=0x8000 uImage
make system.dtb
mv arch/arm/boot/dts/system.dtb devicetree.dtb
cp arch/arm/boot/uImage ./

至此,BOOT.bin devicetree uImage都生成完毕,文件系统暂时还用官方的ramdisk,懒的重新编了。我们测试一下AXI GPIO

把这些文件全部copy到sd卡中。SD卡插入zynq-zed开发板。上电,我们在linux的启动过程中,可以看到这句信息:

XGpio: /amba_pl/gpio@41200000: registered, base is 898 这就是PL扩展的AXI GPIO在linux下的注册过程。

进入linux系统后,首先进入目录

# cd /sys/class/gpio

接下来测试第一个GPIO,输入一下命令

# echo 898 > export

此时会生成一个gpio898,接下来设置io为输出

进入目录gpio898

# cd gpio898

# echo out > direction

输入以下命令,设置gpio为高,我们可以看到板子上的灯亮了。

# echo 1 > value 

如图:

zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的GPIO_第14张图片

至此,zynq-zed板,完成linux下通过axi总线控制pl扩展的gpio。




你可能感兴趣的:(ARM-LINUX,ZYNQ)