⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s3c2410_app.c

📁 自己写的支持S3C2410下的实时DMA操作的linux平台驱动程序 功能完善
💻 C
字号:
/*
****************************************Copyright (c)**************************************************
**------------------------------------- File Info ------------------------------------------------------
** File name:           s3c2410_app.c
** Last modified Date:  2007-10-13
** Last Version:        1.3
** Descriptions:        Driver DMA transition on S3C2410 Application Code
**------------------------------------------------------------------------------------------------------
** Created by:          Chenzhaoyang
** Created date:        2007-10-19
** Version:             1.6
** Descriptions:        Preliminary version.
**
** NOTE:	// 设计思路:
**	读写 各建立两个PINGPANG BUFFER
**	循环查询RUNMODE状态,确定读写
**	非阻塞式write;若当前不能写,返回-1;
	通过ioctl(fd,0,0)查询写缓冲0状态;ioctl(fd,1,0)查询写缓冲1状态
	交替0,1写
	通过ioctl(fd,8,0)终止DMA操作
********************************************************************************************************
*/
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>

#include <string.h>
#include <stdlib.h>

#include <sys/ioctl.h>

#include <malloc.h>

#define S3C2410DEVICE "/dev/s3c2410DMA-DRIVER"
#define USER_BUFF_NUMBER 2//0,1 in;2,out
#define BUFSIZE (256*4)
#define BUFFSIZE_PAGE (1<<12)
#define DMA_WRITE0 0
#define DMA_WRITE1 1
#define DMA_CHECK_RUNMODE 5
#define DMA_DSTAT0 6
#define DMA_CHECK_ON 7
#define DMA_SET_STOP 8
#define DMA_SET_READ 9
#define TEST_TIMES 20
int cur_read_ref = 0;
int cur_write_ref = 1;
typedef struct
{
	int size;		/* buffer size */
	int valid_size;
	int num;
	int active[2];
	char *start;
	char *curr_pos;
} user_buf_t;
user_buf_t user_buffs_in[USER_BUFF_NUMBER];
user_buf_t user_buffs_out[USER_BUFF_NUMBER];
	int fd ;
