资源简介

ZedBoard的AXI DMA收发独立双线程linux应用程序!有别于之前官方或者其它提供的单次发单次收。该代码包含速度测试,实测传输速率可以达到274MB/s。

资源截图

代码片段和文件信息

/**
 * Proof of concept offloaded memcopy using AXI Direct Memory Access v7.1
 */

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include “dma.h“

int fd;
int cnt;

pthread_mutex_t dma_tx_mutex dma_rx_mutex;
pthread_t dma_tx_id dma_rx_id;

static void dma_tx_thread(void);
static void dma_rx_thread(void);

static void dma_set(unsigned int *dma_virtual_address int offset unsigned int value)
{
    dma_virtual_address[offset >> 2] = value;
}

static unsigned int dma_get(unsigned int *dma_virtual_address int offset)
{
    return dma_virtual_address[offset >> 2];
}

static void dma_s2mm_status(unsigned int *dma_virtual_address)
{
    unsigned int status = dma_get(dma_virtual_address S2MM_STATUS_REGISTER);
    printf(“Stream to memory-mapped status (0x%08x@0x%02x):“ status S2MM_STATUS_REGISTER);
    if (status & 0x00000001)
        printf(“ halted“);
    else
        printf(“ running“);

    if (status & 0x00000002)
        printf(“ idle“);
    if (status & 0x00000008)
        printf(“ SGIncld“);
    if (status & 0x00000010)
        printf(“ DMAIntErr“);
    if (status & 0x00000020)
        printf(“ DMASlvErr“);
    if (status & 0x00000040)
        printf(“ DMADecErr“);
    if (status & 0x00000100)
        printf(“ SGIntErr“);
    if (status & 0x00000200)
        printf(“ SGSlvErr“);
    if (status & 0x00000400)
        printf(“ SGDecErr“);
    if (status & 0x00001000)
        printf(“ IOC_Irq“);
    if (status & 0x00002000)
        printf(“ Dly_Irq“);
    if (status & 0x00004000)
        printf(“ Err_Irq“);
    printf(“\n“);
}

static void dma_mm2s_status(unsigned int *dma_virtual_address)
{
    unsigned int status = dma_get(dma_virtual_address MM2S_STATUS_REGISTER);
    printf(“Memory-mapped to stream status (0x%08x@0x%02x):“ status MM2S_STATUS_REGISTER);
    if (status & 0x00000001)
        printf(“ halted“);
    else
        printf(“ running“);

    if (status & 0x00000002)
        printf(“ idle“);
    if (status & 0x00000008)
        printf(“ SGIncld“);
    if (status & 0x00000010)
        printf(“ DMAIntErr“);
    if (status & 0x00000020)
        printf(“ DMASlvErr“);
    if (status & 0x00000040)
        printf(“ DMADecErr“);
    if (status & 0x00000100)
        printf(“ SGIntErr“);
    if (status & 0x00000200)
        printf(“ SGSlvErr“);
    if (status & 0x00000400)
        printf(“ SGDecErr“);
    if (status & 0x00001000)
        printf(“ IOC_Irq“);
    if (status & 0x00002000)
        printf(“ Dly_Irq“);
    if (status & 0x00004000)
        printf(“ Err_Irq“);
    printf(“\n“);
}

static void dma_mm2s_sync(unsigned int *dma_virtual_address)
{
    unsigned int mm2s_status = dma_get(dma_virtual_address MM2S_STATUS_REGISTER);
    while(!(mm2s_status & 1 << 12) || !(mm2s_status & 1 << 1) ) {
        mm2s_status =  dma_

评论

共有 条评论