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

📄 i2s.c

📁 linux 嵌入式原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
static char *opt_list[] = {"-help","through","ch","bit","lr","div","sec","bufsz","ami","amo","gettimeofday-test","double-select-test","slow-save-test","if","o","tmo",#if FREQOPT"freq", "pdk2",#endif#if CFGCHK"v"#endif};static intoptchk_top(int ac, char **av){	int i, j, n, ret;	ret = 0;	n = sizeof(opt_list) / sizeof(opt_list[0]);	for(i=1; i<ac; i++){		if(av[i][0] != '-') continue;		if('0' <= av[i][1] && av[i][1] <= '9') continue;		for(j=0; j<n; j++){			if(strcmp(&av[i][1], opt_list[j]) == 0) break;		}		if(j<n) continue;		fprintf(stderr, "ignore option '%s' ?\n", av[i]);		ret = -1;	}	return ret;}#endif /* OPTCHK */#if FREQOPTstatic intfreq_opt(int ac, char **av){	int i, freq;	if((i = opt_chk(ac,av,"-freq")) == 0) return -1;	if(i + 1 >= ac) return -1;	sscanf(av[i+1], "%d", &freq);	return freq;}static intreg_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 voidfreq_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:		fprintf(stderr, "non support freq=%d (%d %d %d %d)\n",			freq, 8000, 32000, 44100, 48000); 		return;	}	if(reg_wt(0x20000030, 0x00000003, fpga) < 0){		fprintf(stderr, "reg_wt err\n");	}}#endifmain(int ac, char **av){	int fd, x, i, j, n;	void *start;	int length, prot, flags, offset;	unsigned char *area;	unsigned dat1, dat2;	unsigned dat1_bak, dat2_bak;	struct fr400i2s_config cfg;	struct fr400i2s_read inf[100];	fd_set setr;	struct timeval tm, tm_sta, tm_now;	int cnt, rcnt, sec;	int double_select_test;	int ch, bit, lr;	int div;	FILE *rtm_fp;	int run, buf_unit_sz, buf_num;	int ami = 0;	int prm, rev, uflag;	int amo = 0;#if FREQOPT	int freq;#endif#if OPTCHK	if(optchk_top(ac,av) != 0) return -1;#endif#if CFGCHK	verbose = (opt_chk(ac,av, "-v") != 0);#endif#if K480	PCMB=(char*)malloc(sizeof(char)*MB);	if(PCMB == NULL)		exit(-1);#endif	if(opt_chk(ac,av,"--help")){		help();		return 0;	}#if I2S_THROUGH	if(opt_chk(ac, av, "-through")){		if(prm == -1) prm = 0;		return through_work(ac, av);	}#endif	ch = 2;	i = opt_chk(ac,av,"-ch");	if(i!=0 && i+1<ac){		sscanf(av[i+1], "%d", &ch);	}	bit = 8;	i = opt_chk(ac,av,"-bit");	if(i!=0 && i+1<ac){		sscanf(av[i+1], "%d", &bit);	}	lr = (opt_chk(ac,av,"-lr") != 0);	div = -1;	i = opt_chk(ac,av,"-div");	if(i!=0 && i+1<ac){		sscanf(av[i+1], "%d", &div);	}	sec = 10;	i = opt_chk(ac,av,"-sec");	if(i!=0 && i+1<ac){		sscanf(av[i+1], "%d", &sec);	}#if FREQOPT	freq = freq_opt(ac, av);#endif	buf_unit_sz = (16*1024);	i = opt_chk(ac,av,"-bufsz");	if(i!=0 && i+1<ac){		sscanf(av[i+1], "%d", &buf_unit_sz);	}	i = opt_chk(ac,av,"-ami");	if (i != 0 && i+1 < ac)	  sscanf(av[i+1], "%d", &ami);	i = opt_chk(ac,av,"-amo");	if (i != 0 && i+1 < ac)	  sscanf(av[i+1], "%d", &amo);	if(opt_chk(ac,av,"gettimeofday-test")){		struct timeval tms[100];		for(i=0; i<100; i++){			gettimeofday(&tms[i], NULL);		}		for(i=0; i<100; i++){			printf("%d %d\n", tms[i].tv_sec, tms[i].tv_usec);		}		return 0;	}	double_select_test = opt_chk(ac,av,"double-select-test");	add_sleep_save = 0;	i = opt_chk(ac,av,"-slow-save-test");	if(i!=0 && i+1<ac){		sscanf(av[i+1], "%d", &add_sleep_save);	}	/**/	fd = open("/dev/fr400cc_i2s", O_RDONLY);	if(fd < 0){		fprintf(stderr, "fd=%d\n", fd);		return -1;	}	x = ioctl(fd, I2SIOCGCFG, &cfg);	if(x != 0){		fprintf(stderr, "ioctl get cfg x=%d\n", x);		close(fd);		return -1;	}	cfg.channel_n = ch;	cfg.bit = bit;	cfg.exch_lr = lr;	cfg.buf_unit_sz = buf_unit_sz;	switch(cfg.bit){	case -18: 		cfg.sdmi = 5;		cfg.bit = 0;		break;	case -20:		cfg.sdmi = 6;		cfg.bit = 0;		break;	case -24:		cfg.sdmi = 7;		cfg.bit = 0;		break;	}#if K480#if 1	cfg.freq = 48000;#else	cfg.freq = 8000;#endif#endif#if FREQOPT	if(freq != -1) cfg.freq = freq;#endif	cfg.ami = ami;	cfg.amo = amo;	cfg.out_channel_n = ch;	cfg.out_bit = bit;	cfg.out_exch_lr = lr;	cfg.out_buf_unit_sz = buf_unit_sz;	switch(cfg.out_bit){	case -18:		cfg.sdmo = 5;		cfg.out_bit = 0;		break;			case -20:		cfg.sdmo = 6;		cfg.out_bit = 0;		break;	case -24: 		cfg.sdmo = 7;		cfg.out_bit = 0;		break;	}#if FREQOPT	if(freq != -1) cfg.out_freq = freq;	if(opt_chk(ac,av,"-pdk2")){		freq_set_pdk2(cfg.freq, cfg.out_freq, &cfg.div);	}#endif	if(div != -1) cfg.div = div;	print_i2s_config(&cfg);		x = ioctl(fd, I2SIOCSCFG, &cfg);	if(x != 0){		fprintf(stderr, "ioctl set cfg x=%d\n", x);		close(fd);		return -1;	}	x = ioctl(fd, I2SIOCGCFG, &cfg);	if(x != 0){		fprintf(stderr, "ioctl get cfg x=%d\n", x);		close(fd);		return -1;	}	print_i2s_bufinfo(&cfg);	buf_num = cfg.buf_num;	area = mmap_fd(fd, buf_unit_sz, buf_num);	i = opt_chk(ac,av,"-if");	if(i!=0 && i+1<ac){		return out_work(ac, av, i+1, fd, area, &cfg);	}#if CFGCHK	x = ioctl_start(fd, I2SIOCSTART, 0);#else	x = ioctl(fd, I2SIOCSTART, 0);#endif	if(x != 0){		fprintf(stderr, "ioc start x=%d\n", x);		close(fd);		return -1;	}	x = ioctl(fd, I2SIOCGSTATIME, &tm);	fprintf(stderr, "ioc time x=%d %d %d\n",		x, tm.tv_sec, tm.tv_usec);	if(x != 0){		close(fd);		return -1;	}#if I2S_INTR_TEST_OVER	{ 		int i;		for(i=0; i<10; i++){			x = ioctl(fd, I2SIOCTEST, 999);			sleep(1);		}	}#endif	rtm_fp = NULL;	i = opt_chk(ac,av,"-o");	if(i!=0 && i+1<ac){		char *name;		name = av[i+1];		rtm_fp = fopen(name, "w");#if ONMEM		local_fp = rtm_fp;		local_next = local_area;#endif	}	cnt = 0;	gettimeofday(&tm_sta, NULL);		run = 1;	while(run){		FD_ZERO(&setr);		FD_SET(fd, &setr);		x = select(fd+1, &setr, NULL, NULL, NULL);#if 0		fprintf(stderr, "sel x=%d ck=%d\n", x, FD_ISSET(fd, &setr));#endif		if(double_select_test){			FD_ZERO(&setr);			FD_SET(fd, &setr);			x = select(fd+1, &setr, NULL, NULL, NULL);			fprintf(stderr, "sel x=%d ck=%d\n", x, FD_ISSET(fd, &setr));		}#if 0		x = ioctl(fd, I2SIOCGCOUNT, &cnt);		fprintf(stderr, "x=%d cnt=%d\n", x, cnt);#endif				while((x = read(fd, (void*)inf, sizeof(inf))) > 0){#if 0			fprintf(stderr, "(^^)/read timecode x=%d(%d)\n", x, sizeof(inf));#endif			n = x / sizeof(inf[0]);			for(i=0; i<n; i++){#if K480				if(PCMBcount > MB){					run = 0;					break;				}#endif				save_buf(&inf[i], area, buf_unit_sz, buf_num, rtm_fp);#if 0				fprintf(stderr, "Get!! count=%d captime=%d %d\n", 					inf[i].count, 					inf[i].captime.tv_sec,					inf[i].captime.tv_usec);#endif				gettimeofday(&tm_now, NULL);				tm_dif(&tm_now, &tm_sta, &tm_now);				if(tm_now.tv_sec >= sec){					run = 0;					break;				}			}			if(!run) break;		}	}	x = ioctl(fd, I2SIOCSTOP, 0);	if(x != 0){		fprintf(stderr, "ioctl stop x=%d\n", x);	}#if K480	printf("(-_-)/\n");#endif	while((x = read(fd, (void*)inf, sizeof(inf))) > 0){#if K480		printf(" x = %d\n",x);#endif		n = x / sizeof(inf[0]);		for(i=0; i<n; i++){			save_buf(&inf[i], area, buf_unit_sz, buf_num, rtm_fp);#if 1			fprintf(stderr, "Save count=%d captime=%d %d\n", 					inf[i].count, 					inf[i].captime.tv_sec,					inf[i].captime.tv_usec);#endif		}	}	if(rtm_fp != NULL){#if K480		fwrite(PCMB, 1, MB, rtm_fp);#endif#if ONMEM		if(rtm_fp != NULL && rtm_fp == local_fp){			fwrite(local_area, 1, local_next-local_area, local_fp);			local_fp = NULL;		}#endif		fclose(rtm_fp);		rtm_fp = NULL;	}#if I2S_TIMEREC	x = ioctl(fd, I2SIOCTEST, 'T');	fprintf(stderr, "ioctl test 'T' x=%d\n", x);#endif#if I2S_TIMEREC    {	int tmcnt, sz, sz2, i;#if I2S_TIMEREC_2	Tmrec rec;	FILE *fp;#else	Tmrec *tmrecs;#endif	char *name, *cp;	name = "tmrec.dat";	i = opt_chk(ac,av,"-tmo");	if(i!=0 && i+1<ac) name = av[i+1];	x = read(fd, (void*)&tmcnt, 4);	fprintf(stderr, "tmrec cnt=%d\n", tmcnt);#if I2S_TIMEREC_2	sz = sizeof(Tmrec);#else	sz = sizeof(Tmrec) * tmcnt;	tmrecs = malloc(sz);	if(tmrecs == NULL){		fprintf(stderr, "tmrecs == NULL !!\n");		close(fd);		return 0;	}#endif#if I2S_TIMEREC_2    fp = fopen(name, "w");    if(fp == NULL){	fprintf(stderr, "fopen %s err\n", name);	return -1;    }    for(i=0; i<tmcnt; i++){	cp = (char*)&rec;	sz2 = sz;#else	sz2 = sz;	cp = (char*)tmrecs;#endif	while(sz2 > 0){		x = read(fd, cp, sz2);		if(x <= 0){			fprintf(stderr, "tm read ??\n");			break;		}				sz2 -= x;	}#if I2S_TIMEREC_2	x = fwrite(&rec, 1, sz, fp);	if(x < 0){		fprintf(stderr, "tm fwrite x=%d\n", x);		fclose(fp);		return -1;	}    }    fclose(fp);#else	save(name, tmrecs, sz);#endif    }#endif	close(fd);	return 0;}/* EOF */

⌨️ 快捷键说明

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