int  user_buff_initialize(user_buf_t *user_buffs,int size,int num)
{	
	user_buf_t *up = user_buffs;
	up ->size = size;
	up ->start =(char *) malloc(size);
	if (!up ->start)
		goto err;
	memset(up ->start,0,size);
	up->num = num;
	up->active[num] = 0;
	up->valid_size = 0;
	return 0;
err:
	puts(": unable to allocate dma memory\n ");
	return -1;
}
void user_buff_initialize_all()
{
	int i = 0;
	for (;i < USER_BUFF_NUMBER;i ++)
	{
		user_buff_initialize(&user_buffs_in[i],BUFFSIZE_PAGE<<3,i);
		user_buff_initialize(&user_buffs_out[i],BUFFSIZE_PAGE<<3,i);
	}
		return ;
}
void free_usr_buffers()
{
	int i = USER_BUFF_NUMBER;
	while(i -- )
	{
	memset(user_buffs_in[i].start,0,user_buffs_in[i].size);
	free(user_buffs_in[i].start);
	user_buffs_in[i].start = NULL;
	
	memset(user_buffs_out[i].start,0,user_buffs_out[i].size);
	free(user_buffs_out[i].start);
	user_buffs_out[i].start = NULL;
	}	
		return ;
}
void read_test_print(char *buff)
{
		int i =0;
		 char * buf_temp = buff;
		while(i < 20)
		{
			printf(".%x.",*(buf_temp));
			buf_temp ++;
			i++;
	    	}
		printf("\nRead finish Test --%d--\n",(cur_read_ref)%USER_BUFF_NUMBER);
			return ;
}
void write_test_print(char *buff)
{
	int  i = 0;
	char *buf_temp = buff;
	while(i < 20)
		{
			printf(".%x.",*(buf_temp));
			buf_temp ++;
			i++;
	    	}
	printf("write first finished buffer--%d.\n",(cur_write_ref)%USER_BUFF_NUMBER);
		return ;

}
void dma_write(int write_cnt)//wait for write finished
{
	user_buf_t *buff_out = &user_buffs_out[(cur_write_ref)%USER_BUFF_NUMBER];
	puts("Write__USER\n");
	while(write(fd,(char *)buff_out,write_cnt) <0);
	while(ioctl(fd,(cur_write_ref)%USER_BUFF_NUMBER,0));
	 write_test_print(buff_out->start);
	  	cur_write_ref++;
	 puts("write end\n");
	 	return ;
}
void dma_read(int read_cnt)//wait for read finished
{
	user_buf_t *buff_in = &user_buffs_in[cur_read_ref++%USER_BUFF_NUMBER];
	puts("READ__USER\n");
	ioctl(fd,DMA_SET_READ,0);//换成读模式
	while(read(fd,buff_in->start,read_cnt)<1);//get from DMA
	read_test_print(buff_in->start);
	cur_read_ref++;
	return ;
}
/********************main**********************************/
int main(int argc,char **argv)
{
	/*user_buf_t buff_out ;
	user_buf_t buff_in;
	int ext_num,err,i;
	char *buff_temp;
	*******************/
	user_buff_initialize_all();
	fd = open(S3C2410DEVICE,O_RDWR);//important
	if (fd < 0)
	{
		perror("Failed to open s3c2410DMA-DRIVER");
		exit(1);
	}
	
	while(1)
	{
	if(ioctl(fd,DMA_CHECK_RUNMODE,0))
			dma_write(BUFFSIZE_PAGE);
	else
			dma_read(BUFFSIZE_PAGE);
	}
	printf("\nFree User Spcace Memrybuff\n");
	free_usr_buffers();
	printf("Close device : %s\n",S3C2410DEVICE);
	close(fd);
	return 0;
}
/********************写测试*************************
cur_write_ref = 0;
while(cur_write_ref<TEST_TIMES)
	{
	printf("----%d----\n",cur_write_ref);
	buff_out = &user_buffs_out[(cur_write_ref)%USER_BUFF_NUMBER];
	while(write(fd,(char *)buff_out,BUFFSIZE_PAGE) <0);
	//while(ioctl(fd,(cur_write_ref)%USER_BUFF_NUMBER,0));
	//printf("write first finished %d \n",(cur_write_ref)%USER_BUFF_NUMBER);
		cur_write_ref++;
	buff_out = &user_buffs_out[(cur_write_ref)%USER_BUFF_NUMBER];
	while( write(fd,(char *)buff_out,BUFFSIZE_PAGE) < 0);
	while(ioctl(fd,(cur_write_ref)%USER_BUFF_NUMBER,0));
		    buf_temp = buff_out->start;
	    i = 0;
	while(i < 20)
		{
			printf(".%x.",*(buf_temp));
			buf_temp ++;
			i++;
	    	}
	printf("write first finished %d \n",(cur_write_ref)%USER_BUFF_NUMBER);
	cur_write_ref++;
}
********************读测试*************************
	ioctl(fd,DMA_SET_READ,0);//换成读模式
	ext_num = TEST_TIMES;
	while(ext_num)
	{
		err = read(fd,buff_in->start,BUFFSIZE_PAGE);//get from DMA
		if (err<1)
			continue;
		i=0;
	    buf_temp = buff_in->start;
		while(i < 20)
		{
			printf(".%x.",*(buf_temp));
			buf_temp ++;
			i++;
	    	}
		buff_in = &user_buffs_in[cur_read_ref++%USER_BUFF_NUMBER];
		printf("\nRead Test --%d--\n",ext_num);
		ext_num--;
	
/************写测试***********************************
	cur_write_ref = 0;
	while(cur_write_ref<TEST_TIMES)
	{printf("----%d----\n",cur_write_ref);
	buff_out = &user_buffs_out[(cur_write_ref)%USER_BUFF_NUMBER];
	while(write(fd,(char *)buff_out,BUFFSIZE_PAGE) <0);
	cur_write_ref++;//write starts
	buff_out = &user_buffs_out[(cur_write_ref)%USER_BUFF_NUMBER];
	while( write(fd,(char *)buff_out,BUFFSIZE_PAGE) < 0);
	while(ioctl(fd,(cur_write_ref)%USER_BUFF_NUMBER,0));//write starts
		    buf_temp = buff_out->start;
	i = 0;
	while(i < 20)
		{
			printf(".%x.",*(buf_temp));
			buf_temp ++;
			i++;
	    	}
	printf("write first finished %d \n",(cur_write_ref)%USER_BUFF_NUMBER);

	cur_write_ref++;
}
/********************读测试*************************
	ioctl(fd,DMA_SET_READ,0);//换成读模式
	ext_num = TEST_TIMES;
	while(ext_num)
	{
		err = read(fd,buff_in->start,BUFFSIZE_PAGE);//get from DMA
		if (err<1)
			continue;
		i=0;
	    buf_temp = buff_in->start;
		while(i < 20)
		{
			printf(".%x.",*(buf_temp));
			buf_temp ++;
			i++;
	    	}
		buff_in = &user_buffs_in[cur_read_ref++%USER_BUFF_NUMBER];
		printf("\nRead Test --%d--\n",ext_num);
		ext_num--;
	}
/******************************End********************************/


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -