📄 inout.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, ®) != 0){
fprintf(stderr, "ioctl IO_READ32 err\n");
close(fd);
return -1;
}
reg.data &= ~mask;
reg.data |= (val & mask);
if(ioctl(fd, IO_WRITE32, ®) != 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 + -