diff options
author | Malcolm Priestley <tvboxspy@gmail.com> | 2011-11-06 09:19:14 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-11-08 08:23:03 -0500 |
commit | 3339a5b165c2769a84346cac342ade67d7b7a510 (patch) | |
tree | 54c6996243790a4618f365e5f0d2fb716bafc233 /drivers/media/dvb | |
parent | c540d9f13d1f0f6913434b0b8241bb6270818769 (diff) |
[media] it913x-fe ver 1.10 correct SNR reading from frontend
Correction of reading from frontend and represents
a SNR nonlinear scale of minimum signal to full signal.
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb')
-rw-r--r-- | drivers/media/dvb/frontends/it913x-fe.c | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/drivers/media/dvb/frontends/it913x-fe.c b/drivers/media/dvb/frontends/it913x-fe.c index 6d12dccf5ce..07c1b4601b1 100644 --- a/drivers/media/dvb/frontends/it913x-fe.c +++ b/drivers/media/dvb/frontends/it913x-fe.c | |||
@@ -53,6 +53,8 @@ struct it913x_fe_state { | |||
53 | struct ite_config *config; | 53 | struct ite_config *config; |
54 | u8 i2c_addr; | 54 | u8 i2c_addr; |
55 | u32 frequency; | 55 | u32 frequency; |
56 | fe_modulation_t constellation; | ||
57 | fe_transmit_mode_t transmission_mode; | ||
56 | u32 crystalFrequency; | 58 | u32 crystalFrequency; |
57 | u32 adcFrequency; | 59 | u32 adcFrequency; |
58 | u8 tuner_type; | 60 | u8 tuner_type; |
@@ -496,14 +498,50 @@ static int it913x_fe_read_signal_strength(struct dvb_frontend *fe, | |||
496 | return 0; | 498 | return 0; |
497 | } | 499 | } |
498 | 500 | ||
499 | static int it913x_fe_read_snr(struct dvb_frontend *fe, u16* snr) | 501 | static int it913x_fe_read_snr(struct dvb_frontend *fe, u16 *snr) |
500 | { | 502 | { |
501 | struct it913x_fe_state *state = fe->demodulator_priv; | 503 | struct it913x_fe_state *state = fe->demodulator_priv; |
502 | int ret = it913x_read_reg_u8(state, SIGNAL_QUALITY); | 504 | int ret; |
503 | ret = (ret * 0xff) / 0x64; | 505 | u8 reg[3]; |
504 | ret |= (ret << 0x8); | 506 | u32 snr_val, snr_min, snr_max; |
505 | *snr = ~ret; | 507 | u32 temp; |
506 | return 0; | 508 | |
509 | ret = it913x_read_reg(state, 0x2c, reg, sizeof(reg)); | ||
510 | |||
511 | snr_val = (u32)(reg[2] << 16) | (reg[1] < 8) | reg[0]; | ||
512 | |||
513 | ret |= it913x_read_reg(state, 0xf78b, reg, 1); | ||
514 | if (reg[0]) | ||
515 | snr_val /= reg[0]; | ||
516 | |||
517 | if (state->transmission_mode == TRANSMISSION_MODE_2K) | ||
518 | snr_val *= 4; | ||
519 | else if (state->transmission_mode == TRANSMISSION_MODE_4K) | ||
520 | snr_val *= 2; | ||
521 | |||
522 | if (state->constellation == QPSK) { | ||
523 | snr_min = 0xb4711; | ||
524 | snr_max = 0x191451; | ||
525 | } else if (state->constellation == QAM_16) { | ||
526 | snr_min = 0x4f0d5; | ||
527 | snr_max = 0xc7925; | ||
528 | } else if (state->constellation == QAM_64) { | ||
529 | snr_min = 0x256d0; | ||
530 | snr_max = 0x626be; | ||
531 | } else | ||
532 | return -EINVAL; | ||
533 | |||
534 | if (snr_val < snr_min) | ||
535 | *snr = 0; | ||
536 | else if (snr_val < snr_max) { | ||
537 | temp = (snr_val - snr_min) >> 5; | ||
538 | temp *= 0xffff; | ||
539 | temp /= (snr_max - snr_min) >> 5; | ||
540 | *snr = (u16)temp; | ||
541 | } else | ||
542 | *snr = 0xffff; | ||
543 | |||
544 | return (ret < 0) ? -ENODEV : 0; | ||
507 | } | 545 | } |
508 | 546 | ||
509 | static int it913x_fe_read_ber(struct dvb_frontend *fe, u32 *ber) | 547 | static int it913x_fe_read_ber(struct dvb_frontend *fe, u32 *ber) |
@@ -530,9 +568,13 @@ static int it913x_fe_get_frontend(struct dvb_frontend *fe, | |||
530 | if (reg[3] < 3) | 568 | if (reg[3] < 3) |
531 | p->u.ofdm.constellation = fe_con[reg[3]]; | 569 | p->u.ofdm.constellation = fe_con[reg[3]]; |
532 | 570 | ||
571 | state->constellation = p->u.ofdm.constellation; | ||
572 | |||
533 | if (reg[0] < 3) | 573 | if (reg[0] < 3) |
534 | p->u.ofdm.transmission_mode = fe_mode[reg[0]]; | 574 | p->u.ofdm.transmission_mode = fe_mode[reg[0]]; |
535 | 575 | ||
576 | state->transmission_mode = p->u.ofdm.transmission_mode; | ||
577 | |||
536 | if (reg[1] < 4) | 578 | if (reg[1] < 4) |
537 | p->u.ofdm.guard_interval = fe_gi[reg[1]]; | 579 | p->u.ofdm.guard_interval = fe_gi[reg[1]]; |
538 | 580 | ||
@@ -888,5 +930,5 @@ static struct dvb_frontend_ops it913x_fe_ofdm_ops = { | |||
888 | 930 | ||
889 | MODULE_DESCRIPTION("it913x Frontend and it9137 tuner"); | 931 | MODULE_DESCRIPTION("it913x Frontend and it9137 tuner"); |
890 | MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com"); | 932 | MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com"); |
891 | MODULE_VERSION("1.09"); | 933 | MODULE_VERSION("1.10"); |
892 | MODULE_LICENSE("GPL"); | 934 | MODULE_LICENSE("GPL"); |