mirror of
				https://github.com/DigitalDevices/dddvb.git
				synced 2025-03-01 10:35:23 +00:00 
			
		
		
		
	support CI M2, M8 and M8A
This commit is contained in:
		| @@ -1838,6 +1838,9 @@ static int dvb_input_attach(struct ddb_input *input) | ||||
| 		break; | ||||
| 	case DDB_TUNER_MCI_SX8: | ||||
| 	case DDB_TUNER_MCI_M4: | ||||
| 	case DDB_TUNER_MCI_M8: | ||||
| 	case DDB_TUNER_MCI_M8A: | ||||
| 	case DDB_TUNER_MCI_M2: | ||||
| 		if (ddb_fe_attach_mci(input, port->type) < 0) | ||||
| 			return -ENODEV; | ||||
| 		break; | ||||
|   | ||||
| @@ -731,8 +731,48 @@ static const struct ddb_info ddb_m4 = { | ||||
| 	.i2c_mask = 0x00, | ||||
| 	.tempmon_irq = 24, | ||||
| 	.mci_ports = 2, | ||||
| 	.mci_type = 1, | ||||
| 	.mci_type = DDB_TUNER_MCI_M4, | ||||
| 	.temp_num = 1, | ||||
| 	.lnb_base = 0x400, | ||||
| }; | ||||
|  | ||||
| static const struct ddb_info ddb_m8 = { | ||||
| 	.type     = DDB_OCTOPUS_MCI, | ||||
| 	.name     = "Digital Devices MAX M8", | ||||
| 	.regmap   = &octopus_mci_map, | ||||
| 	.port_num = 4, | ||||
| 	.i2c_mask = 0x00, | ||||
| 	.tempmon_irq = 24, | ||||
| 	.mci_ports = 4, | ||||
| 	.mci_type = DDB_TUNER_MCI_M8, | ||||
| 	.temp_num = 1, | ||||
| 	.lnb_base = 0x400, | ||||
| }; | ||||
|  | ||||
| static const struct ddb_info ddb_m8a = { | ||||
| 	.type     = DDB_OCTOPUS_MCI, | ||||
| 	.name     = "Digital Devices MAX M8A", | ||||
| 	.regmap   = &octopus_mci_map, | ||||
| 	.port_num = 4, | ||||
| 	.tempmon_irq = 24, | ||||
| 	.mci_ports = 4, | ||||
| 	.mci_type = DDB_TUNER_MCI_M8A, | ||||
| 	.temp_num = 1, | ||||
| 	.lnb_base = 0x400, | ||||
| }; | ||||
|  | ||||
| static const struct ddb_info ddb_ci_m2 = { | ||||
| 	.type     = DDB_OCTOPUS_MCI, | ||||
| 	.name     = "Digital Devices Octopus CI M2", | ||||
| 	.regmap   = &octopus_mci_map, | ||||
| 	.port_num = 4, | ||||
| 	.tempmon_irq = 24, | ||||
| 	.mci_ports = 1, | ||||
| 	.mci_type = DDB_TUNER_MCI_M2, | ||||
| 	.temp_num = 1, | ||||
| 	.ci_mask  = 0x0c, | ||||
| 	.ci_base  = 0x400, | ||||
| 	.lnb_base = 0x480, | ||||
| }; | ||||
|  | ||||
| /****************************************************************************/ | ||||
| @@ -865,7 +905,10 @@ static const struct ddb_device_id ddb_device_ids[] = { | ||||
| 	DDB_DEVID(0x0012, 0x0042, ddb_ci), | ||||
| 	DDB_DEVID(0x0013, 0x0043, ddb_ci_s2_pro), | ||||
| 	DDB_DEVID(0x0013, 0x0044, ddb_ci_s2_pro_a), | ||||
| 	DDB_DEVID(0x0014, 0x0045, ddb_ci_m2), | ||||
| 	DDB_DEVID(0x0020, 0x0012, ddb_gtl_mini), | ||||
| 	DDB_DEVID(0x0022, 0x0052, ddb_m8), | ||||
| 	DDB_DEVID(0x0024, 0x0053, ddb_m8a), | ||||
|  | ||||
| 	/* Modulators */ | ||||
| 	DDB_DEVID(0x0201, 0x0001, ddb_mod), | ||||
|   | ||||
| @@ -529,7 +529,134 @@ static struct mci_cfg ddb_max_m4_cfg = { | ||||
| 	.base_init = base_init, | ||||
| }; | ||||
|  | ||||
| struct dvb_frontend *ddb_m4_attach(struct ddb_input *input, int nr, int tuner) | ||||
| static struct dvb_frontend_ops m_ops = { | ||||
| 	.delsys = { SYS_DVBC_ANNEX_A, SYS_DVBC_ANNEX_B, SYS_DVBC_ANNEX_C, | ||||
| 		    SYS_ISDBC,  | ||||
| 		    SYS_DVBT, SYS_DVBT2, SYS_ISDBT, | ||||
| 		    SYS_DVBS, SYS_DVBS2, SYS_ISDBS, }, | ||||
| 	.info = { | ||||
| 		.name = "M_AS", | ||||
| 		.frequency_min_hz = 47125000,	/* DVB-T: 47125000 */ | ||||
| 		.frequency_max_hz = 2150000000,	/* DVB-C: 862000000 */ | ||||
| 		.symbol_rate_min = 100000, | ||||
| 		.symbol_rate_max = 100000000, | ||||
| 		.frequency_stepsize_hz	= 0, | ||||
| 		.frequency_tolerance_hz	= 0, | ||||
| 		.caps = FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_32 | | ||||
| 		FE_CAN_QAM_64 | FE_CAN_QAM_128 | FE_CAN_QAM_256 | | ||||
| 		FE_CAN_QAM_AUTO | | ||||
| 		FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | | ||||
| 		FE_CAN_FEC_4_5 | | ||||
| 		FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | | ||||
| 		FE_CAN_TRANSMISSION_MODE_AUTO | | ||||
| 		FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO | | ||||
| 		FE_CAN_RECOVER | FE_CAN_MUTE_TS | FE_CAN_2G_MODULATION | ||||
| 	}, | ||||
| 	.release                        = release, | ||||
| 	.get_frontend_algo              = get_algo, | ||||
| 	.get_frontend                   = get_frontend, | ||||
| 	.read_status                    = read_status, | ||||
| 	.tune                           = tune, | ||||
| 	.sleep                          = sleep, | ||||
| }; | ||||
|  | ||||
| static struct mci_cfg ddb_max_m_cfg = { | ||||
| 	.type = 0, | ||||
| 	.fe_ops = &m_ops, | ||||
| 	.base_size = sizeof(struct m4_base), | ||||
| 	.state_size = sizeof(struct m4), | ||||
| 	.init = init, | ||||
| 	.base_init = base_init, | ||||
| }; | ||||
|  | ||||
| static struct dvb_frontend_ops m_s_ops = { | ||||
| 	.delsys = { SYS_DVBS, SYS_DVBS2, SYS_ISDBS }, | ||||
| 	.info = { | ||||
| 		.name = "M_S", | ||||
| 		.frequency_min_hz = 47125000,	/* DVB-T: 47125000 */ | ||||
| 		.frequency_max_hz = 2150000000,	/* DVB-C: 862000000 */ | ||||
| 		.symbol_rate_min = 100000, | ||||
| 		.symbol_rate_max = 100000000, | ||||
| 		.frequency_stepsize_hz	= 0, | ||||
| 		.frequency_tolerance_hz	= 0, | ||||
| 		.caps = FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_32 | | ||||
| 		FE_CAN_QAM_64 | FE_CAN_QAM_128 | FE_CAN_QAM_256 | | ||||
| 		FE_CAN_QAM_AUTO | | ||||
| 		FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | | ||||
| 		FE_CAN_FEC_4_5 | | ||||
| 		FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | | ||||
| 		FE_CAN_TRANSMISSION_MODE_AUTO | | ||||
| 		FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO | | ||||
| 		FE_CAN_RECOVER | FE_CAN_MUTE_TS | FE_CAN_2G_MODULATION | ||||
| 	}, | ||||
| 	.release                        = release, | ||||
| 	.get_frontend_algo              = get_algo, | ||||
| 	.get_frontend                   = get_frontend, | ||||
| 	.read_status                    = read_status, | ||||
| 	.tune                           = tune, | ||||
| 	.sleep                          = sleep, | ||||
| }; | ||||
|  | ||||
| static struct mci_cfg ddb_max_m_s_cfg = { | ||||
| 	.type = 0, | ||||
| 	.fe_ops = &m_s_ops, | ||||
| 	.base_size = sizeof(struct m4_base), | ||||
| 	.state_size = sizeof(struct m4), | ||||
| 	.init = init, | ||||
| 	.base_init = base_init, | ||||
| }; | ||||
|  | ||||
| static struct dvb_frontend_ops m_a_ops = { | ||||
| 	.delsys = { SYS_DVBC_ANNEX_A, SYS_DVBC_ANNEX_B, SYS_DVBC_ANNEX_C, | ||||
| 		    SYS_ISDBC,  | ||||
| 		    SYS_DVBT, SYS_DVBT2, SYS_ISDBT, | ||||
| 	}, | ||||
| 	.info = { | ||||
| 		.name = "M_A", | ||||
| 		.frequency_min_hz = 47125000,	/* DVB-T: 47125000 */ | ||||
| 		.frequency_max_hz = 2150000000,	/* DVB-C: 862000000 */ | ||||
| 		.symbol_rate_min = 100000, | ||||
| 		.symbol_rate_max = 100000000, | ||||
| 		.frequency_stepsize_hz	= 0, | ||||
| 		.frequency_tolerance_hz	= 0, | ||||
| 		.caps = FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_32 | | ||||
| 		FE_CAN_QAM_64 | FE_CAN_QAM_128 | FE_CAN_QAM_256 | | ||||
| 		FE_CAN_QAM_AUTO | | ||||
| 		FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | | ||||
| 		FE_CAN_FEC_4_5 | | ||||
| 		FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | | ||||
| 		FE_CAN_TRANSMISSION_MODE_AUTO | | ||||
| 		FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO | | ||||
| 		FE_CAN_RECOVER | FE_CAN_MUTE_TS | FE_CAN_2G_MODULATION | ||||
| 	}, | ||||
| 	.release                        = release, | ||||
| 	.get_frontend_algo              = get_algo, | ||||
| 	.get_frontend                   = get_frontend, | ||||
| 	.read_status                    = read_status, | ||||
| 	.tune                           = tune, | ||||
| 	.sleep                          = sleep, | ||||
| }; | ||||
|  | ||||
| static struct mci_cfg ddb_max_m_a_cfg = { | ||||
| 	.type = 0, | ||||
| 	.fe_ops = &m_a_ops, | ||||
| 	.base_size = sizeof(struct m4_base), | ||||
| 	.state_size = sizeof(struct m4), | ||||
| 	.init = init, | ||||
| 	.base_init = base_init, | ||||
| }; | ||||
|  | ||||
| static struct mci_cfg *ddb_max_cfgs [] = { | ||||
| 	&ddb_max_m4_cfg, | ||||
| 	&ddb_max_m_a_cfg, | ||||
| 	&ddb_max_m_s_cfg, | ||||
| 	&ddb_max_m_cfg, | ||||
| }; | ||||
|  | ||||
| struct dvb_frontend *ddb_mx_attach(struct ddb_input *input, int nr, int tuner, int type) | ||||
| { | ||||
| 	return ddb_mci_attach(input, &ddb_max_m4_cfg, nr, tuner); | ||||
| 	return ddb_mci_attach(input, ddb_max_cfgs[type], nr, tuner); | ||||
| } | ||||
|  | ||||
| EXPORT_SYMBOL(ddb_mx_attach); | ||||
|  | ||||
|   | ||||
| @@ -417,7 +417,10 @@ static const struct pci_device_id ddb_id_table[] __devinitconst = { | ||||
| 	DDB_DEVICE_ANY(0x0011), | ||||
| 	DDB_DEVICE_ANY(0x0012), | ||||
| 	DDB_DEVICE_ANY(0x0013), | ||||
| 	DDB_DEVICE_ANY(0x0014), | ||||
| 	DDB_DEVICE_ANY(0x0020), | ||||
| 	DDB_DEVICE_ANY(0x0022), | ||||
| 	DDB_DEVICE_ANY(0x0024), | ||||
| 	DDB_DEVICE_ANY(0x0201), | ||||
| 	DDB_DEVICE_ANY(0x0203), | ||||
| 	DDB_DEVICE_ANY(0x0210), | ||||
|   | ||||
| @@ -28,6 +28,10 @@ | ||||
|  | ||||
| /* MAX LNB interface related module parameters */ | ||||
|  | ||||
| static int delmode; | ||||
| module_param(delmode, int, 0444); | ||||
| MODULE_PARM_DESC(delmode, "frontend delivery system mode"); | ||||
|  | ||||
| static int fmode; | ||||
| module_param(fmode, int, 0444); | ||||
| MODULE_PARM_DESC(fmode, "frontend emulation mode"); | ||||
| @@ -505,7 +509,8 @@ int ddb_fe_attach_mxl5xx(struct ddb_input *input) | ||||
| /* MAX MCI related functions */ | ||||
| struct dvb_frontend *ddb_sx8_attach(struct ddb_input *input, int nr, int tuner, | ||||
| 				    int (**fn_set_input)(struct dvb_frontend *fe, int input)); | ||||
| struct dvb_frontend *ddb_m4_attach(struct ddb_input *input, int nr, int tuner); | ||||
| struct dvb_frontend *ddb_mx_attach(struct ddb_input *input, int nr, int tuner, int type); | ||||
|  | ||||
|  | ||||
| int ddb_fe_attach_mci(struct ddb_input *input, u32 type) | ||||
| { | ||||
| @@ -523,11 +528,46 @@ int ddb_fe_attach_mci(struct ddb_input *input, u32 type) | ||||
| 		if (fm >= 3) | ||||
| 			tuner = 0; | ||||
| 		dvb->fe = ddb_sx8_attach(input, demod, tuner, &dvb->set_input); | ||||
| 		dvb->input = tuner; | ||||
| 		break; | ||||
| 	case DDB_TUNER_MCI_M4: | ||||
| 		fm = 0; | ||||
| 		dvb->fe = ddb_m4_attach(input, demod, tuner); | ||||
| 		dvb->fe = ddb_mx_attach(input, demod, tuner, 0); | ||||
| 		dvb->input = tuner; | ||||
| 		break; | ||||
| 	case DDB_TUNER_MCI_M8: | ||||
| 		fm = 3; | ||||
| 		dvb->fe = ddb_mx_attach(input, demod, tuner, 1); | ||||
| 		dvb->input = 0; | ||||
| 		break; | ||||
| 	case DDB_TUNER_MCI_M8A: | ||||
| 		fm = 3; | ||||
| 		dvb->fe = ddb_mx_attach(input, demod, tuner, 2); | ||||
| 		dvb->input = 0; | ||||
| 		break; | ||||
| 	case DDB_TUNER_MCI_M2: | ||||
| 	{ | ||||
| 		u32 mode, mmode; | ||||
| 		 | ||||
|                 // delmode: 0 - sat,sat  1-cable,cable/sat  | ||||
| 		switch (delmode & 1) { | ||||
| 		case 0: | ||||
| 			mode = 2; | ||||
| 			mmode = 2; | ||||
| 			break; | ||||
| 		case 1: | ||||
| 			mode = 1; | ||||
| 			mmode = demod ? 3 : 1; | ||||
| 			break; | ||||
| 		} | ||||
| 		if (!demod) | ||||
| 			ddb_mci_cmd_link_simple(link, MCI_CMD_SET_INPUT_CONFIG, | ||||
| 						0xff, mode | (delmode & 0x10)); | ||||
| 		dvb->fe = ddb_mx_attach(input, demod, tuner, mmode); | ||||
| 		dvb->input = 0; | ||||
| 		fm = 0; | ||||
| 		break; | ||||
| 	} | ||||
| 	default: | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| @@ -535,7 +575,7 @@ int ddb_fe_attach_mci(struct ddb_input *input, u32 type) | ||||
| 		dev_err(dev->dev, "No MCI card found!\n"); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 	if (input->nr < 4) { | ||||
| 	if (!input->nr || (input->nr < 4 && type != DDB_TUNER_MCI_M8)) { | ||||
| 		lnb_command(dev, port->lnr, input->nr, LNB_CMD_INIT); | ||||
| 		lnb_set_voltage(dev, port->lnr, input->nr, SEC_VOLTAGE_OFF); | ||||
| 	} | ||||
| @@ -548,15 +588,10 @@ int ddb_fe_attach_mci(struct ddb_input *input, u32 type) | ||||
| 	dvb->fe->ops.diseqc_send_master_cmd = max_send_master_cmd; | ||||
| 	dvb->fe->ops.diseqc_send_burst = max_send_burst; | ||||
| 	dvb->fe->sec_priv = input; | ||||
| 	switch (type) { | ||||
| 	case DDB_TUNER_MCI_M4: | ||||
| 		break; | ||||
| 	default: | ||||
| 	if (type == DDB_TUNER_MCI_SX8) { | ||||
| #ifndef KERNEL_DVB_CORE | ||||
| 		dvb->fe->ops.set_input = max_set_input; | ||||
| #endif | ||||
| 		break; | ||||
| 	} | ||||
| 	dvb->input = tuner; | ||||
| 	return 0; | ||||
| } | ||||
|   | ||||
| @@ -321,6 +321,9 @@ struct ddb_port { | ||||
| #define DDB_TUNER_MCI            48 | ||||
| #define DDB_TUNER_MCI_SX8       (DDB_TUNER_MCI + 0) | ||||
| #define DDB_TUNER_MCI_M4        (DDB_TUNER_MCI + 1) | ||||
| #define DDB_TUNER_MCI_M8        (DDB_TUNER_MCI + 2) | ||||
| #define DDB_TUNER_MCI_M8A       (DDB_TUNER_MCI + 3) | ||||
| #define DDB_TUNER_MCI_M2        (DDB_TUNER_MCI + 4) | ||||
|  | ||||
| 	struct ddb_input      *input[2]; | ||||
| 	struct ddb_output     *output; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 internal
					internal