[linux-dvb] [PATCH] Add support for the FE_GET_FRONTEND ioctl to or51132

Trent Piepho xyzzy at speakeasy.org
Thu Apr 6 06:11:03 CEST 2006


Pretty much just that.  I was able to figure out how to read the current
modulation without the datasheet, so that information comes from the hardware.
frequency comes from the driver's state, rather than reading the tuner.  The
inversion setting is ignored by the driver, no ATSC frontends use it in fact. I
just return auto inversion.
-------------- next part --------------
# HG changeset patch
# User Trent Piepho <xyzzy at speakeasy.org>
# Node ID 1226b4954757859de0d25e0d408f6ab02a913712
# Parent  c42c55c1095ae910401c73147c4dbf3f0e3a5551
Add support for FE_GET_FRONTEND to or51132 frontend

From: Trent Piepho <xyzzy at speakeasy.org>

Adds the FE_GET_FRONTEND ioctl to the or51132 frontend.  Current modulation is
read from the hardware, while frequency is taken from the driver's state.

Signed-off-by: Trent Piepho <xyzzy at speakeasy.org>

diff -r c42c55c1095a -r 1226b4954757 linux/drivers/media/dvb/frontends/or51132.c
--- a/linux/drivers/media/dvb/frontends/or51132.c	Wed Apr  5 18:48:44 2006 -0700
+++ b/linux/drivers/media/dvb/frontends/or51132.c	Wed Apr  5 19:28:20 2006 -0700
@@ -400,6 +400,44 @@ static int or51132_set_parameters(struct
 	return 0;
 }
 
+static int or51132_get_parameters(struct dvb_frontend* fe,
+				  struct dvb_frontend_parameters *param)
+{
+	struct or51132_state* state = fe->demodulator_priv;
+	u8 buf[2];
+
+	/* Receiver Status */
+	buf[0]=0x04;
+	buf[1]=0x00;
+	msleep(30); /* 30ms */
+	if (i2c_writebytes(state,state->config->demod_address,buf,2)) {
+		printk(KERN_WARNING "or51132: get_parameters write error\n");
+		return -EREMOTEIO;
+	}
+	msleep(30); /* 30ms */
+	if (i2c_readbytes(state,state->config->demod_address,buf,2)) {
+		printk(KERN_WARNING "or51132: get_parameters read error\n");
+		return -EREMOTEIO;
+	}
+	switch(buf[0]) {
+		case 0x06: param->u.vsb.modulation = VSB_8; break;
+		case 0x43: param->u.vsb.modulation = QAM_64; break;
+		case 0x45: param->u.vsb.modulation = QAM_256; break;
+		default:
+			printk(KERN_WARNING "or51132: unknown status 0x%02x\n",
+			       buf[0]);
+			return -EREMOTEIO;
+	}
+
+	/* FIXME: Read frequency from frontend, take AFC into account */
+	param->frequency = state->current_frequency;
+
+	/* FIXME: How to read inversion setting? Receiver 6 register? */
+	param->inversion = INVERSION_AUTO;
+
+	return 0;
+}
+
 static int or51132_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
 	struct or51132_state* state = fe->demodulator_priv;
@@ -618,6 +656,7 @@ static struct dvb_frontend_ops or51132_o
 	.sleep = or51132_sleep,
 
 	.set_frontend = or51132_set_parameters,
+	.get_frontend = or51132_get_parameters,
 	.get_tune_settings = or51132_get_tune_settings,
 
 	.read_status = or51132_read_status,


More information about the linux-dvb mailing list