AXIDMA 驱动的使用

AXIDMA 驱动的使用

  • Yan He
  • 本文档主要是对github上的一个开源项目AXIDMA的README进行一些补充

环境

  1. linux 4.4(对应的是xilinx-linux-2016.2 )
  2. vivado 2016.4
  3. xilinx sdk 2016.4
  4. 硬件: zedboard

原料

  1. u-boot-xlnx-v2016.2
  2. linux-xlnx-v2016.2
  3. device-tree-xlnx-v2016.2
  4. arm_ramdisk.image.gz
  5. 某大神github上的开源项目

步骤

1 搭建交叉编译环境

  • 步骤: 内容来自该文档
    • 1 安装 32 位库【如果 PC 安装的是 32 位的 Linux,可省去此步骤】
      由于这个环境是为 32 位系统设计的,所以 64 位系统需要先安装 32 位库。在 Ubuntu 终端(Ctrl+Alt+T 打开终端)中进入 root 权限(输入 su root,输入 UNIX 密码即可[如果事先没有设置密码,先通过 sudo passwd root 设置 UNIX 密码])。
      Ubuntu12.04 及更老的版本可以在终端中输入 apt-get install ia32-libs。 Ubuntu12.04 之后 ia32-libs 被取消了。 12.04 之后的版本可以输入 apt-get install libgtk2.0-0:i386 试试。
    • 2 将 dash 改成 bash
      在终端输入 dpkg-reconfigure dash,选择 no。
    • 3 下载并安装 xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin
      • 交叉编译工具:链接:https://pan.baidu.com/s/1nw4n5bz 密码:d9f5
        下载完成后,将其放到/home/user 目录下,在终端中输入./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin,如果执行失败,先输入 chmod+x xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin,将其转换为可执行程序,再输入./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin。
    • 4 设置环境变量
      在终端中输入 gedit /etc/bash.bashrc 指令打开 bash.bashrc 文件,在末尾增加内容:
export ARCH=arm
export CROSS_COMPILE=arm-xilinx-linux-gnueabi
export PATH=/root/CodeSourcerySourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/:$PATH

并运行 source /etc/bash.bashrc 指令使设置立即生效。通过 echo $PATH 指令可以看到我们刚才设置的路径 arm-xilinx-linux-gnueabi-gcc -v。如果可以打印出交叉编译器的版本信息,说明设置成功了。还可以在终端中输入 arm-xilinx,按下 TAB 键,看看有没有东西出来: arm-xilinx-linux-gnueabi-。
- 5测试交叉编译环境
找个地方新建一个 hello.c 文件,用 gedit 编辑,代码如下:

#include 
int main(void)
{
printf("Hello ZedBoard!\n");
return 0;
}

在 C 文件所在目录下,在终端输入 arm-xilinx-linux-gnueabi-gcc hello.c,然后将生成的可执行文件 hello 文件拷到已经有linux系统的SD卡上。连接串口,板子上电后,打开串口调试工具(如 SecureCRT),等板子自带系统启动之后,(如果未出现出现 zynq>,回车即可),在串口工具中输入:

 mount /dev/mmcblk0p1 /mnt/ 
cd /mnt

可以看到sd卡中的文件
执行hello程序:

./hello

将看到打印了 Hello ZedBoard 。

2 产生linux系统需要的四个文件

  • 四个文件的作用见我的博客。
  • 如何生成这四个文件

    1. 生成Boot.bin需要:
      • 1 u-boot.elf 生成方式见1
      • 2 vivado所生成的描述硬件电路的.bit文件
        和standalone 的电路图一样,注意不要对ps进行裁剪,要开启sd卡
      • 3 xilinx sdk 所生成的FSBL工程文件(.elf格式)
        ( 生成后两者的方式参考2,只是参考,具体block design根据自己需求搭建即可。
        如果是测试则用axidma搭建一个环路即可)
    2. 生成uImage 见3
    3. 生成设备树见4

      • 使用sdk生成设备树时提供了一些参数来配置 kernel command line
        注意bootargs 一项的参数要填console=ttyPS0,115200 root=/dev/ram cma=25M rw earlyprintk 。 其他默认即可。

      • 使用sdk生成数个dtsi文件后,要对 pl.dtsi 文件进行修改,该文件描述的就是pl端的设备。目的是添加字符驱动设备和修改生成的不同通道的device-id。 可以将自动生成的文件与以下修改后的文件对比。

/*

 * CAUTION: This file is automatically generated by Xilinx.

 * Version:  

 * Today is: Fri Jan 12 22:59:25 2018

*/


/ {

    amba_pl: amba_pl {

        #address-cells = <1>;

        #size-cells = <1>;

        compatible = "simple-bus";

        ranges ;

        axi_dma_0: dma@40400000 {

            #dma-cells = <1>;

            compatible = "xlnx,axi-dma-1.00.a";

            interrupt-parent = <&intc>;

            interrupts = <0 29 4 0 30 4>;

            reg = <0x40400000 0x10000>;

            dma-channel@40400000 {

                compatible = "xlnx,axi-dma-mm2s-channel";

                dma-channels = <0x1>;

                interrupts = <0 29 4>;

                xlnx,datawidth = <0x20>;

                xlnx,device-id = <0x0>;

            };
            dma-channel@40400030 {

                compatible = "xlnx,axi-dma-s2mm-channel";

                dma-channels = <0x1>;

                interrupts = <0 30 4>;

                xlnx,datawidth = <0x20>;

                xlnx,device-id = <0x1>;

            };

        };
        axidma_chrdev: axidma_chrdev@0 {

                compatible = "xlnx,axidma-chrdev";

                dmas = <&axi_dma_0 0 &axi_dma_0 1>;

                dma-names = "tx_channel", "rx_channel";

        };
    };
};
  1. 生成uramdisk.image.gz 根文件系统 见5

3 生成驱动文件

  • 具体步骤见5 中的Compilation 部分。
    • 交叉编译器可以不用文档中的 arm-linux-gnueabihf-, 可以用之前搭建的arm-xilinx-linux-gnueabi-
    • 同时可以编译其自带的应用程序用于测试,其中axidma_benchmark是一个简单的回环测试
  • 编译完成后,使用见该文档Running an Application 部分
    • 注意 使用应用程序时,应用程序需要和该工程的动态链接库 libaxidma.so 放在同一目录下

你可能感兴趣的:(zedboard,linux)