Re: TT-Budget S1500 CI not working

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



	Hello !

In fact the code of the 1500s is written in budget.c rather than in
budget-ci.c

I mailed two patches a few days ago in this list but I had no return
from the linuxtv guys yet. I was waiting return for these before sending
the third patch that actually moves the code from budget.c to
budget-ci.c

Attached is the patch (experimental...), to be applied on top on the two
others which moves the code from budget.c to budget.ci.

Tell me if it works for you...

Perceval.

On Mon, 2006-02-13 at 08:58 +0100, Vsevolod Kukol wrote:
> Hi,
> I've got the new TT-Budget S1500 card with the additional CI card. The
> budget card itself works fine with the latest marcial checkout, kernel
> 2.6.15 and VDR 1.3.42, but the CI doesn't get recognized :(
> 
> | vdrclient # lspci -v
> | 02:09.0 Multimedia controller: Philips Semiconductors SAA7146 (rev 01)
> |         Subsystem: Technotrend Systemtechnik GmbH Unknown device 1017
> |         Flags: bus master, medium devsel, latency 66, IRQ 18
> |         Memory at 40200000 (32-bit, non-prefetchable) [size=512]
> 
> | vdrclient # lspci -v
> | 02:09.0 0480: 1131:7146 (rev 01)
> |         Subsystem: 13c2:1017
> |         Flags: bus master, medium devsel, latency 66, IRQ 18
> |         Memory at 40200000 (32-bit, non-prefetchable) [size=512]
> 
> And I get the following messages when loading the modules:
> 
> | Feb 13 01:24:26 vdrclient kernel: saa7146: register extension 'budget
> dvb'.
> | Feb 13 01:24:27 vdrclient kernel: ACPI: PCI Interrupt 0000:02:09.0[A] ->
> GSI 18 (level, low) -> IRQ 18
> | Feb 13 01:24:27 vdrclient kernel: saa7146: found saa7146 @ mem c893a000
> (revision 1, irq 18) (0x13c2,0x1017).
> | Feb 13 01:24:27 vdrclient kernel: DVB: registering new adapter
> (TT-Budget/WinTV-NOVA-S PCI (rev AL/alps bsbe1 lnbp21 frontend)).
> | Feb 13 01:24:27 vdrclient kernel: adapter has MAC addr = XXXXXXXXXX
> | Feb 13 01:24:27 vdrclient kernel: DVB: registering frontend 0 (ST STV0299
> DVB-S)...
> 
> Why does the budget module detect the card and not budget-ci? Is it not the
> same card type like the TT C1500 or T1500?
> 
> Thanks for help!
> 
> Vsevolod Kukol
> 
> 
> 
> _______________________________________________
> 
> linux-dvb@xxxxxxxxxxx
> http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb
> 
Index: v4l-dvb/linux/drivers/media/dvb/ttpci/budget-ci.c
===================================================================
--- v4l-dvb.orig/linux/drivers/media/dvb/ttpci/budget-ci.c	2005-12-04 02:12:43.000000000 +0100
+++ v4l-dvb/linux/drivers/media/dvb/ttpci/budget-ci.c	2006-01-30 12:13:33.000000000 +0100
@@ -1021,12 +1021,167 @@
 	.pll_set = dvbc_philips_tdm1316l_pll_set,
 };
 
+static int lnbp21_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
+{
+	struct budget* budget = (struct budget*) fe->dvb->priv;
+	u8 buf;
+	struct i2c_msg msg = { .addr = 0x08, .flags = I2C_M_RD, .buf = &buf, .len = sizeof(buf) };
+
+	if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO;
+
+	switch(voltage) {
+	case SEC_VOLTAGE_13:
+		buf = (buf & 0xf3) | 0x04;
+		break;
+
+	case SEC_VOLTAGE_18:
+		buf = (buf & 0xf3) | 0x0c;
+		break;
+
+	case SEC_VOLTAGE_OFF:
+		buf = buf & 0xf3;
+		break;
+	}
+
+	msg.flags = 0;
+	if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO;
+
+	return 0;
+}
 
+static int lnbp21_enable_high_lnb_voltage_ (struct i2c_adapter* i2c_adap, long arg)
+{
+	u8 buf;
+	struct i2c_msg msg = { .addr = 0x08, .flags = I2C_M_RD, .buf = &buf, .len = sizeof(buf) };
+
+	dprintk (2, "%s - enabling high lnb voltage : %ld\n", __FUNCTION__, arg);
+
+	if (i2c_transfer (i2c_adap, &msg, 1) != 1) return -EIO;
+
+	if (arg) {
+		buf = buf | 0x10;
+	} else {
+		buf = buf & 0xef;
+	}
 
+	msg.flags = 0;
+	if (i2c_transfer (i2c_adap, &msg, 1) != 1) return -EIO;
+
+	return 0;
+}
+
+static int lnbp21_enable_high_lnb_voltage(struct dvb_frontend* fe, long arg)
+{
+	struct budget* budget = (struct budget*) fe->dvb->priv;
+
+	return lnbp21_enable_high_lnb_voltage_ (&budget->i2c_adap, arg);
+}
+
+static int lnbp21_init(struct budget* budget)
+{
+	u8 buf = 0x00;
+	struct i2c_msg msg = { .addr = 0x08, .flags = 0, .buf = &buf, .len = sizeof(buf) };
+
+	if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1)
+		return -EIO;
+	return 0;
+}
+
+static u8 alps_bsbe1_inittab[] = {
+	0x01, 0x15,
+	0x02, 0x30,
+	0x03, 0x00,
+	0x04, 0x7d,  /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
+	0x05, 0x35,  /* I2CT = 0, SCLT = 1, SDAT = 1 */
+	0x06, 0x40,  /* DAC not used, set to high impendance mode */
+	0x07, 0x00,  /* DAC LSB */
+	0x08, 0x40,  /* DiSEqC off, LNB power on OP2/LOCK pin on */
+	0x09, 0x00,  /* FIFO */
+	0x0c, 0x51,  /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
+	0x0d, 0x82,  /* DC offset compensation = ON, beta_agc1 = 2 */
+	0x0e, 0x23,  /* alpha_tmg = 2, beta_tmg = 3 */
+	0x10, 0x3f,  // AGC2 0x3d
+	0x11, 0x84,
+	0x12, 0xb9,
+	0x15, 0xc9,  // lock detector threshold
+	0x16, 0x00,
+	0x17, 0x00,
+	0x18, 0x00,
+	0x19, 0x00,
+	0x1a, 0x00,
+	0x1f, 0x50,
+	0x20, 0x00,
+	0x21, 0x00,
+	0x22, 0x00,
+	0x23, 0x00,
+	0x28, 0x00, // out imp: normal out type: parallel FEC mode:0
+	0x29, 0x1e, // 1/2 threshold
+	0x2a, 0x14, // 2/3 threshold
+	0x2b, 0x0f, // 3/4 threshold
+	0x2c, 0x09, // 5/6 threshold
+	0x2d, 0x05, // 7/8 threshold
+	0x2e, 0x01,
+	0x31, 0x1f, // test all FECs
+	0x32, 0x19, // viterbi and synchro search
+	0x33, 0xfc, // rs control
+	0x34, 0x93, // error control
+	0x0f, 0x92, // 0x80 = inverse AGC
+	0xff, 0xff
+};
+
+static int alps_bsbe1_pll_set(struct dvb_frontend* fe, struct i2c_adapter *i2c, struct dvb_frontend_parameters* params)
+{
+	int ret;
+	u8 data[4];
+	u32 div;
+	struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
+
+	if ((params->frequency < 950000) || (params->frequency > 2150000))
+		return -EINVAL;
+
+	div = (params->frequency + (125 - 1)) / 125; // round correctly
+	data[0] = (div >> 8) & 0x7f;
+	data[1] = div & 0xff;
+	data[2] = 0x80 | ((div & 0x18000) >> 10) | 4;
+	data[3] = (params->frequency > 1530000) ? 0xE0 : 0xE4;
+
+	ret = i2c_transfer(i2c, &msg, 1);
+	return (ret != 1) ? -EIO : 0;
+}
+
+static struct stv0299_config alps_bsbe1_config = {
+	.demod_address = 0x68,
+	.inittab = alps_bsbe1_inittab,
+	.mclk = 88000000UL,
+	.invert = 1,
+	.skip_reinit = 0,
+	.min_delay_ms = 100,
+	.set_symbol_rate = alps_bsru6_set_symbol_rate,
+	.pll_set = alps_bsbe1_pll_set,
+};
 
 static void frontend_init(struct budget_ci *budget_ci)
 {
 	switch (budget_ci->budget.dev->pci->subsystem_device) {
+	case 0x1017:
+		// try the ALPS BSBE1 now
+		budget_ci->budget.dvb_frontend = stv0299_attach(&alps_bsbe1_config, &budget_ci->budget.i2c_adap);
+		if (budget_ci->budget.dvb_frontend) {
+			budget_ci->budget.dvb_frontend->ops->set_voltage = lnbp21_set_voltage;
+			budget_ci->budget.dvb_frontend->ops->enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage;
+			budget_ci->budget.dvb_frontend->ops->dishnetwork_send_legacy_command = NULL;
+			if (lnbp21_init(&budget_ci->budget)) {
+				printk("%s: No LNBP21 found!\n", __FUNCTION__);
+				goto error_out;
+			}
+			if (lnbp21_enable_high_lnb_voltage_ (&budget_ci->budget.i2c_adap, 1) != 0) {
+				printk ("%s: Couldn't set LNBP21 LLC flag!\n", __FUNCTION__);
+				goto error_out;
+			}
+		}
+
+		break;
+
 	case 0x100c:		// Hauppauge/TT Nova-CI budget (stv0299/ALPS BSRU6(tsa5059))
 		budget_ci->budget.dvb_frontend =
 			stv0299_attach(&alps_bsru6_config, &budget_ci->budget.i2c_adap);
@@ -1086,6 +1241,14 @@
 			budget_ci->budget.dvb_frontend = NULL;
 		}
 	}
+	return;
+
+error_out:
+	printk("budget-ci: Frontend registration failed!\n");
+	if (budget_ci->budget.dvb_frontend->ops->release)
+		budget_ci->budget.dvb_frontend->ops->release(budget_ci->budget.dvb_frontend);
+	budget_ci->budget.dvb_frontend = NULL;
+	return;
 }
 
 static int budget_ci_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data *info)
@@ -1150,8 +1313,10 @@
 MAKE_BUDGET_INFO(ttbt2, "TT-Budget/WinTV-NOVA-T	 PCI", BUDGET_TT);
 MAKE_BUDGET_INFO(ttbtci, "TT-Budget-T-CI PCI", BUDGET_TT);
 MAKE_BUDGET_INFO(ttbcci, "TT-Budget-C-CI PCI", BUDGET_TT);
+MAKE_BUDGET_INFO(ttbs2, "TT-Budget/WinTV-NOVA-S/CI PCI (rev AL/alps bsbe1 lnbp21 frontend)", BUDGET_TT);
 
 static struct pci_device_id pci_tbl[] = {
+	MAKE_EXTENSION_PCI(ttbs2, 0x13c2, 0x1017),
 	MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100c),
 	MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100f),
 	MAKE_EXTENSION_PCI(ttbcci, 0x13c2, 0x1010),
Index: v4l-dvb/linux/drivers/media/dvb/ttpci/budget.c
===================================================================
--- v4l-dvb.orig/linux/drivers/media/dvb/ttpci/budget.c	2006-01-20 11:42:31.000000000 +0100
+++ v4l-dvb/linux/drivers/media/dvb/ttpci/budget.c	2006-01-30 10:36:00.000000000 +0100
@@ -588,24 +588,6 @@
 static void frontend_init(struct budget *budget)
 {
 	switch(budget->dev->pci->subsystem_device) {
-	case 0x1017:
-		// try the ALPS BSBE1 now
-		budget->dvb_frontend = stv0299_attach(&alps_bsbe1_config, &budget->i2c_adap);
-		if (budget->dvb_frontend) {
-			budget->dvb_frontend->ops->set_voltage = lnbp21_set_voltage;
-			budget->dvb_frontend->ops->enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage;
-			budget->dvb_frontend->ops->dishnetwork_send_legacy_command = NULL;
-			if (lnbp21_init(budget)) {
-				printk("%s: No LNBP21 found!\n", __FUNCTION__);
-				goto error_out;
-			}
-			if (lnbp21_enable_high_lnb_voltage_ (&budget->i2c_adap, 1) != 0) {
-				printk ("%s: Couldn't set LNBP21 LLC flag!\n", __FUNCTION__);
-				goto error_out;
-			}
-		}
-
-		break;
 	case 0x1003: // Hauppauge/TT Nova budget (stv0299/ALPS BSRU6(tsa5059) OR ves1893/ALPS BSRV2(sp5659))
 	case 0x1013:
 		// try the ALPS BSRV2 first of all
_______________________________________________

linux-dvb@xxxxxxxxxxx
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

[Index of Archives]     [Linux Media]     [Video 4 Linux]     [Asterisk]     [Samba]     [Xorg]     [Xfree86]     [Linux USB]

  Powered by Linux