資源簡介
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_
評論
共有 條評論