📄 dvbtune.c
字号:
seclen+=3;// printf("Read %d bytes\n",seclen); // for (i=0;i<seclen+3;i++) { printf("%02x ",buf[i]); }/* for (i=0;i< seclen;i++) { printf("%02x ",buf[i]); if ((i % 16)==15) { printf(" "); for (j=i-15;j<=i;j++) { printf("%c",((buf[j]>31) && (buf[j]<=127)) ? buf[j] : '.'); } printf("\n"); } }*/ max_k=buf[7]+1; // last_sec_num - read this many (+1) sections i=11; while (i < (seclen-4)) { service_id=(buf[i]<<8)|buf[i+1]; i+=2; i++; // Skip a field ca=(buf[i]&0x10)>>4; loop_length=((buf[i]&0x0f)<<8)|buf[i+1]; printf("<service id=\"%d\" ca=\"%d\">\n",service_id,ca); i+=2; parse_descriptors(loop_length,&buf[i]); i+=loop_length; scan_pmt(get_pmt_pid(service_id),service_id,(service_id==pnr)); printf("</service>\n"); } } else { printf("Under-read bytes for SDT - wanted %d, got %d\n",seclen,n); } } else { fprintf(stderr,"Nothing to read from fd_sdt\n"); }}// printf("</sdt>\n"); close(fd_sdt);}int FEReadBER(int fd, uint32_t *ber){ int ans; if ( (ans = ioctl(fd,FE_READ_BER, ber) < 0)){ perror("FE READ_BER: "); return -1; } return 0;}int FEReadSignalStrength(int fd, int32_t *strength){ int ans; if ( (ans = ioctl(fd,FE_READ_SIGNAL_STRENGTH, strength) < 0)){ perror("FE READ SIGNAL STRENGTH: "); return -1; } return 0;}int FEReadSNR(int fd, int32_t *snr){ int ans; if ( (ans = ioctl(fd,FE_READ_SNR, snr) < 0)){ perror("FE READ_SNR: "); return -1; } return 0;}#if 0int FEReadAFC(int fd, int32_t *snr){ int ans; if ( (ans = ioctl(fd,FE_READ_AFC, snr) < 0)){ perror("FE READ_AFC: "); return -1; } return 0;}#endifint FEReadUncorrectedBlocks(int fd, uint32_t *ucb){ int ans; if ( (ans = ioctl(fd,FE_READ_UNCORRECTED_BLOCKS, ucb) < 0)){ perror("FE READ UNCORRECTED BLOCKS: "); return -1; } return 0;}int main(int argc, char **argv){ int fd_frontend=0; int fd_sec=0; int fd_dvr=0; int do_info=0; int do_scan=0; int do_monitor=0; unsigned int freq=0; char pol=0; unsigned int srate=0; unsigned int diseqc = 0; int ttpid=0; int dpid=0; fe_modulation_t modulation=CONSTELLATION_DEFAULT; fe_transmit_mode_t TransmissionMode=TRANSMISSION_MODE_DEFAULT; fe_bandwidth_t bandWidth=BANDWIDTH_DEFAULT; fe_guard_interval_t guardInterval=GUARD_INTERVAL_DEFAULT; fe_code_rate_t HP_CodeRate=HP_CODERATE_DEFAULT; int count; transponder_t * t; int i; if (argc==1) { fprintf(stderr,"Usage: dvbtune [OPTIONS]\n\n"); fprintf(stderr,"Standard options:\n\n"); fprintf(stderr,"-f freq absolute Frequency (DVB-S in Hz or DVB-T in Hz)\n"); fprintf(stderr," or L-band Frequency (DVB-S in Hz or DVB-T in Hz)\n"); fprintf(stderr,"-p [H,V] Polarity (DVB-S only)\n"); fprintf(stderr,"-s N Symbol rate (DVB-S or DVB-C)\n"); fprintf(stderr,"-v vpid Decode video PID (full cards only)\n"); fprintf(stderr,"-a apid Decode audio PID (full cards only)\n"); fprintf(stderr,"-t ttpid Decode teletext PID (full cards only)\n"); fprintf(stderr,"-pnr N Tune to Program Number (aka service) N\n\n"); fprintf(stderr,"-i Dump SI information as XML\n"); fprintf(stderr,"\nAdvanced tuning options:\n\n"); fprintf(stderr,"-c [0-3] Use DVB card #[0-3]\n"); fprintf(stderr,"-tone [0|1] 0=22kHz off, 1=22kHz on\n"); fprintf(stderr,"-I [0|1|2] 0=Spectrum Inversion off, 1=Spectrum Inversion on, 2=auto\n"); fprintf(stderr,"-D [0-4] DiSEqC command (0=none)\n\n"); fprintf(stderr,"-qam X DVB-T modulation - 16%s, 32%s, 64%s, 128%s or 256%s\n",(CONSTELLATION_DEFAULT==QAM_16 ? " (default)" : ""),(CONSTELLATION_DEFAULT==QAM_32 ? " (default)" : ""),(CONSTELLATION_DEFAULT==QAM_64 ? " (default)" : ""),(CONSTELLATION_DEFAULT==QAM_128 ? " (default)" : ""),(CONSTELLATION_DEFAULT==QAM_256 ? " (default)" : "")); fprintf(stderr,"-gi N DVB-T guard interval 1_N (N=32%s, 16%s, 8%s or 4%s)\n",(GUARD_INTERVAL_DEFAULT==GUARD_INTERVAL_1_32 ? " (default)" : ""),(GUARD_INTERVAL_DEFAULT==GUARD_INTERVAL_1_16 ? " (default)" : ""),(GUARD_INTERVAL_DEFAULT==GUARD_INTERVAL_1_8 ? " (default)" : ""),(GUARD_INTERVAL_DEFAULT==GUARD_INTERVAL_1_4 ? " (default)" : "")); fprintf(stderr,"-cr N DVB-T code rate. N=AUTO%s, 1_2%s, 2_3%s, 3_4%s, 5_6%s, 7_8%s\n",(HP_CODERATE_DEFAULT==FEC_AUTO ? " (default)" : ""),(HP_CODERATE_DEFAULT==FEC_1_2 ? " (default)" : ""),(HP_CODERATE_DEFAULT==FEC_2_3 ? " (default)" : ""),(HP_CODERATE_DEFAULT==FEC_3_4 ? " (default)" : ""),(HP_CODERATE_DEFAULT==FEC_5_6 ? " (default)" : ""),(HP_CODERATE_DEFAULT==FEC_7_8 ? " (default)" : "")); fprintf(stderr,"-bw N DVB-T bandwidth (Mhz) - N=6%s, 7%s or 8%s\n",(BANDWIDTH_DEFAULT==BANDWIDTH_6_MHZ ? " (default)" : ""),(BANDWIDTH_DEFAULT==BANDWIDTH_7_MHZ ? " (default)" : ""),(BANDWIDTH_DEFAULT==BANDWIDTH_8_MHZ ? " (default)" : "")); fprintf(stderr,"-tm N DVB-T transmission mode - N=2%s or 8%s\n",(TRANSMISSION_MODE_DEFAULT==TRANSMISSION_MODE_2K ? " (default)" : ""),(TRANSMISSION_MODE_DEFAULT==TRANSMISSION_MODE_8K ? " (default)" : "")); fprintf(stderr,"-x Attempt to auto-find other transponders (experimental - DVB-S only)\n"); fprintf(stderr,"-m Monitor the reception quality\n"); fprintf(stderr,"-n dpid Add network interface and receive MPE on PID dpid\n"); fprintf(stderr,"\n"); return(-1); } else { count=0; for (i=1;i<argc;i++) { if (strcmp(argv[i],"-f")==0) { i++; freq=atoi(argv[i]); } else if (strcmp(argv[i],"-i")==0) { // do_info=1; } else if (strcmp(argv[i],"-m")==0) { // do_monitor=1; } else if (strcmp(argv[i],"-n")==0) { // i++; dpid=atoi(argv[i]); } else if (strcmp(argv[i],"-c")==0) { // i++; card=atoi(argv[i]); if ((card < 0) || (card > 3)) { fprintf(stderr,"card must be between 0 and 3\n"); exit(-1); } } else if (strcmp(argv[i],"-x")==0) { // do_scan=1; } else if (strcmp(argv[i],"-v")==0) { i++; vpid=atoi(argv[i]); } else if (strcmp(argv[i],"-pnr")==0) { i++; pnr=atoi(argv[i]); do_info=1; } else if (strcmp(argv[i],"-a")==0) { i++; apid=atoi(argv[i]); } else if (strcmp(argv[i],"-t")==0) { i++; ttpid=atoi(argv[i]); } else if (strcmp(argv[i],"-p")==0) { i++; if (argv[i][1]==0) { if (tolower(argv[i][0])=='v') { pol='V'; } else if (tolower(argv[i][0])=='h') { pol='H'; } else if (tolower(argv[i][0])=='l') { pol='L'; } else if (tolower(argv[i][0])=='r') { pol='R'; } } } else if (strcmp(argv[i],"-s")==0) { i++; srate=atoi(argv[i])*1000UL; } else if (strcmp(argv[i],"-qam")==0) { i++; switch(atoi(argv[i])) { case 16: modulation=QAM_16; break; case 32: modulation=QAM_32; break; case 64: modulation=QAM_64; break; case 128: modulation=QAM_128; break; case 256: modulation=QAM_256; break; default: fprintf(stderr,"Invalid QAM rate: %s\n",argv[i]); exit(0); } } else if (strcmp(argv[i],"-gi")==0) { i++; switch(atoi(argv[i])) { case 32: guardInterval=GUARD_INTERVAL_1_32; break; case 16: guardInterval=GUARD_INTERVAL_1_16; break; case 8: guardInterval=GUARD_INTERVAL_1_8; break; case 4: guardInterval=GUARD_INTERVAL_1_4; break; default: fprintf(stderr,"Invalid Guard Interval: %s\n",argv[i]); exit(0); } } else if (strcmp(argv[i],"-tm")==0) { i++; switch(atoi(argv[i])) { case 8: TransmissionMode=TRANSMISSION_MODE_8K; break; case 2: TransmissionMode=TRANSMISSION_MODE_2K; break; default: fprintf(stderr,"Invalid Transmission Mode: %s\n",argv[i]); exit(0); } } else if (strcmp(argv[i],"-bw")==0) { i++; switch(atoi(argv[i])) { case 8: bandWidth=BANDWIDTH_8_MHZ; break; case 7: bandWidth=BANDWIDTH_7_MHZ; break; case 6: bandWidth=BANDWIDTH_6_MHZ; break; default: fprintf(stderr,"Invalid DVB-T bandwidth: %s\n",argv[i]); exit(0); } } else if (strcmp(argv[i],"-cr")==0) { i++; if (!strcmp(argv[i],"AUTO")) { HP_CodeRate=FEC_AUTO; } else if (!strcmp(argv[i],"1_2")) { HP_CodeRate=FEC_1_2; } else if (!strcmp(argv[i],"2_3")) { HP_CodeRate=FEC_2_3; } else if (!strcmp(argv[i],"3_4")) { HP_CodeRate=FEC_3_4; } else if (!strcmp(argv[i],"5_6")) { HP_CodeRate=FEC_5_6; } else if (!strcmp(argv[i],"7_8")) { HP_CodeRate=FEC_7_8; } else { fprintf(stderr,"Invalid Code Rate: %s\n",argv[i]); exit(0); } } else if (strcmp(argv[i],"-D")==0) { i++; diseqc=atoi(argv[i]); if (diseqc > 4) { fprintf(stderr,"DiSEqC must be between 0 and 4\n"); exit(-1); } } else if (strcmp(argv[i],"-tone")==0) { i++; if (atoi(argv[i])==0) tone = SEC_TONE_OFF; else tone = SEC_TONE_ON; } else if (strcmp(argv[i],"-I")==0) { i++; if (atoi(argv[i])==0) specInv = INVERSION_OFF; else if (atoi(argv[i])==1) specInv = INVERSION_ON; else specInv = INVERSION_AUTO; } } }#if 0 if (!((freq > 100000000) || ((freq > 0) && (pol!=0) && (srate!=0)))) { fprintf(stderr,"Invalid parameters\n"); exit(-1); }#endif if((fd_dvr = open(dvrdev[card],O_RDONLY|O_NONBLOCK)) < 0){ fprintf(stderr,"FD %d: ",i); perror("fd_dvr DEMUX DEVICE: "); return -1; } if((fd_frontend = open(frontenddev[card],O_RDWR)) < 0){ fprintf(stderr,"frontend: %d",i); perror("FRONTEND DEVICE: "); return -1; }#ifndef NEWSTRUCT /* Only open sec for DVB-S tuning */ if (freq<100000000) { if((fd_sec = open(secdev[card],O_RDWR)) < 0) { fprintf(stderr,"FD %i: ",i); perror("SEC DEVICE (warning) "); } }#endif if((fd_demuxrec = open(demuxdev[card],O_RDWR|O_NONBLOCK)) < 0){ fprintf(stderr,"FD %i: ",i); perror("DEMUX DEVICE: "); return -1; } if((fd_demuxv = open(demuxdev[card],O_RDWR)) < 0){ fprintf(stderr,"FD %i: ",i); perror("DEMUX DEVICE: "); return -1; } if((fd_demuxa = open(demuxdev[card],O_RDWR)) < 0){ fprintf(stderr,"FD %i: ",i); perror("DEMUX DEVICE: "); return -1; } if((fd_demuxtt = open(demuxdev[card],O_RDWR)) < 0){ fprintf(stderr,"FD %i: ",i); perror("DEMUX DEVICE: "); return -1; } if((fd_demuxd = open(demuxdev[card],O_RDWR)) < 0){ fprintf(stderr,"FD %i: ",i); perror("DEMUX DEVICE: "); return -1; } if((fd_demuxsi = open(demuxdev[card],O_RDWR|O_NONBLOCK)) < 0){ fprintf(stderr,"FD %i: ",i); perror("DEMUX DEVICE: "); return -1; } if (freq > 0) { /* Stop the hardware filters */ set_apid(0); set_vpid(0); set_ttpid(0); if (tune_it(fd_frontend,fd_sec,freq,srate,pol,tone,specInv,diseqc,modulation,HP_CodeRate,TransmissionMode,guardInterval,bandWidth) < 0) { return -1; } } if (do_scan) { printf("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<satellite>\n"); scan_nit(0x40); /* Get initial list of transponders */ scan_nit(0x41); /* Get initial list of transponders */ while ((t=get_unscanned(transponders))!=NULL) { free_pat_list(); fprintf(stderr,"Scanning %d%c %d\n",t->freq,t->pol,t->srate); tune_it(fd_frontend,fd_sec,t->freq,t->srate,t->pol,tone,specInv,0,modulation,HP_CodeRate,TransmissionMode,guardInterval,bandWidth); printf("<transponder id=\"%d\" onid=\"%d\" freq=\"%05d\" srate=\"%d\" pos=\"%04x\" we_flag=\"%d\" polarity=\"%c\" modulation=\"%d\">\n",t->id,t->onid,t->freq,t->srate,t->pos,t->we_flag,t->pol,t->mod); t->scanned=1; scan_pat(); scan_sdt(); printf("</transponder>\n"); scan_nit(0x40); /* See if there are any new transponders */ scan_nit(0x41); /* See if there are any new transponders */ } printf("</satellite>\n"); } if (do_info) { if (pol!=0) { printf("<transponder type=\"S\" freq=\"%d\" srate=\"%d\" polarity=\"%c\" >\n",freq,srate,pol); } else { if (srate!=0) { printf("<transponder type=\"C\" freq=\"%d\" srate=\"%d\">\n",freq,srate); } else { if (freq<1000000) freq*=1000UL; printf("<transponder type=\"T\" freq=\"%d\">\n",freq); } } scan_pat(); scan_sdt();// scan_nit(0x40); printf("</transponder>\n"); } if ((vpid!=0) || (apid!=0) || (ttpid!=0)) { set_vpid(vpid); set_apid(apid); set_ttpid(ttpid); fprintf(stderr,"A/V/TT Filters set\n"); } if (dpid > 0) { char devnamen[80]; int dev, fdn; struct dvb_net_if netif; dev = card; netif.pid = dpid; netif.if_num = 0; // always choosen the next free number#ifdef NEWSTRUCT sprintf(devnamen,"/dev/dvb/adapter%d/net0",dev);#else sprintf(devnamen,"/dev/ost/net%d",dev);#endif //printf("Trying to open %s\n",devnamen); if((fdn = open(devnamen,O_RDWR|O_NONBLOCK)) < 0) { fprintf(stderr, "Failed to open DVB NET DEVICE"); close(fd_frontend); if (fd_sec) close(fd_sec); } else { // Add the network interface ioctl( fdn,NET_ADD_IF,&netif); close (fdn); printf("Successfully opened network device, please configure the dvb interface\n"); } } if (do_monitor) { int32_t strength, ber, snr, uncorr; fe_status_t festatus; if((fd_frontend = open(frontenddev[card],O_RDONLY)) < 0){ fprintf(stderr,"frontend: %d",i); perror("FRONTEND DEVICE: "); return -1; } // Check the signal strength and the BER while (1) { festatus = 0; strength = 0; ber = 0; snr = 0; uncorr = 0; FEReadBER(fd_frontend, &ber); FEReadSignalStrength(fd_frontend, &strength); FEReadSNR(fd_frontend, &snr); FEReadUncorrectedBlocks(fd_frontend, &uncorr); ioctl(fd_frontend,FE_READ_STATUS,&festatus); fprintf(stderr,"Signal=%d, Verror=%d, SNR=%ddB, BlockErrors=%d, (", strength, ber, snr, uncorr);#ifndef NEWSTRUCT if (festatus & FE_HAS_POWER) fprintf(stderr,"P|"); if (festatus & FE_SPECTRUM_INV) fprintf(stderr,"I|");#endif if (festatus & FE_HAS_SIGNAL) fprintf(stderr,"S|"); if (festatus & FE_HAS_LOCK) fprintf(stderr,"L|"); if (festatus & FE_HAS_CARRIER) fprintf(stderr,"C|"); if (festatus & FE_HAS_VITERBI) fprintf(stderr,"V|"); if (festatus & FE_HAS_SYNC) fprintf(stderr,"SY|"); fprintf(stderr,")\n"); sleep(1); } } close(fd_frontend); if (fd_sec) close(fd_sec); return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -