dst.c

来自「trident tm5600的linux驱动」· C语言 代码 · 共 1,866 行 · 第 1/4 页

C
1,866
字号
		if (state->type_flags & DST_TYPE_HAS_SYMDIV) {			sval = srate;			sval <<= 20;			do_div(sval, 88000);			symcalc = (u32) sval;			dprintk(verbose, DST_INFO, 1, "set symcalc %u", symcalc);			state->tx_tuna[5] = (u8) (symcalc >> 12);			state->tx_tuna[6] = (u8) (symcalc >> 4);			state->tx_tuna[7] = (u8) (symcalc << 4);		} else {			state->tx_tuna[5] = (u8) (srate >> 16) & 0x7f;			state->tx_tuna[6] = (u8) (srate >> 8);			state->tx_tuna[7] = (u8) srate;		}		state->tx_tuna[8] &= ~0x20;		if (state->type_flags & DST_TYPE_HAS_OBS_REGS) {			if (srate > 8000)				state->tx_tuna[8] |= 0x20;		}	} else if (state->dst_type == DST_TYPE_IS_CABLE) {		dprintk(verbose, DST_DEBUG, 1, "%s", state->fw_name);		if (!strncmp(state->fw_name, "DCTNEW", 6)) {			state->tx_tuna[5] = (u8) (srate >> 8);			state->tx_tuna[6] = (u8) srate;			state->tx_tuna[7] = 0x00;		} else if (!strncmp(state->fw_name, "DCT-CI", 6)) {			state->tx_tuna[5] = 0x00;			state->tx_tuna[6] = (u8) (srate >> 8);			state->tx_tuna[7] = (u8) srate;		}	}	return 0;}static int dst_set_modulation(struct dst_state *state, fe_modulation_t modulation){	if (state->dst_type != DST_TYPE_IS_CABLE)		return -EOPNOTSUPP;	state->modulation = modulation;	switch (modulation) {	case QAM_16:		state->tx_tuna[8] = 0x10;		break;	case QAM_32:		state->tx_tuna[8] = 0x20;		break;	case QAM_64:		state->tx_tuna[8] = 0x40;		break;	case QAM_128:		state->tx_tuna[8] = 0x80;		break;	case QAM_256:		if (!strncmp(state->fw_name, "DCTNEW", 6))			state->tx_tuna[8] = 0xff;		else if (!strncmp(state->fw_name, "DCT-CI", 6))			state->tx_tuna[8] = 0x00;		break;	case QPSK:	case QAM_AUTO:	case VSB_8:	case VSB_16:	default:		return -EINVAL;	}	return 0;}static fe_modulation_t dst_get_modulation(struct dst_state *state){	return state->modulation;}u8 dst_check_sum(u8 *buf, u32 len){	u32 i;	u8 val = 0;	if (!len)		return 0;	for (i = 0; i < len; i++) {		val += buf[i];	}	return ((~val) + 1);}EXPORT_SYMBOL(dst_check_sum);static void dst_type_flags_print(struct dst_state *state){	u32 type_flags = state->type_flags;	dprintk(verbose, DST_ERROR, 0, "DST type flags :");	if (type_flags & DST_TYPE_HAS_TS188)		dprintk(verbose, DST_ERROR, 0, " 0x%x newtuner", DST_TYPE_HAS_TS188);	if (type_flags & DST_TYPE_HAS_NEWTUNE_2)		dprintk(verbose, DST_ERROR, 0, " 0x%x newtuner 2", DST_TYPE_HAS_NEWTUNE_2);	if (type_flags & DST_TYPE_HAS_TS204)		dprintk(verbose, DST_ERROR, 0, " 0x%x ts204", DST_TYPE_HAS_TS204);	if (type_flags & DST_TYPE_HAS_VLF)		dprintk(verbose, DST_ERROR, 0, " 0x%x VLF", DST_TYPE_HAS_VLF);	if (type_flags & DST_TYPE_HAS_SYMDIV)		dprintk(verbose, DST_ERROR, 0, " 0x%x symdiv", DST_TYPE_HAS_SYMDIV);	if (type_flags & DST_TYPE_HAS_FW_1)		dprintk(verbose, DST_ERROR, 0, " 0x%x firmware version = 1", DST_TYPE_HAS_FW_1);	if (type_flags & DST_TYPE_HAS_FW_2)		dprintk(verbose, DST_ERROR, 0, " 0x%x firmware version = 2", DST_TYPE_HAS_FW_2);	if (type_flags & DST_TYPE_HAS_FW_3)		dprintk(verbose, DST_ERROR, 0, " 0x%x firmware version = 3", DST_TYPE_HAS_FW_3);	dprintk(verbose, DST_ERROR, 0, "\n");}static int dst_type_print(struct dst_state *state, u8 type){	char *otype;	switch (type) {	case DST_TYPE_IS_SAT:		otype = "satellite";		break;	case DST_TYPE_IS_TERR:		otype = "terrestrial";		break;	case DST_TYPE_IS_CABLE:		otype = "cable";		break;	case DST_TYPE_IS_ATSC:		otype = "atsc";		break;	default:		dprintk(verbose, DST_INFO, 1, "invalid dst type %d", type);		return -EINVAL;	}	dprintk(verbose, DST_INFO, 1, "DST type: %s", otype);	return 0;}static struct tuner_types tuner_list[] = {	{		.tuner_type = TUNER_TYPE_L64724,		.tuner_name = "L 64724",		.board_name = "UNKNOWN",		.fw_name    = "UNKNOWN"	},	{		.tuner_type = TUNER_TYPE_STV0299,		.tuner_name = "STV 0299",		.board_name = "VP1020",		.fw_name    = "DST-MOT"	},	{		.tuner_type = TUNER_TYPE_STV0299,		.tuner_name = "STV 0299",		.board_name = "VP1020",		.fw_name    = "DST-03T"	},	{		.tuner_type = TUNER_TYPE_MB86A15,		.tuner_name = "MB 86A15",		.board_name = "VP1022",		.fw_name    = "DST-03T"	},	{		.tuner_type = TUNER_TYPE_MB86A15,		.tuner_name = "MB 86A15",		.board_name = "VP1025",		.fw_name    = "DST-03T"	},	{		.tuner_type = TUNER_TYPE_STV0299,		.tuner_name = "STV 0299",		.board_name = "VP1030",		.fw_name    = "DST-CI"	},	{		.tuner_type = TUNER_TYPE_STV0299,		.tuner_name = "STV 0299",		.board_name = "VP1030",		.fw_name    = "DSTMCI"	},	{		.tuner_type = TUNER_TYPE_UNKNOWN,		.tuner_name = "UNKNOWN",		.board_name = "VP2021",		.fw_name    = "DCTNEW"	},	{		.tuner_type = TUNER_TYPE_UNKNOWN,		.tuner_name = "UNKNOWN",		.board_name = "VP2030",		.fw_name    = "DCT-CI"	},	{		.tuner_type = TUNER_TYPE_UNKNOWN,		.tuner_name = "UNKNOWN",		.board_name = "VP2031",		.fw_name    = "DCT-CI"	},	{		.tuner_type = TUNER_TYPE_UNKNOWN,		.tuner_name = "UNKNOWN",		.board_name = "VP2040",		.fw_name    = "DCT-CI"	},	{		.tuner_type = TUNER_TYPE_UNKNOWN,		.tuner_name = "UNKNOWN",		.board_name = "VP3020",		.fw_name    = "DTTFTA"	},	{		.tuner_type = TUNER_TYPE_UNKNOWN,		.tuner_name = "UNKNOWN",		.board_name = "VP3021",		.fw_name    = "DTTFTA"	},	{		.tuner_type = TUNER_TYPE_TDA10046,		.tuner_name = "TDA10046",		.board_name = "VP3040",		.fw_name    = "DTT-CI"	},	{		.tuner_type = TUNER_TYPE_UNKNOWN,		.tuner_name = "UNKNOWN",		.board_name = "VP3051",		.fw_name    = "DTTNXT"	},	{		.tuner_type = TUNER_TYPE_NXT200x,		.tuner_name = "NXT200x",		.board_name = "VP3220",		.fw_name    = "ATSCDI"	},	{		.tuner_type = TUNER_TYPE_NXT200x,		.tuner_name = "NXT200x",		.board_name = "VP3250",		.fw_name    = "ATSCAD"	},};/*	Known cards list	Satellite	-------------------		  200103A	VP-1020   DST-MOT	LG(old), TS=188	VP-1020   DST-03T	LG(new), TS=204	VP-1022   DST-03T	LG(new), TS=204	VP-1025   DST-03T	LG(new), TS=204	VP-1030   DSTMCI,	LG(new), TS=188	VP-1032   DSTMCI,	LG(new), TS=188	Cable	-------------------	VP-2030   DCT-CI,	Samsung, TS=204	VP-2021   DCT-CI,	Unknown, TS=204	VP-2031   DCT-CI,	Philips, TS=188	VP-2040   DCT-CI,	Philips, TS=188, with CA daughter board	VP-2040   DCT-CI,	Philips, TS=204, without CA daughter board	Terrestrial	-------------------	VP-3050  DTTNXT			 TS=188	VP-3040  DTT-CI,	Philips, TS=188	VP-3040  DTT-CI,	Philips, TS=204	ATSC	-------------------	VP-3220  ATSCDI,		 TS=188	VP-3250  ATSCAD,		 TS=188*/static struct dst_types dst_tlist[] = {	{		.device_id = "200103A",		.offset = 0,		.dst_type =  DST_TYPE_IS_SAT,		.type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1 | DST_TYPE_HAS_OBS_REGS,		.dst_feature = 0,		.tuner_type = 0	},	/*	obsolete	*/	{		.device_id = "DST-020",		.offset = 0,		.dst_type =  DST_TYPE_IS_SAT,		.type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1,		.dst_feature = 0,		.tuner_type = 0	},	/*	obsolete	*/	{		.device_id = "DST-030",		.offset =  0,		.dst_type = DST_TYPE_IS_SAT,		.type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_TS188 | DST_TYPE_HAS_FW_1,		.dst_feature = 0,		.tuner_type = 0	},	/*	obsolete	*/	{		.device_id = "DST-03T",		.offset = 0,		.dst_type = DST_TYPE_IS_SAT,		.type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_2,		.dst_feature = DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4 | DST_TYPE_HAS_DISEQC5							 | DST_TYPE_HAS_MAC | DST_TYPE_HAS_MOTO,		.tuner_type = TUNER_TYPE_MULTI	 },	{		.device_id = "DST-MOT",		.offset =  0,		.dst_type = DST_TYPE_IS_SAT,		.type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1,		.dst_feature = 0,		.tuner_type = 0	},	/*	obsolete	*/	{		.device_id = "DST-CI",		.offset = 1,		.dst_type = DST_TYPE_IS_SAT,		.type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_1,		.dst_feature = DST_TYPE_HAS_CA,		.tuner_type = 0	},	/*	An OEM board	*/	{		.device_id = "DSTMCI",		.offset = 1,		.dst_type = DST_TYPE_IS_SAT,		.type_flags = DST_TYPE_HAS_TS188 | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD | DST_TYPE_HAS_INC_COUNT | DST_TYPE_HAS_VLF,		.dst_feature = DST_TYPE_HAS_CA | DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4							| DST_TYPE_HAS_MOTO | DST_TYPE_HAS_MAC,		.tuner_type = TUNER_TYPE_MULTI	},	{		.device_id = "DSTFCI",		.offset = 1,		.dst_type = DST_TYPE_IS_SAT,		.type_flags = DST_TYPE_HAS_TS188 | DST_TYPE_HAS_FW_1,		.dst_feature = 0,		.tuner_type = 0	},	/* unknown to vendor	*/	{		.device_id = "DCT-CI",		.offset = 1,		.dst_type = DST_TYPE_IS_CABLE,		.type_flags = DST_TYPE_HAS_MULTI_FE | DST_TYPE_HAS_FW_1	| DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_VLF,		.dst_feature = DST_TYPE_HAS_CA,		.tuner_type = 0	},	{		.device_id = "DCTNEW",		.offset = 1,		.dst_type = DST_TYPE_IS_CABLE,		.type_flags = DST_TYPE_HAS_TS188 | DST_TYPE_HAS_FW_3 | DST_TYPE_HAS_FW_BUILD | DST_TYPE_HAS_MULTI_FE,		.dst_feature = 0,		.tuner_type = 0	},	{		.device_id = "DTT-CI",		.offset = 1,		.dst_type = DST_TYPE_IS_TERR,		.type_flags = DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_MULTI_FE | DST_TYPE_HAS_VLF,		.dst_feature = DST_TYPE_HAS_CA,		.tuner_type = 0	},	{		.device_id = "DTTDIG",		.offset = 1,		.dst_type = DST_TYPE_IS_TERR,		.type_flags = DST_TYPE_HAS_FW_2,		.dst_feature = 0,		.tuner_type = 0	},	{		.device_id = "DTTNXT",		.offset = 1,		.dst_type = DST_TYPE_IS_TERR,		.type_flags = DST_TYPE_HAS_FW_2,		.dst_feature = DST_TYPE_HAS_ANALOG,		.tuner_type = 0	},	{		.device_id = "ATSCDI",		.offset = 1,		.dst_type = DST_TYPE_IS_ATSC,		.type_flags = DST_TYPE_HAS_FW_2,		.dst_feature = 0,		.tuner_type = 0	},	{		.device_id = "ATSCAD",		.offset = 1,		.dst_type = DST_TYPE_IS_ATSC,		.type_flags = DST_TYPE_HAS_MULTI_FE | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD,		.dst_feature = DST_TYPE_HAS_MAC | DST_TYPE_HAS_ANALOG,		.tuner_type = 0	},	{ }};static int dst_get_mac(struct dst_state *state){	u8 get_mac[] = { 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };	get_mac[7] = dst_check_sum(get_mac, 7);	if (dst_command(state, get_mac, 8) < 0) {		dprintk(verbose, DST_INFO, 1, "Unsupported Command");		return -1;	}	memset(&state->mac_address, '\0', 8);	memcpy(&state->mac_address, &state->rxbuffer, 6);	dprintk(verbose, DST_ERROR, 1, "MAC Address=[%02x:%02x:%02x:%02x:%02x:%02x]",		state->mac_address[0], state->mac_address[1], state->mac_address[2],		state->mac_address[4], state->mac_address[5], state->mac_address[6]);	return 0;}static int dst_fw_ver(struct dst_state *state){	u8 get_ver[] = { 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };	get_ver[7] = dst_check_sum(get_ver, 7);	if (dst_command(state, get_ver, 8) < 0) {		dprintk(verbose, DST_INFO, 1, "Unsupported Command");		return -1;	}

⌨️ 快捷键说明

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