Re: [PATCH 2/2] stv090x: on tuning lock return correct tuned paramaters like freq/sr/fec/rolloff/etc

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jul 24, 2013 at 9:38 PM, Chris Lee <updatelee@xxxxxxxxx> wrote:
>
> If you need it broken up more just let me know, I look forward to comments, thanks
>

Sorry about the late comments, have been a bit too busy ..

I have a bit hard time, understanding the need for some of the changes.
Comments, inline.


> Chris
>
> ---
>  drivers/media/dvb-frontends/stv090x.c     | 182 ++++++++++++++++++++++++++++--
>  drivers/media/dvb-frontends/stv090x_reg.h |   2 +
>  2 files changed, 172 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/media/dvb-frontends/stv090x.c b/drivers/media/dvb-frontends/stv090x.c
> index 56d470a..474584f 100644
> --- a/drivers/media/dvb-frontends/stv090x.c
> +++ b/drivers/media/dvb-frontends/stv090x.c
> @@ -1678,6 +1678,7 @@ static u32 stv090x_get_srate(struct stv090x_state *state, u32 clk)
>                 ((int_1 * tmp_2) >> 16) +
>                 ((int_2 * tmp_1) >> 16);
>
> +       state->srate = srate;
>         return srate;
>  }
>
> @@ -2592,6 +2593,94 @@ static int stv090x_get_viterbi(struct stv090x_state *state)
>  static enum stv090x_signal_state stv090x_get_sig_params(struct stv090x_state *state)
>  {
>         struct dvb_frontend *fe = &state->frontend;
> +       struct dtv_frontend_properties *props = &fe->dtv_property_cache;
> +
> +       int fe_stv0900_tracking_standard_return[] = {
> +               SYS_UNDEFINED,
> +               SYS_DVBS,
> +               SYS_DVBS2,
> +               SYS_DSS
> +       };
> +
> +       int fe_stv0900_rolloff_return[] = {
> +               ROLLOFF_35,
> +               ROLLOFF_25,
> +               ROLLOFF_20,
> +               ROLLOFF_AUTO
> +       };
> +
> +       int fe_stv0900_modulation_return[] = {
> +               QPSK,
> +               PSK_8,
> +               APSK_16,
> +               APSK_32
> +       };
> +
> +       int fe_stv0900_modcod_return_dvbs[] = {
> +               FEC_NONE,
> +               FEC_AUTO,
> +               FEC_AUTO,
> +               FEC_AUTO,
> +               FEC_1_2,
> +               FEC_3_5,
> +               FEC_2_3,
> +               FEC_3_4,
> +               FEC_4_5,
> +               FEC_5_6,
> +               FEC_6_7,
> +               FEC_7_8,
> +               FEC_3_5,
> +               FEC_2_3,
> +               FEC_3_4,
> +               FEC_5_6,
> +               FEC_8_9,
> +               FEC_9_10,
> +               FEC_2_3,
> +               FEC_3_4,
> +               FEC_4_5,
> +               FEC_5_6,
> +               FEC_8_9,
> +               FEC_9_10,
> +               FEC_3_4,
> +               FEC_4_5,
> +               FEC_5_6,
> +               FEC_8_9,
> +               FEC_9_10,
> +               FEC_AUTO
> +       };
> +
> +       int fe_stv0900_modcod_return_dvbs2[] = {
> +               FEC_NONE,
> +               FEC_AUTO,
> +               FEC_AUTO,
> +               FEC_AUTO,
> +               FEC_1_2,
> +               FEC_3_5,
> +               FEC_2_3,
> +               FEC_3_4,
> +               FEC_4_5,
> +               FEC_5_6,
> +               FEC_8_9,
> +               FEC_9_10,
> +               FEC_3_5,
> +               FEC_2_3,
> +               FEC_3_4,
> +               FEC_5_6,
> +               FEC_8_9,
> +               FEC_9_10,
> +               FEC_2_3,
> +               FEC_3_4,
> +               FEC_4_5,
> +               FEC_5_6,
> +               FEC_8_9,
> +               FEC_9_10,
> +               FEC_3_4,
> +               FEC_4_5,
> +               FEC_5_6,
> +               FEC_8_9,
> +               FEC_9_10,
> +               FEC_AUTO
> +       };
>
>         u8 tmg;
>         u32 reg;
> @@ -2631,10 +2720,71 @@ static enum stv090x_signal_state stv090x_get_sig_params(struct stv090x_state *st
>         state->modcod = STV090x_GETFIELD_Px(reg, DEMOD_MODCOD_FIELD);
>         state->pilots = STV090x_GETFIELD_Px(reg, DEMOD_TYPE_FIELD) & 0x01;
>         state->frame_len = STV090x_GETFIELD_Px(reg, DEMOD_TYPE_FIELD) >> 1;
> -       reg = STV090x_READ_DEMOD(state, TMGOBS);
> -       state->rolloff = STV090x_GETFIELD_Px(reg, ROLLOFF_STATUS_FIELD);
> -       reg = STV090x_READ_DEMOD(state, FECM);
> -       state->inversion = STV090x_GETFIELD_Px(reg, IQINV_FIELD);
> +       reg = STV090x_READ_DEMOD(state, MATSTR1);
> +       state->rolloff = STV090x_GETFIELD_Px(reg, MATYPE_ROLLOFF_FIELD);
> +
> +       switch (state->delsys) {
> +       case STV090x_DVBS2:
> +               if (state->modcod <= STV090x_QPSK_910)
> +                       state->modulation = STV090x_QPSK;
> +               else if (state->modcod <= STV090x_8PSK_910)
> +                       state->modulation = STV090x_8PSK;
> +               else if (state->modcod <= STV090x_16APSK_910)
> +                       state->modulation = STV090x_16APSK;
> +               else if (state->modcod <= STV090x_32APSK_910)
> +                       state->modulation = STV090x_32APSK;
> +               else
> +                       state->modulation = STV090x_UNKNOWN;
> +               reg = STV090x_READ_DEMOD(state, PLHMODCOD);


It is documented with Bug 6, that the demodulator may reject
the MODCOD being read out. As a result, it is not a good idea to
report the information, especially knowing that it is buggy.


> +               state->inversion = STV090x_GETFIELD_Px(reg, SPECINV_DEMOD_FIELD);
> +               break;
> +       case STV090x_DVBS1:
> +       case STV090x_DSS:
> +               switch(state->fec) {
> +               case STV090x_PR12:
> +                       state->modcod = STV090x_QPSK_12;
> +                       break;
> +               case STV090x_PR23:
> +                       state->modcod = STV090x_QPSK_23;
> +                       break;
> +               case STV090x_PR34:
> +                       state->modcod = STV090x_QPSK_34;
> +                       break;
> +               case STV090x_PR45:
> +                       state->modcod = STV090x_QPSK_45;
> +                       break;
> +               case STV090x_PR56:
> +                       state->modcod = STV090x_QPSK_56;
> +                       break;
> +               case STV090x_PR67:
> +                       state->modcod = STV090x_QPSK_89;
> +                       break;
> +               case STV090x_PR78:
> +                       state->modcod = STV090x_QPSK_910;
> +                       break;
> +               default:
> +                       state->modcod = STV090x_DUMMY_PLF;
> +                       break;
> +               }
> +               state->modulation = STV090x_QPSK;
> +               reg = STV090x_READ_DEMOD(state, FECM);
> +               state->inversion = STV090x_GETFIELD_Px(reg, IQINV_FIELD);
> +               break;
> +       default:
> +               break;
> +       }
> +
> +       props->frequency                = state->frequency;
> +       props->symbol_rate              = state->srate;
> +       if (state->delsys == 2)
> +               props->fec_inner        = fe_stv0900_modcod_return_dvbs2[state->modcod];
> +       else
> +               props->fec_inner        = fe_stv0900_modcod_return_dvbs[state->modcod];
> +       props->pilot                    = state->pilots;
> +       props->rolloff                  = fe_stv0900_rolloff_return[state->rolloff];
> +       props->modulation               = fe_stv0900_modulation_return[state->modulation];
> +       props->inversion                = state->inversion;
> +       props->delivery_system          = fe_stv0900_tracking_standard_return[state->delsys];
>
>         if ((state->algo == STV090x_BLIND_SEARCH) || (state->srate < 10000000)) {
>
> @@ -2842,6 +2992,7 @@ static int stv090x_optimize_track(struct stv090x_state *state)
>  {
>         struct dvb_frontend *fe = &state->frontend;
>
> +       enum stv090x_rolloff rolloff;
>         enum stv090x_modcod modcod;
>
>         s32 srate, pilots, aclc, f_1, f_0, i = 0, blind_tune = 0;
> @@ -2965,6 +3116,7 @@ static int stv090x_optimize_track(struct stv090x_state *state)
>         f_1 = STV090x_READ_DEMOD(state, CFR2);
>         f_0 = STV090x_READ_DEMOD(state, CFR1);
>         reg = STV090x_READ_DEMOD(state, TMGOBS);
> +       rolloff = STV090x_GETFIELD_Px(reg, ROLLOFF_STATUS_FIELD);
>
>         if (state->algo == STV090x_BLIND_SEARCH) {
>                 STV090x_WRITE_DEMOD(state, SFRSTEP, 0x00);
> @@ -3464,20 +3616,24 @@ static enum dvbfe_search stv090x_search(struct dvb_frontend *fe)
>         state->frequency = props->frequency;
>         state->srate = props->symbol_rate;
>         state->search_mode = STV090x_SEARCH_AUTO;
> -       state->algo = STV090x_COLD_SEARCH;
> +       state->algo = STV090x_BLIND_SEARCH;


Why ?



>         state->fec = STV090x_PRERR;
> -       if (state->srate > 10000000) {
> -               dprintk(FE_DEBUG, 1, "Search range: 10 MHz");
> -               state->search_range = 10000000;
> -       } else {
> -               dprintk(FE_DEBUG, 1, "Search range: 5 MHz");
> -               state->search_range = 5000000;
> -       }
> +       state->search_range = 0;
>


Again, why ?


>         stv090x_set_mis(state, props->stream_id);
>
> +       dprintk(FE_DEBUG, 1, "Search started...");
>         if (stv090x_algo(state) == STV090x_RANGEOK) {
> +               stv090x_get_sig_params(state);
>                 dprintk(FE_DEBUG, 1, "Search success!");
> +               dprintk(FE_DEBUG, 1, "frequency       = %d", props->frequency);
> +               dprintk(FE_DEBUG, 1, "symbol_rate     = %d", props->symbol_rate);
> +               dprintk(FE_DEBUG, 1, "fec_inner       = %d, %d", props->fec_inner, state->modcod);
> +               dprintk(FE_DEBUG, 1, "pilot           = %d", props->pilot);
> +               dprintk(FE_DEBUG, 1, "rolloff         = %d", props->rolloff);
> +               dprintk(FE_DEBUG, 1, "modulation      = %d, %d", props->modulation, state->modulation);
> +               dprintk(FE_DEBUG, 1, "inversion       = %d", props->inversion);
> +               dprintk(FE_DEBUG, 1, "delivery_system = %d, %d", props->delivery_system, state->delsys);
>                 return DVBFE_ALGO_SEARCH_SUCCESS;
>         } else {
>                 dprintk(FE_DEBUG, 1, "Search failed!");
> @@ -3520,6 +3676,7 @@ static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status)
>                                         *status |= FE_HAS_SYNC | FE_HAS_LOCK;
>                         }
>                 }
> +               stv090x_get_sig_params(state);
>                 break;
>
>         case 3: /* DVB-S1/legacy mode */
> @@ -3533,6 +3690,7 @@ static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status)
>                                         *status |= FE_HAS_SYNC | FE_HAS_LOCK;
>                         }
>                 }
> +               stv090x_get_sig_params(state);
>                 break;
>         }
>
> diff --git a/drivers/media/dvb-frontends/stv090x_reg.h b/drivers/media/dvb-frontends/stv090x_reg.h
> index 93741ee..ac6bc30 100644
> --- a/drivers/media/dvb-frontends/stv090x_reg.h
> +++ b/drivers/media/dvb-frontends/stv090x_reg.h
> @@ -1927,6 +1927,8 @@
>  #define STV090x_P1_MATSTR1                     STV090x_Px_MATSTRy(1, 1)
>  #define STV090x_P2_MATSTR0                     STV090x_Px_MATSTRy(2, 0)
>  #define STV090x_P2_MATSTR1                     STV090x_Px_MATSTRy(2, 1)
> +#define STV090x_OFFST_Px_MATYPE_ROLLOFF_FIELD  0
> +#define STV090x_WIDTH_Px_MATYPE_ROLLOFF_FIELD  2
>  #define STV090x_OFFST_Px_MATYPE_CURRENT_FIELD  0
>  #define STV090x_WIDTH_Px_MATYPE_CURRENT_FIELD  8
>
> --
> 1.8.1.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux