|
@@ -155,6 +155,47 @@ static void release(struct dvb_frontend *fe)
|
|
|
kfree(state);
|
|
|
}
|
|
|
|
|
|
+static int get_info(struct dvb_frontend *fe)
|
|
|
+{
|
|
|
+ int stat;
|
|
|
+ struct mci *state = fe->demodulator_priv;
|
|
|
+ struct mci_command cmd;
|
|
|
+
|
|
|
+ memset(&cmd, 0, sizeof(cmd));
|
|
|
+ cmd.command = MCI_CMD_GETSIGNALINFO;
|
|
|
+ cmd.demod = state->demod;
|
|
|
+ stat = mci_cmd(state, &cmd, &state->signal_info);
|
|
|
+ return stat;
|
|
|
+}
|
|
|
+
|
|
|
+static int get_snr(struct dvb_frontend *fe)
|
|
|
+{
|
|
|
+ struct mci *state = fe->demodulator_priv;
|
|
|
+ struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
|
|
+
|
|
|
+ p->cnr.len = 1;
|
|
|
+ p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
|
|
|
+ p->cnr.stat[0].svalue =
|
|
|
+ (s64)state->signal_info.dvbs2_signal_info.signal_to_noise
|
|
|
+ * 10;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int get_strength(struct dvb_frontend *fe)
|
|
|
+{
|
|
|
+ struct mci *state = fe->demodulator_priv;
|
|
|
+ struct dtv_frontend_properties *p = &fe->dtv_property_cache;
|
|
|
+ s32 str;
|
|
|
+
|
|
|
+ str = 100000 -
|
|
|
+ (state->signal_info.dvbs2_signal_info.channel_power
|
|
|
+ * 10 + 108750);
|
|
|
+ p->strength.len = 1;
|
|
|
+ p->strength.stat[0].scale = FE_SCALE_DECIBEL;
|
|
|
+ p->strength.stat[0].svalue = str;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int read_status(struct dvb_frontend *fe, enum fe_status *status)
|
|
|
{
|
|
|
int stat;
|
|
@@ -168,10 +209,14 @@ static int read_status(struct dvb_frontend *fe, enum fe_status *status)
|
|
|
if (stat)
|
|
|
return stat;
|
|
|
*status = 0x00;
|
|
|
+ get_info(fe);
|
|
|
+ get_strength(fe);
|
|
|
if (res.status == SX8_DEMOD_WAIT_MATYPE)
|
|
|
*status = 0x0f;
|
|
|
- if (res.status == SX8_DEMOD_LOCKED)
|
|
|
+ if (res.status == SX8_DEMOD_LOCKED) {
|
|
|
*status = 0x1f;
|
|
|
+ get_snr(fe);
|
|
|
+ }
|
|
|
return stat;
|
|
|
}
|
|
|
|