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

📄 fe.c

📁 this ebook is for GSM if any one has interest in it you can take it
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -