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

📄 inout.c

📁 开发板控制,用来控制frv-pdk开发板上的声音信号的采集与输出
💻 C
字号:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <linux/fr400cc_i2s.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/fr400cc_vdc.h>
#include <linux/fr400_io.h>
#include "myhead.h"

#define FPGA_SW_IOC_MAGIC 		0xdc
#define FPGA_SWITCH_READ  		_IOR(FPGA_SW_IOC_MAGIC,0,int)
#define FPGA_LED  			_IOW(FPGA_SW_IOC_MAGIC,1,int)

#define SW5  0x7bff
#define SW7  0x77ff
#define SW8  0x6fff
#define SW9  0x5fff
 
int reg_wt(unsigned , unsigned , unsigned );
void freq_set_pdk2(int , int , int *);
void point( int ,int ,unsigned char *);
int sin_signal(long int ,int );
int square_signal(long int ,int );
int triangle_signal(long int ,int );
int input_signal(long int ,int ,char *);


static short *in=NULL,*out=NULL;

int keyfd,i2sfd,lcdfd;



int main()
{	
	struct fr400i2s_config cfg;
	cfg.channel_n = 1;
	cfg.bit = 16;
	cfg.freq = 48000;
	cfg.exch_lr = 0;
	cfg.buf_unit_sz = 16384;
	cfg.buf_num = 10;
	cfg.out_buf_offset = 327680;
	cfg.out_channel_n = 1;
	cfg.out_bit = -16;
	cfg.out_freq = 48000;
	cfg.out_exch_lr = 0;
	cfg.out_buf_unit_sz = 16384;
	cfg.out_buf_num = 10;
	cfg.fs = 0; cfg.fl = 0; cfg.div = 0;
	cfg.sdmo = 0; cfg.amo = 1;
	cfg.sdmi = 0; cfg.ami = 0;

	//struct fr400vdc_config vdc_cfg={320,240,3,0,320*240*3,1,1,1,{0,320,1,1,1,0,240,1,1,1,0,0,6},1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,3,3,2,1};

	struct fr400vdc_config vdc_cfg;
	int x[13]={0,320,1,1,1,0,240,1,1,1,0,0,6};
	vdc_cfg.pix_x=320;
	vdc_cfg.pix_y=240;
	vdc_cfg.pix_sz=3;
	vdc_cfg.skipbf=0;
	vdc_cfg.buf_unit_sz=320*240*3;
	vdc_cfg.buf_num=1;
	vdc_cfg.stop_immidiate=1;
	vdc_cfg.rd_count_buf_idx=1;
	memcpy(vdc_cfg.prm,x,13*4);
	//cfg.prm[13]={0,320,1,1,1,0,240,1,1,1,0,0,6};
	vdc_cfg.rddl=1;
	vdc_cfg.hls=0;
	vdc_cfg.pal=0;
	vdc_cfg.cscv=0;
	vdc_cfg.dbls=0;
	vdc_cfg.r601=0;
	vdc_cfg.tfop=0;
	vdc_cfg.dsm=0;
	vdc_cfg.dfp=0;
	vdc_cfg.die=1;
	vdc_cfg.enop=0;
	vdc_cfg.vsop=0;
	vdc_cfg.hsop=0;
	vdc_cfg.dsr=0;
	vdc_cfg.csron=0;
	vdc_cfg.dpf=1;
	vdc_cfg.dms=3;
	vdc_cfg.dma_mode=3;
	vdc_cfg.dma_ats=2;
	vdc_cfg.dma_rs=1;

	int key;
	static char *faddr,*addr;
	
	
	keyfd =open("keyled",O_RDONLY);
	if(keyfd<0) printf("Fail to open the device 'keyled'\n");

	i2sfd = open("/dev/fr400cc_i2s", O_RDONLY);
	if(i2sfd<0) printf("Fail to open the device 'fr400cc_i2s'\n");

	lcdfd= open("/dev/fr400cc_vdc",O_RDONLY|O_NONBLOCK);
	if(lcdfd<0) printf("Fail to open the device 'fr400cc_vdc'\n");
	
	ioctl(lcdfd,VDCIOCSCFG,&vdc_cfg);  
//	ioctl(i2sfd, I2SIOCGCFG, &cfg);

	faddr = mmap(NULL, cfg.out_buf_unit_sz*cfg.out_buf_num,PROT_READ | PROT_WRITE, MAP_SHARED, i2sfd, 0);
	in = (short *)faddr;
	out = (short *)(faddr + cfg.out_buf_offset);
	
	addr=(unsigned char *)mmap(NULL,320*240*3,PROT_READ|PROT_WRITE,MAP_FIXED,lcdfd,0);
	bzero(addr,(vdc_cfg.pix_x)*(vdc_cfg.pix_y)*3);

	freq_set_pdk2(cfg.freq, cfg.out_freq, &cfg.div);
	ioctl(i2sfd, I2SIOCSCFG, &cfg);
	
	
	
	while(1)
	{
	sleep(2);
	printf("Please select what you want to do?\n");
	printf("Press SW5 to output 'sin' signal\n ");
	printf("Press SW7 to output 'square' signal\n ");
	printf("Press SW8 to output 'triangle' signal\n ");
	printf("Press SW9 to start inputing a signal\n");
	
	ioctl(keyfd,FPGA_SWITCH_READ,&key);	
	switch (key)
		{
		case SW5:	sin_signal(cfg.buf_unit_sz,cfg.buf_num);break;
		case SW7:	square_signal(cfg.buf_unit_sz,cfg.buf_num);break;
		case SW8: 	triangle_signal(cfg.buf_unit_sz,cfg.buf_num);break;
		case SW9: 	input_signal( cfg.buf_unit_sz,cfg.buf_num,*addr);break;
		default:		printf("INVALID key\n");break;
		}
	}
	close(keyfd);
	close(lcdfd);
	close(i2sfd);
	return 1;
}

