📄 s3c2410_app.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 + -