嵌入式专题: S5PV210 - s3c-mem设备节点的使用

/dev/s3c-mem这个设备节点,就是用来提供物理内存的,因为像FIMC这种设备的接口是需要物理地址的。。。反正这个平台就是号称什么硬件都有,但用起来都特别麻烦。

 

#ifndef _S3C_MEM_H
#define _S3C_MEM_H

#include <stdint.h>
#include <sys/ioctl.h>

#include "s3c_mem.h"

class S3CMem
{
public:
	int open();
	void close();

	int aquire(s3c_mem_alloc* m);
	void release(s3c_mem_alloc* m);

	// 可能是要求物理地址
	int dmacopy(void* dest, void* src, int size);

private:
	int m_fd;	
};





#endif

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>

#include "S3CMem.h"

int S3CMem::open()
{
	m_fd = ::open("/dev/s3c-mem", O_RDWR);
	if(m_fd < 0)
	{
		printf("failed to open s3c-mem !\n");
		return -1;
	}
	return 0;
}

void S3CMem::close()
{
	::close(m_fd);
}

int S3CMem::aquire(s3c_mem_alloc* m)
{
	m->phy_addr = m->vir_addr = 0;
	int ret = ioctl(m_fd, S3C_MEM_ALLOC, m);
	if(ret < 0)
	{
		return -1;
	}
	return 0;
}

void S3CMem::release(s3c_mem_alloc* m)
{
	int ret = ioctl(m_fd, S3C_MEM_FREE, m);
	m->phy_addr = m->vir_addr = 0;
}

int S3CMem::dmacopy(void* dest, void* src, int size)
{
	s3c_mem_dma_param p;
	p.size = size;
	p.src_addr = (unsigned int)src;
	p.dst_addr = (unsigned int)dest;
	p.cfg = 0;

	int ret = ioctl(m_fd, S3C_MEM_DMA_COPY, &p);
	if(ret != 0)
		return -1;

	return 0;
}



 

 

你可能感兴趣的:(嵌入式专题: S5PV210 - s3c-mem设备节点的使用)