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

📄 dst.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 3 页
字号:
	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(u32 type_flags){	dprintk(verbose, DST_ERROR, 0, "DST type flags :");	if (type_flags & DST_TYPE_HAS_NEWTUNE)		dprintk(verbose, DST_ERROR, 0, " 0x%x newtuner", DST_TYPE_HAS_NEWTUNE);	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_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(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;	default:		dprintk(verbose, DST_INFO, 1, "invalid dst type %d", type);		return -EINVAL;	}	dprintk(verbose, DST_INFO, 1, "DST type: %s", otype);	return 0;}/*	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*/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	},	/*	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	},	/*	obsolete	*/	{		.device_id = "DST-030",		.offset =  0,		.dst_type = DST_TYPE_IS_SAT,		.type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1,		.dst_feature = 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	 },	{		.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	},	/*	obsolete	*/	{		.device_id = "DST-CI",		.offset = 1,		.dst_type = DST_TYPE_IS_SAT,		.type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1,		.dst_feature = DST_TYPE_HAS_CA	},	/*	An OEM board	*/	{		.device_id = "DSTMCI",		.offset = 1,		.dst_type = DST_TYPE_IS_SAT,		.type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD | DST_TYPE_HAS_INC_COUNT,		.dst_feature = DST_TYPE_HAS_CA | DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4							| DST_TYPE_HAS_MOTO | DST_TYPE_HAS_MAC	},	{		.device_id = "DSTFCI",		.offset = 1,		.dst_type = DST_TYPE_IS_SAT,		.type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1,		.dst_feature = 0	},	/* unknown to vendor	*/	{		.device_id = "DCT-CI",		.offset = 1,		.dst_type = DST_TYPE_IS_CABLE,		.type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1							| DST_TYPE_HAS_FW_2,		.dst_feature = DST_TYPE_HAS_CA	},	{		.device_id = "DCTNEW",		.offset = 1,		.dst_type = DST_TYPE_IS_CABLE,		.type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_3 | DST_TYPE_HAS_FW_BUILD,		.dst_feature = 0	},	{		.device_id = "DTT-CI",		.offset = 1,		.dst_type = DST_TYPE_IS_TERR,		.type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_MULTI_FE,		.dst_feature = DST_TYPE_HAS_CA	},	{		.device_id = "DTTDIG",		.offset = 1,		.dst_type = DST_TYPE_IS_TERR,		.type_flags = DST_TYPE_HAS_FW_2,		.dst_feature = 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	},	{		.device_id = "ATSCDI",		.offset = 1,		.dst_type = DST_TYPE_IS_ATSC,		.type_flags = DST_TYPE_HAS_FW_2,		.dst_feature = 0	},	{		.device_id = "ATSCAD",		.offset = 1,		.dst_type = DST_TYPE_IS_ATSC,		.type_flags = DST_TYPE_HAS_FW_2,		.dst_feature = 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;	}	memset(&state->fw_version, '\0', 8);	memcpy(&state->fw_version, &state->rxbuffer, 8);	dprintk(verbose, DST_ERROR, 1, "Firmware Ver = %x.%x Build = %02x, on %x:%x, %x-%x-20%02x",		state->fw_version[0] >> 4, state->fw_version[0] & 0x0f,		state->fw_version[1],		state->fw_version[5], state->fw_version[6],		state->fw_version[4], state->fw_version[3], state->fw_version[2]);	return 0;}static int dst_card_type(struct dst_state *state){	u8 get_type[] = { 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };	get_type[7] = dst_check_sum(get_type, 7);	if (dst_command(state, get_type, 8) < 0) {		dprintk(verbose, DST_INFO, 1, "Unsupported Command");		return -1;	}	memset(&state->card_info, '\0', 8);	memcpy(&state->card_info, &state->rxbuffer, 8);	dprintk(verbose, DST_ERROR, 1, "Device Model=[%s]", &state->card_info[0]);	return 0;}static int dst_get_vendor(struct dst_state *state){	u8 get_vendor[] = { 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };	get_vendor[7] = dst_check_sum(get_vendor, 7);	if (dst_command(state, get_vendor, 8) < 0) {		dprintk(verbose, DST_INFO, 1, "Unsupported Command");		return -1;	}	memset(&state->vendor, '\0', 8);	memcpy(&state->vendor, &state->rxbuffer, 8);	dprintk(verbose, DST_ERROR, 1, "Vendor=[%s]", &state->vendor[0]);	return 0;}static int dst_get_tuner_info(struct dst_state *state){	u8 get_tuner_1[] = { 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };	u8 get_tuner_2[] = { 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };	get_tuner_1[7] = dst_check_sum(get_tuner_1, 7);	get_tuner_2[7] = dst_check_sum(get_tuner_2, 7);	if (state->type_flags & DST_TYPE_HAS_MULTI_FE) {		if (dst_command(state, get_tuner_2, 8) < 0) {			dprintk(verbose, DST_INFO, 1, "Unsupported Command");			return -1;		}	} else {		if (dst_command(state, get_tuner_1, 8) < 0) {			dprintk(verbose, DST_INFO, 1, "Unsupported Command");			return -1;		}	}	memset(&state->board_info, '\0', 8);	memcpy(&state->board_info, &state->rxbuffer, 8);	if (state->type_flags & DST_TYPE_HAS_MULTI_FE) {		if (state->board_info[1] == 0x0b) {			if (state->type_flags & DST_TYPE_HAS_TS204)				state->type_flags &= ~DST_TYPE_HAS_TS204;			state->type_flags |= DST_TYPE_HAS_NEWTUNE;			dprintk(verbose, DST_INFO, 1, "DST type has TS=188");		} else {			if (state->type_flags & DST_TYPE_HAS_NEWTUNE)				state->type_flags &= ~DST_TYPE_HAS_NEWTUNE;			state->type_flags |= DST_TYPE_HAS_TS204;			dprintk(verbose, DST_INFO, 1, "DST type has TS=204");		}	} else {		if (state->board_info[0] == 0xbc) {			if (state->type_flags & DST_TYPE_HAS_TS204)				state->type_flags &= ~DST_TYPE_HAS_TS204;			state->type_flags |= DST_TYPE_HAS_NEWTUNE;			dprintk(verbose, DST_INFO, 1, "DST type has TS=188, Daughterboard=[%d]", state->board_info[1]);		} else if (state->board_info[0] == 0xcc) {			if (state->type_flags & DST_TYPE_HAS_NEWTUNE)				state->type_flags &= ~DST_TYPE_HAS_NEWTUNE;			state->type_flags |= DST_TYPE_HAS_TS204;			dprintk(verbose, DST_INFO, 1, "DST type has TS=204 Daughterboard=[%d]", state->board_info[1]);		}	}	return 0;}static int dst_get_device_id(struct dst_state *state){	u8 reply;	int i;	struct dst_types *p_dst_type;	u8 use_dst_type = 0;	u32 use_type_flags = 0;	static u8 device_type[8] = {0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff};	device_type[7] = dst_check_sum(device_type, 7);	if (write_dst(state, device_type, FIXED_COMM))		return -1;		/*	Write failed		*/	if ((dst_pio_disable(state)) < 0)		return -1;	if (read_dst(state, &reply, GET_ACK))		return -1;		/*	Read failure		*/	if (reply != ACK) {		dprintk(verbose, DST_INFO, 1, "Write not Acknowledged! [Reply=0x%02x]", reply);		return -1;		/*	Unack'd write		*/	}	if (!dst_wait_dst_ready(state, DEVICE_INIT))		return -1;		/*	DST not ready yet	*/	if (read_dst(state, state->rxbuffer, FIXED_COMM))		return -1;	dst_pio_disable(state);	if (state->rxbuffer[7] != dst_check_sum(state->rxbuffer, 7)) {		dprintk(verbose, DST_INFO, 1, "Checksum failure!");		return -1;		/*	Checksum failure	*/	}	state->rxbuffer[7] = '\0';	for (i = 0, p_dst_type = dst_tlist; i < ARRAY_SIZE(dst_tlist); i++, p_dst_type++) {		if (!strncmp (&state->rxbuffer[p_dst_type->offset], p_dst_type->device_id, strlen (p_dst_type->device_id))) {			use_type_flags = p_dst_type->type_flags;			use_dst_type = p_dst_type->dst_type;			/*	Card capabilities	*/			state->dst_hw_cap = p_dst_type->dst_feature;			dprintk(verbose, DST_ERROR, 1, "Recognise [%s]\n", p_dst_type->device_id);			break;		}	}	if (i >= sizeof (dst_tlist) / sizeof (dst_tlist [0])) {		dprintk(verbose, DST_ERROR, 1, "Unable to recognize %s or %s", &state->rxbuffer[0], &state->rxbuffer[1]);		dprintk(verbose, DST_ERROR, 1, "please email linux-dvb@linuxtv.org with this type in");		use_dst_type = DST_TYPE_IS_SAT;		use_type_flags = DST_TYPE_HAS_SYMDIV;	}	dst_type_print(use_dst_type);	state->type_flags = use_type_flags;	state->dst_type = use_dst_type;	dst_type_flags_print(state->type_flags);	return 0;}static int dst_probe(struct dst_state *state){	sema_init(&state->dst_mutex, 1);	if ((rdc_8820_reset(state)) < 0) {		dprintk(verbose, DST_ERROR, 1, "RDC 8820 RESET Failed.");		return -1;	}	if (dst_addons & DST_TYPE_HAS_CA)		msleep(4000);	else		msleep(100);	if ((dst_comm_init(state)) < 0) {		dprintk(verbose, DST_ERROR, 1, "DST Initialization Failed.");		return -1;	}	msleep(100);	if (dst_get_device_id(state) < 0) {		dprintk(verbose, DST_ERROR, 1, "unknown device.");		return -1;	}	if (dst_get_mac(state) < 0) {		dprintk(verbose, DST_INFO, 1, "MAC: Unsupported command");		return 0;	}	if ((state->type_flags & DST_TYPE_HAS_MULTI_FE) || (state->type_flags & DST_TYPE_HAS_FW_BUILD)) {		if (dst_get_tuner_info(state) < 0)			dprintk(verbose, DST_INFO, 1, "Tuner: Unsupported command");	}	if (state->type_flags & DST_TYPE_HAS_TS204) {		dst_packsize(state, 204);	}	if (state->type_flags & DST_TYPE_HAS_FW_BUILD) {		if (dst_fw_ver(state) < 0) {			dprintk(verbose, DST_INFO, 1, "FW: Unsupported command");			return 0;		}		if (dst_card_type(state) < 0) {			dprintk(verbose, DST_INFO, 1, "Card: Unsupported command");			return 0;		}		if (dst_get_vendor(state) < 0) {			dprintk(verbose, DST_INFO, 1, "Vendor: Unsupported command");			return 0;		}	}	return 0;}int dst_command(struct dst_state *state, u8 *data, u8 len){	u8 reply;	down(&state->dst_mutex);	if ((dst_comm_init(state)) < 0) {		dprintk(verbose, DST_NOTICE, 1, "DST Communication Initialization Failed.");		goto error;	}	if (write_dst(state, data, len)) {		dprintk(verbose, DST_INFO, 1, "Tring to recover.. ");		if ((dst_error_recovery(state)) < 0) {			dprintk(verbose, DST_ERROR, 1, "Recovery Failed.");			goto error;		}		goto error;	}	if ((dst_pio_disable(state)) < 0) {		dprintk(verbose, DST_ERROR, 1, "PIO Disable Failed.");		goto error;	}	if (state->type_flags & DST_TYPE_HAS_FW_1)		udelay(3000);	if (read_dst(state, &reply, GET_ACK)) {		dprintk(verbose, DST_DEBUG, 1, "Trying to recover.. ");		if ((dst_error_recovery(state)) < 0) {			dprintk(verbose, DST_INFO, 1, "Recovery Failed.");			goto error;		}		goto error;	}	if (reply != ACK) {		dprintk(verbose, DST_INFO, 1, "write not acknowledged 0x%02x ", reply);		goto error;	}	if (len >= 2 && data[0] == 0 && (data[1] == 1 || data[1] == 3))		goto error;	if (state->type_flags & DST_TYPE_HAS_FW_1)		udelay(3000);	else		udelay(2000);	if (!dst_wait_dst_ready(state, NO_DELAY))		goto error;	if (read_dst(state, state->rxbuffer, FIXED_COMM)) {		dprintk(verbose, DST_DEBUG, 1, "Trying to recover.. ");		if ((dst_error_recovery(state)) < 0) {

⌨️ 快捷键说明

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