ZYNQ MPSoc 多DMA传输实例

使用环境:Vivado 2020.1,Vitis 2020.1

使用开发板:ZYNQ MPSoc 15EG

Demo 

Vivado 工程 双DMA回环

Vivado实例

 开启SG模式,双DMA控制器,开启四个中断。

Vivado工程并无太多设计问题,根据国产开发板的DMA回环工程稍加修改即可。

驱动设计:

驱动采用GitHub公开的版本修改而来。

驱动设备树修改代码如下:

/include/ "system-conf.dtsi"
/ {
};

/* SD */
&sdhci0 {
	disable-wp;
	no-1-8-v;
};

/* USB */
&dwc3_0 {
	status = "okay";
	dr_mode = "host";
};

&amba_pl {
    axidma_chrdev: axidma_chrdev@0 {
            compatible = "xlnx,axidma-chrdev";
            dmas = <&axi_dma_0 0 &axi_dma_0 1 &axi_dma_1 0 &axi_dma_1 1>;
            dma-names = "tx_channel", "rx_channel", "tx_channel1", "rx_channel1";
    };
};
 
&axi_dma_0 {
    dma-channel@80000000 {
        xlnx,device-id = <0x0>;
    };
    dma-channel@80000030 {
        xlnx,device-id = <0x1>;
    };
};

&axi_dma_1 {
    dma-channel@80010000 {
        xlnx,device-id = <0x2>;
    };
    dma-channel@80010030 {
        xlnx,device-id = <0x3>;
    };
};

应用层代码实现

1 多DMA使用共同初始函数

    axidma_dev = axidma_init();

2 分配多DMA传输Buffer空间

    // Map memory regions for the transmit and receive buffers
    tx_buf = axidma_malloc(axidma_dev, tx_size/2);
    if (tx_buf == NULL) {
        perror("Unable to allocate transmit buffer from the AXI DMA device.");
        rc = -1;
        goto destroy_axidma;
    }
    rx_buf = axidma_malloc(axidma_dev, rx_size/2);
    if (rx_buf == NULL) {
        perror("Unable to allocate receive buffer from the AXI DMA device");
        rc = -1;
        goto free_tx_buf;
    }



    // Map memory regions for the transmit and receive buffers
    tx_buf2 = axidma_malloc(axidma_dev, tx_size/2);
    if (tx_buf2 == NULL) {
        perror("Unable to allocate transmit buffer from the AXI DMA device.");
        rc = -1;
        goto destroy_axidma;
    }
    rx_buf2 = axidma_malloc(axidma_dev, rx_size/2);
    if (rx_buf2 == NULL) {
        perror("Unable to allocate receive buffer from the AXI DMA device");
        rc = -1;
        goto free_tx_buf;
    }

3 分配通道数

    tx_chans = axidma_get_dma_tx(axidma_dev);
    rx_chans = axidma_get_dma_rx(axidma_dev);

4 进行传输

    rc = axidma_oneway_transfer(axidma_dev, tx_channel, tx_buf, tx_size/2,false);
    if (rc < 0) {
        return rc;
    }


    rc = axidma_oneway_transfer(axidma_dev, tx_channel2, tx_buf2, tx_size/2,false);
    if (rc < 0) {
        return rc;
    }
    //sleep(3);
    rc = axidma_oneway_transfer(axidma_dev, rx_channel, rx_buf, rx_size/2,true);
    if (rc < 0) {
        return rc;
    }


    rc = axidma_oneway_transfer(axidma_dev, rx_channel2, rx_buf2, rx_size/2,false);
    if (rc < 0) {
        return rc;
    }

最后测试结果如下

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
《01米联客2020版Zynq MPSOC SDK篇-20210527》是一篇关于2020版Zynq MPSOC SDK的技术文档。该文档主要介绍了使用Zynq MPSOC SDK开发软件的基本流程和步骤。 文档首先简要介绍了Zynq MPSOC SDK的特点和功能,指出该软件开发套件可以为Zynq MPSOC芯片提供全面的软件开发环境,并支持多种编程语言开发工具。 接着,文档详细介绍了Zynq MPSOC SDK的安装和配置过程。首先需要准备好开发环境和相关工具,然后按照文档提供的步骤进行安装和配置。文档给出了详细的图文说明,使读者可以轻松地完成这些操作。 在安装和配置完成后,文档介绍了使用Zynq MPSOC SDK进行软件开发的基本流程。首先,需要创建一个新的工程,并选择适合的模板。然后,可以根据实际需求,添加所需的库文件和驱动程序。接下来,可以编写和调试代码,并使用MPSOC SDK提供的调试工具进行调试。 文档还介绍了Zynq MPSOC SDK的一些高级功能,如使用硬件抽象层(HAL)进行底层驱动开发,以及使用RTOS进行多线程开发等。这些功能可以帮助开发者更好地利用Zynq MPSOC芯片的强大性能和功能。 总的来说,《01米联客2020版Zynq MPSOC SDK篇-20210527》是一篇系统介绍了2020版Zynq MPSOC SDK的技术文档。通过阅读该文档,读者可以全面了解并掌握使用Zynq MPSOC SDK进行软件开发的方法和技巧,帮助他们更高效地进行嵌入式软件开发工作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值