📄 i2s.c
字号:
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, ®) != 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 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 + -