📄 fe.c
字号:
#include <sys/poll.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/ioctl.h>#include <errno.h>#include <time.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include "getstream.h"struct diseqc_cmd { struct dvb_diseqc_master_cmd cmd; uint32_t wait;};struct diseqc_cmd switch_cmds[] = { { { { 0xe0, 0x10, 0x38, 0xf0, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xf2, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xf1, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xf3, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xf4, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xf6, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xf5, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xf7, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xf8, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xfa, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xf9, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xfb, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xfc, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xfe, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xfd, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xff, 0x00, 0x00 }, 4 }, 0 }};static inline void msleep(uint32_t msec){ struct timespec req = { msec / 1000, 1000000 * (msec % 1000) }; while (nanosleep(&req, &req)) ;}int diseqc_send_msg (int fd, fe_sec_voltage_t v, struct diseqc_cmd **cmd, fe_sec_tone_mode_t t, fe_sec_mini_cmd_t b) { int err; if ((err = ioctl(fd, FE_SET_TONE, SEC_TONE_OFF))) return err; if ((err = ioctl(fd, FE_SET_VOLTAGE, v))) return err; msleep(15); while (*cmd) { if ((err = ioctl(fd, FE_DISEQC_SEND_MASTER_CMD, &(*cmd)->cmd))) return err; msleep((*cmd)->wait); cmd++; } msleep(15); if ((err = ioctl(fd, FE_DISEQC_SEND_BURST, b))) return err; msleep(15); return ioctl(fd, FE_SET_TONE, t);}int setup_switch (int frontend_fd, int switch_pos, int voltage_18, int hiband) { struct diseqc_cmd *cmd[2] = { NULL, NULL }; int i = 4 * switch_pos + 2 * hiband + (voltage_18 ? 1 : 0); if (i < 0 || i >= (int) (sizeof(switch_cmds)/sizeof(struct diseqc_cmd))) return -EINVAL; cmd[0] = &switch_cmds[i]; return diseqc_send_msg (frontend_fd, i % 2 ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13, cmd, (i/2) % 2 ? SEC_TONE_ON : SEC_TONE_OFF, (i/4) % 2 ? SEC_MINI_B : SEC_MINI_A);}/* * Dump FrontEnd Status byte as clear text returned * by GET_STATUS or GET_EVENT ioctl * */char *fe_decode_status(int status) { static char str[256]; str[0]=0x0; if (status & FE_HAS_SIGNAL) strcat(str, "HAS_SIGNAL "); if (status & FE_HAS_CARRIER) strcat(str, "HAS_CARRIER "); if (status & FE_HAS_VITERBI) strcat(str, "HAS_VITERBI "); if (status & FE_HAS_SYNC) strcat(str, "HAS_SYNC "); if (status & FE_HAS_LOCK) strcat(str, "HAS_LOCK "); if (status & FE_TIMEDOUT) strcat(str, "TIMEDOUT "); if (status & FE_REINIT) strcat(str, "REINIT "); /* Eliminate last space */ if (strlen(str) > 0) str[strlen(str)-1]=0x0; return str;};static int fe_tune_dvbs(struct adapter_s *adapter) { FE_PARAM feparams; int voltage, tone=SEC_TONE_OFF; memset(&feparams, 0, sizeof(FE_PARAM)); if (strcasecmp(adapter->fe.dvbs.t_pol, "h") == 0) { voltage=SEC_VOLTAGE_18; } else if(strcasecmp(adapter->fe.dvbs.t_pol, "v") == 0) { voltage=SEC_VOLTAGE_13; } else { logwrite(LOG_ERROR, "fe: Unknown polarity \"%s\" in dvb-s transponder config", adapter->fe.dvbs.t_pol); exit(-1); } if (adapter->fe.dvbs.t_freq > 2200000) { if (adapter->fe.dvbs.t_freq < adapter->fe.dvbs.lnb_slof) { feparams.frequency=(adapter->fe.dvbs.t_freq-adapter->fe.dvbs.lnb_lof1); tone = SEC_TONE_OFF; } else { feparams.frequency=(adapter->fe.dvbs.t_freq-adapter->fe.dvbs.lnb_lof2); tone = SEC_TONE_ON; } } else { feparams.frequency=adapter->fe.dvbs.t_freq; } feparams.inversion=DVBFE_INVERSION_AUTO; if (adapter->type == AT_DVBS2) { DVB_SET_DELIVERY(&feparams, DVBFE_DELSYS_DVBS2); DVBS2_SET_SYMBOLRATE(&feparams, adapter->fe.dvbs.t_srate); DVBS2_SET_FEC(&feparams, DVBFE_FEC_AUTO); } else { DVB_SET_DELIVERY(&feparams, DVBFE_DELSYS_DVBS); DVBS_SET_SYMBOLRATE(&feparams, adapter->fe.dvbs.t_srate); DVBS_SET_FEC(&feparams, DVBFE_FEC_AUTO); } if (adapter->fe.dvbs.lnbsharing) { int value=SEC_TONE_OFF; logwrite(LOG_DEBUG, "fe: Adapter %d lnb-sharing active - trying to turn off", adapter->no); if (ioctl(adapter->fe.fd, FE_SET_TONE, value) < 0) { logwrite(LOG_ERROR, "fe: Adapter %d ioctl FE_SET_TONE failed - %s", adapter->no, strerror(errno)); } value=SEC_VOLTAGE_OFF; if (ioctl(adapter->fe.fd, FE_SET_VOLTAGE, value) < 0) { if (errno == EINVAL) { logwrite(LOG_DEBUG, "fe: Adapter %d SEC_VOLTAGE_OFF not possible", adapter->no); if (ioctl(adapter->fe.fd, FE_SET_VOLTAGE, voltage) < 0) { logwrite(LOG_ERROR, "fe: Adapter %d ioctl FE_SET_VOLTAGE failed - %s", adapter->no, strerror(errno)); } } } } else if (adapter->fe.dvbs.t_diseqc) { if (setup_switch(adapter->fe.fd, adapter->fe.dvbs.t_diseqc-1, voltage, (tone == SEC_TONE_ON))) { logwrite(LOG_ERROR, "fe: diseqc failed to send"); exit(-1); } logwrite(LOG_DEBUG, "fe: diseqc send successful"); sleep(1); } else { if (ioctl(adapter->fe.fd, FE_SET_VOLTAGE, voltage) < 0) { logwrite(LOG_ERROR, "fe: ioctl FE_SET_VOLTAGE failed - %s", strerror(errno)); } if (ioctl(adapter->fe.fd, FE_SET_TONE, tone) < 0) { logwrite(LOG_ERROR, "fe: ioctl FE_SET_TONE failed - %s", strerror(errno)); } } logwrite(LOG_INFO, "fe: DVB-S tone = %d", tone); logwrite(LOG_INFO, "fe: DVB-S voltage = %d", voltage); logwrite(LOG_INFO, "fe: DVB-S diseqc = %d", adapter->fe.dvbs.t_diseqc); logwrite(LOG_INFO, "fe: DVB-S freq = %lu", adapter->fe.dvbs.t_freq); logwrite(LOG_INFO, "fe: DVB-S lof1 = %lu", adapter->fe.dvbs.lnb_lof1); logwrite(LOG_INFO, "fe: DVB-S lof2 = %lu", adapter->fe.dvbs.lnb_lof2); logwrite(LOG_INFO, "fe: DVB-S slof = %lu", adapter->fe.dvbs.lnb_slof); logwrite(LOG_INFO, "fe: DVB-S feparams.frequency = %d", feparams.frequency); logwrite(LOG_INFO, "fe: DVB-S feparams.inversion = %d", feparams.inversion); logwrite(LOG_INFO, "fe: DVB-S feparams.u.qpsk.symbol_rate = %d", adapter->fe.dvbs.t_srate); if (ioctl(adapter->fe.fd, IOCTL_SET_FE, &feparams) < 0) { logwrite(LOG_ERROR, "fe: ioctl FE_SET_FRONTEND failed - %s", strerror(errno)); exit(-1); } return 0;}int fe_tune_dvbt(struct adapter_s *adapter) { FE_PARAM feparams; memset(&feparams, 0, sizeof(FE_PARAM)); feparams.frequency = adapter->fe.dvbt.freq; feparams.inversion = INVERSION_AUTO; DVB_SET_DELIVERY(&feparams, DVBFE_DELSYS_DVBT); DVBT_SET_CODERATE_HP(&feparams, DVBFE_FEC_AUTO); DVBT_SET_CODERATE_LP(&feparams, DVBFE_FEC_AUTO); switch(adapter->fe.dvbt.bandwidth) { case(0): DVBT_SET_BANDWIDTH(&feparams, DVBFE_BANDWIDTH_AUTO); break; case(6): DVBT_SET_BANDWIDTH(&feparams, DVBFE_BANDWIDTH_6_MHZ); break; case(7): DVBT_SET_BANDWIDTH(&feparams, DVBFE_BANDWIDTH_7_MHZ); break; case(8): DVBT_SET_BANDWIDTH(&feparams, DVBFE_BANDWIDTH_8_MHZ); break; default: logwrite(LOG_ERROR, "fe: Unknown DVB-T bandwidth %d", adapter->fe.dvbt.bandwidth); exit(-1); } switch(adapter->fe.dvbt.modulation) { case(0): DVBT_SET_MODULATION(&feparams, DVBFE_MOD_QAMAUTO); break; case(16):DVBT_SET_MODULATION(&feparams, DVBFE_MOD_QAM16); break; case(32):DVBT_SET_MODULATION(&feparams, DVBFE_MOD_QAM32); break; case(64):DVBT_SET_MODULATION(&feparams, DVBFE_MOD_QAM64); break; case(128):DVBT_SET_MODULATION(&feparams, DVBFE_MOD_QAM128); break; case(256):DVBT_SET_MODULATION(&feparams, DVBFE_MOD_QAM256); break; default: logwrite(LOG_ERROR, "fe: Unknown DVB-T modulation %d", adapter->fe.dvbt.modulation); exit(-1); } switch(adapter->fe.dvbt.tmode) { case(0):DVBT_SET_TMODE(&feparams, DVBFE_TRANSMISSION_MODE_AUTO); break; case(2):DVBT_SET_TMODE(&feparams, DVBFE_TRANSMISSION_MODE_2K); break; case(8):DVBT_SET_TMODE(&feparams, DVBFE_TRANSMISSION_MODE_8K); break; default: logwrite(LOG_ERROR, "fe: Unknown DVB-T transmission mode %d", adapter->fe.dvbt.tmode); exit(-1); } switch(adapter->fe.dvbt.guard) { case(0):DVBT_SET_GUARD(&feparams, DVBFE_GUARD_INTERVAL_AUTO); break; case(4):DVBT_SET_GUARD(&feparams, DVBFE_GUARD_INTERVAL_1_4); break; case(8):DVBT_SET_GUARD(&feparams, DVBFE_GUARD_INTERVAL_1_8); break; case(16):DVBT_SET_GUARD(&feparams, DVBFE_GUARD_INTERVAL_1_16); break; case(32):DVBT_SET_GUARD(&feparams, DVBFE_GUARD_INTERVAL_1_32); break; default: logwrite(LOG_ERROR, "fe: Unknown DVB-T guard interval %d", adapter->fe.dvbt.guard); exit(-1); } switch(adapter->fe.dvbt.hierarchy) { case(-1):DVBT_SET_HIERARCHY(&feparams, DVBFE_HIERARCHY_OFF); break; case(0):DVBT_SET_HIERARCHY(&feparams, DVBFE_HIERARCHY_AUTO); break; case(1):DVBT_SET_HIERARCHY(&feparams, DVBFE_HIERARCHY_1); break; case(2):DVBT_SET_HIERARCHY(&feparams, DVBFE_HIERARCHY_2); break; case(4):DVBT_SET_HIERARCHY(&feparams, DVBFE_HIERARCHY_4); break; default: logwrite(LOG_ERROR, "fe: Unknown DVB-T hierarchy %d", adapter->fe.dvbt.hierarchy); exit(-1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -