cx24116: change to ALGO_HW
authordarron@kewl.org
Wed, 19 Nov 2008 15:38:48 +0000
changeset 9661 b9c802efb7ae
parent 9660 7973f6a1a203
child 9662 5788dc77158c
cx24116: change to ALGO_HW

From: Darron Broad <darron@kewl.org>

Slow tuning, EG:

> szap-s2 -r -c 39.FTATV "1=Pgm1;Net1"
reading channels from file '39.FTATV'
zapping to 3 '1=Pgm1;Net1':
delivery DVB-S, modulation QPSK
sat 0, frequency 11140 MHz V, symbolrate 1425000, coderate 5/6, rolloff 0.35
vpid 0x0200, apid 0x0300, sid 0x0001
using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
status 00 | signal c2c0 | snr 0000 | ber 00012d4a | unc 00000000 |
status 03 | signal ff80 | snr 0000 | ber 00000000 | unc 00000000 |
status 01 | signal ff80 | snr 0000 | ber 00000000 | unc 00000000 |
status 01 | signal ff80 | snr 0000 | ber 00000000 | unc 00000000 |
status 03 | signal c040 | snr 0000 | ber 00000000 | unc 00000000 |
status 03 | signal ff80 | snr 0000 | ber 00000000 | unc 00000000 |
status 01 | signal ff80 | snr 0000 | ber 00000000 | unc 00000000 |
status 03 | signal c040 | snr 0000 | ber 00000000 | unc 00000000 |
status 01 | signal ff80 | snr 0000 | ber 00000000 | unc 00000000 |
status 01 | signal ff80 | snr 0000 | ber 00000000 | unc 00000000 |
status 01 | signal c040 | snr 0000 | ber 00000000 | unc 00000000 |
status 01 | signal ff80 | snr 0000 | ber 00000000 | unc 00000000 |
status 01 | signal ff80 | snr 0000 | ber 00000000 | unc 00000000 |
status 01 | signal c040 | snr 0000 | ber 00000000 | unc 00000000 |
status 03 | signal c040 | snr 0000 | ber 00000000 | unc 00000000 |
status 1f | signal c040 | snr bb33 | ber 00000000 | unc 00000000 | FE_HAS_LOCK

Appears to be resolved by dropping zig-zag tuning and relying on
hardware only:

> szap-s2 -r -c 39.FTATV "1=Pgm1;Net1"
reading channels from file '39.FTATV'
zapping to 3 '1=Pgm1;Net1':
delivery DVB-S, modulation QPSK
sat 0, frequency 11140 MHz V, symbolrate 1425000, coderate 5/6, rolloff 0.35
vpid 0x0200, apid 0x0300, sid 0x0001
using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
status 01 | signal ff80 | snr 0000 | ber 00000000 | unc 00000000 |
status 1f | signal ff80 | snr c199 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
status 1f | signal c040 | snr c199 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
status 1f | signal ff80 | snr c199 | ber 00000000 | unc 00000000 | FE_HAS_LOCK

Tuning to a weaker channel shows that the hardware recovers sync:

status 1f | signal fe40 | snr 5199 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
status 03 | signal fd40 | snr 5000 | ber 00000000 | unc 00000000 |
status 1f | signal fe40 | snr 5000 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
status 03 | signal fd80 | snr 5000 | ber 00000000 | unc 00000000 |
status 01 | signal fd80 | snr 4e66 | ber 00000000 | unc 00000000 |
status 1f | signal fe40 | snr 5000 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
status 03 | signal fe40 | snr 5000 | ber 00000000 | unc 00000000 |
status 01 | signal fd80 | snr 0000 | ber 00000000 | unc 00000000 |
status 1f | signal fe40 | snr 5199 | ber 00000000 | unc 00000000 | FE_HAS_LOCK

Priority: normal

Signed-off-by: Darron Broad <darron@kewl.org>
linux/drivers/media/dvb/frontends/cx24116.c
--- a/linux/drivers/media/dvb/frontends/cx24116.c	Wed Nov 19 15:38:15 2008 +0000
+++ b/linux/drivers/media/dvb/frontends/cx24116.c	Wed Nov 19 15:38:48 2008 +0000
@@ -106,7 +106,7 @@
 #define CX24116_HAS_SYNCLOCK (0x08)
 #define CX24116_HAS_UNKNOWN1 (0x10)
 #define CX24116_HAS_UNKNOWN2 (0x20)
-#define CX24116_STATUS_MASK  (0x3f)
+#define CX24116_STATUS_MASK  (0x0f)
 #define CX24116_SIGNAL_MASK  (0xc0)
 
 #define CX24116_DISEQC_TONEOFF   (0)    /* toneburst never sent */
@@ -681,7 +681,8 @@
 {
 	struct cx24116_state *state = fe->demodulator_priv;
 
-	int lock = cx24116_readreg(state, CX24116_REG_SSTATUS);
+	int lock = cx24116_readreg(state, CX24116_REG_SSTATUS) &
+		CX24116_STATUS_MASK;
 
 	dprintk("%s: status = 0x%02x\n", __func__, lock);
 
@@ -1448,6 +1449,23 @@
 	return ret;
 }
 
+static int cx24116_tune(struct dvb_frontend *fe, struct dvb_frontend_parameters *params,
+	unsigned int mode_flags, unsigned int *delay, fe_status_t *status)
+{
+	*delay = HZ / 5;
+	if (params) {
+		int ret = cx24116_set_frontend(fe, params);
+		if (ret)
+			return ret;
+	}
+	return cx24116_read_status(fe, status);
+}
+
+static int cx24116_get_algo(struct dvb_frontend *fe)
+{
+	return DVBFE_ALGO_HW;
+}
+
 static struct dvb_frontend_ops cx24116_ops = {
 
 	.info = {
@@ -1479,6 +1497,8 @@
 	.set_voltage = cx24116_set_voltage,
 	.diseqc_send_master_cmd = cx24116_send_diseqc_msg,
 	.diseqc_send_burst = cx24116_diseqc_send_burst,
+	.get_frontend_algo = cx24116_get_algo,
+	.tune = cx24116_tune,
 
 	.set_property = cx24116_set_property,
 	.get_property = cx24116_get_property,