基于hi3531d的DMA操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mao0514/article/details/84838384
#include <fcntl.h>
#include "sample_comm.h"
#include "sample_comm_ivs.h"


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

char  *g_buffVirAddr;
#define g_BuffPhyAddr 0x81000000
int   buff_fd = -1;
int  buffer_mmap(unsigned int len)
{ 
        int i=0;
        
        buff_fd = open ("/dev/mem", O_RDWR);
        if (buff_fd < 0)
        {
             printf("cannot open /dev/mem.");
             return -1;
        }
        g_buffVirAddr = (char *)mmap(0, len, PROT_READ|PROT_WRITE, MAP_SHARED, buff_fd, g_BuffPhyAddr);   
        if(g_buffVirAddr<0)
        {
            printf("g_buffVirAddr mmap error!\n");
            close(buff_fd);
            return -1;
        }

        for(i=0;i<len;i++)
            *(unsigned char *)(g_buffVirAddr+i) = 0;//i%256;

        return 0;
}



 IVE_SRC_DATA_S stSrc;
    IVE_DST_DATA_S stDst;
    //IVE_DMA_CTRL_S stDmaCtrl;
    IVE_DMA_CTRL_S stDmaCtrl = { IVE_DMA_MODE_DIRECT_COPY, 0};
    HI_BOOL bInstant = HI_FALSE;
    IVE_HANDLE IveHandle;
    HI_BOOL bFinish, bBlock=HI_TRUE;

     
    //DMA init
    SAMPLE_COMM_IVE_CheckIveMpiInit();
    mem_addr(&buffer_x, phy_addr_x);
    mem_addr(&buffer_y, phy_addr_y);
	stSrc.u32PhyAddr = phy_addr_x;
	stSrc.pu8VirAddr = buffer_x;
	stSrc.u16Stride = 1024;
	stSrc.u16Height = 1024;    
	stSrc.u16Width = 1024;

	stDst.u32PhyAddr = phy_addr_y;
	stDst.pu8VirAddr = buffer_y;
	stDst.u16Stride = 1024;
	stDst.u16Height = 1024;
	stDst.u16Width = 1024;
	bInstant = HI_TRUE;

  for(i=0;i<stSrc.u16Height * stSrc.u16Stride;i++)
       buffer_x[i] = i%256;

	memset(buffer_y,0, stDst.u16Height * stDst.u16Stride);


/////////////////////////////////////////////////////////
	s32Ret = HI_MPI_IVE_DMA(&IveHandle, &stSrc, &stDst, &stDmaCtrl, bInstant);
	if(HI_SUCCESS!=s32Ret)
	{
		printf("IVE DMA error!\n");
		return s32Ret;
	}
        s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock);	
	while(HI_ERR_IVE_QUERY_TIMEOUT == s32Ret)
	{
		//usleep(100);					
		s32Ret = HI_MPI_IVE_Query(IveHandle,&bFinish,bBlock);	
	}
 }
#makefile文件,修改自sample_enc例子
# Hisilicon Hi35xx sample Makefile

include ../Makefile.param
#ifeq ($(SAMPLE_PARAM_FILE), )
#     SAMPLE_PARAM_FILE:=../Makefile.param
#     include $(SAMPLE_PARAM_FILE)
#endif

# target source
SRC  := $(wildcard *.c) 
OBJ  := $(SRC:%.c=%.o)

TARGET := $(OBJ:%.o=%)
.PHONY : clean all


CPPFLAGS   := $(shell $(PYLON_ROOT)/bin/pylon-config --cflags)
CXXFLAGS   := #e.g., CXXFLAGS=-g -O0 for debugging
LDFLAGS    := $(shell $(PYLON_ROOT)/bin/pylon-config --libs-rpath)
LDLIBS     := $(shell $(PYLON_ROOT)/bin/pylon-config --libs)



CC        :=arm-hisiv600-linux-gcc
LD         := $(CC)
all: $(TARGET)

MPI_LIBS := $(REL_LIB)/libmpi.a
MPI_LIBS += $(REL_LIB)/libhdmi.a
IVE_LIBS := $(REL_LIB)/libive.a
IVE_LIBS += $(REL_LIB)/libmd.a


$(TARGET):%:%.o $(COMM_OBJ)
	$(CC) $(CFLAGS)  $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -lpthread -lm -L. -ltest -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA)  $(JPEGD_LIBA) $(IVE_LIBS) $(LDLIBS)  -lstdc++

clean:
	@rm -f $(TARGET)
	@rm -f $(OBJ)
	@rm -f $(COMM_OBJ)

cleanstream:
	@rm -f *.h264
	@rm -f *.jpg
	@rm -f *.mjp
	@rm -f *.mp4

代码下载:https://download.csdn.net/download/mao0514/10830379

猜你喜欢

转载自blog.csdn.net/mao0514/article/details/84838384