static int reg_wt(unsigned addr, unsigned mask, unsigned val)
{
	char *fn;
	int fd;
	struct fr400_io_reg reg;

	fn = "/dev/fr400_io";
	if((fd = open(fn, O_RDWR)) < 0){
	fprintf(stderr, "open err '%s' fd=%d\n",	fn, fd);
	return -1;
	}
	reg.address = addr;
	if(ioctl(fd, IO_READ32, &reg) != 0){
	fprintf(stderr, "ioctl IO_READ32 err\n");
	close(fd);
	return -1;
	}
	reg.data &= ~mask;
	reg.data |= (val & mask);
	if(ioctl(fd, IO_WRITE32, &reg) != 0){
	fprintf(stderr, "ioctl IO_WRITE32 err\n");
	close(fd);
	return -1;
	}
	close(fd);
	return 0;
}

static void freq_set_pdk2(int freq, int out_freq, int *divp)
{
	int fpga;

	if(freq != out_freq)
	{
		fprintf(stderr, "freq=%d out_freq=%d ???\n", freq, out_freq);
		return;
	}
	
	switch(freq)
	{
	case 8000:	fpga = 3;*divp = 0;break;
	case 32000:	fpga = 2;*divp = 1;break;
	case 44100:  	fpga = 1;*divp = 0;break;
	case 48000:   	fpga = 2;*divp = 0;break;
	default:		printf("UNVALID frequency\n"); 
	return;
	}

	if(reg_wt(0x20000030, 0x00000003, fpga) < 0){
		fprintf(stderr, "reg_wt err\n");
	}
}

void point( int a,int b,unsigned char *addr)
{
        *(addr+(320*b+a)*3)=255;
        *(addr+(320*b+a)*3+1)=0;
        *(addr+(320*b+a)*3+2)=0;
}

	int sin_signal(long int buf_unit_sz,int buf_num)
{
	int i;
	for(i=0;i<buf_unit_sz*buf_num/2;i++)
    		out[i]=10000*(1+sin(3.1415927*i*500/48000));
		printf("outputing\n");
	    	ioctl(i2sfd,I2SIOC_OUT_START,0);
	    	getchar();
	    	ioctl(i2sfd,I2SIOC_OUT_STOP,0);
	return 0;
}

	int square_signal(long int buf_unit_sz,int buf_num)
{
	int i,a=0,n=0;
	for(i=0;i<buf_unit_sz*buf_num/2;i++)
		{
		         a=a+1;
		         if (a==100)  { n=1-n; a=0;}
		         if(n==0) out[i]=20000;
		         if(n==1) out[i]=0;
		}
	    printf("outputing\n");
	    ioctl(i2sfd,I2SIOC_OUT_START,0);
	    getchar();
	    ioctl(i2sfd,I2SIOC_OUT_STOP,0);
	return 0;
}

	int triangle_signal(long int buf_unit_sz,int buf_num)
{	
	int i;
	for(i=0;i<buf_unit_sz*buf_num/2;i++)	out[i]=30*(i%500-250);  
		printf("outputing\n");
	    ioctl(i2sfd,I2SIOC_OUT_START,0);
	    getchar();
	    ioctl(i2sfd,I2SIOC_OUT_STOP,0);
	return 0;
}

	int input_signal(long int buf_unit_sz,int buf_num,char *addr)
{		int i,j=1;
		ioctl(lcdfd,VDCIOCSDAT,0);
		ioctl(lcdfd,VDCIOCSTART,0);
		printf("inputing\n");
	        bzero(in,buf_unit_sz*buf_num*2);
	        ioctl(i2sfd,I2SIOCSTART,0);
	        usleep(50000);
	        ioctl(i2sfd,I2SIOCSTOP,0);
	        for(i=0;i<buf_unit_sz*buf_num/2;i++)
		        out[i]=in[i];
	        printf("showing\n");
		background('r');
		for(i=0;i<=32000;i++)
		{
			point(i%320,in[i]/400+100,addr);
			if(i/320>=j)
			{
				sleep(1);
				bzero(addr,320*240*3);
				j++;
			}
		}
		getchar();
}

⌨️ 快捷键说明

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