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.
# HG changeset patch # User Trent Piepho <xyzzy@xxxxxxxxxxxxx> # Node ID 1226b4954757859de0d25e0d408f6ab02a913712 # Parent c42c55c1095ae910401c73147c4dbf3f0e3a5551 Add support for FE_GET_FRONTEND to or51132 frontend From: Trent Piepho <xyzzy@xxxxxxxxxxxxx> 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@xxxxxxxxxxxxx> 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,
_______________________________________________ linux-dvb@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb