[linux-dvb] dst tone/power patch
Anders Nordahl
ano at du.se
Thu Mar 29 12:53:44 CEST 2007
This patch solved my problems.
Please integrate it.
/Anders
On Aug 7, 2006, at 4:45 PM, Yeasah Pell wrote:
> I've had this dst patch kicking around for a while now -- it needs
> somebody else to try it out and confirm. If anybody's got a dst
> card and wouldn't mind trying out this patch, it'd be nice, as I'm
> getting a little tired of having this patch outstanding :-)
>
> It changes the way the dst tone/power commands are issued, and has
> the following effects:
>
> * Previously, tone/power commands would be partially co-mingled
> with tuning commands under some circumstances, and thus some
> commands could be lost (and bogus commands issued to the dst chip)
>
> * The toneburst ("minidiseqc") command values were wrong (at least
> on my card), the new code generates the proper tonebursts. Somebody
> with a minidiseqc switch would have to verify this one. I bet
> nobody uses one of those though. FWIW, I did verify both with a
> scope and a minidiseqc switch, so it definitely works for my card
> anyway.
>
> * It keeps better track of what the last state of the hardware was
> for the tone/power command so as to avoid unnecessary i2c traffic,
> but also to allow the retry of failed commands. (i.e. it won't
> squelch a repeat command if the last one failed)
>
> thanks,
> -yeasah
> diff -r cf687ab6b0ab linux/drivers/media/dvb/bt8xx/dst.c
> --- a/linux/drivers/media/dvb/bt8xx/dst.c Mon Aug 07 10:44:33 2006
> -0300
> +++ b/linux/drivers/media/dvb/bt8xx/dst.c Mon Aug 07 10:18:57 2006
> -0400
> @@ -1330,9 +1330,38 @@ static int dst_tone_power_cmd(struct dst
>
> if (state->dst_type != DST_TYPE_IS_SAT)
> return -EOPNOTSUPP;
> - paket[4] = state->tx_tuna[4];
> - paket[2] = state->tx_tuna[2];
> - paket[3] = state->tx_tuna[3];
> +
> + switch (state->tone) {
> + case SEC_TONE_OFF:
> + if (state->type_flags & DST_TYPE_HAS_OBS_REGS)
> + paket[2] = 0x00;
> + else
> + paket[2] = 0xff;
> + break;
> + case SEC_TONE_ON:
> + paket[2] = 0x02;
> + break;
> + }
> +
> + switch (state->minicmd) {
> + case SEC_MINI_A:
> + paket[3] = 0x00;
> + break;
> + case SEC_MINI_B:
> + paket[3] = 0x01;
> + break;
> + }
> + state->minicmd = -1;
> +
> + switch (state->voltage) {
> + case SEC_VOLTAGE_OFF:
> + paket[4] = 0x00;
> + break;
> + default:
> + paket[4] = 0x01;
> + break;
> + }
> +
> paket[7] = dst_check_sum (paket, 7);
> return dst_command(state, paket, 8);
> }
> @@ -1476,79 +1505,70 @@ static int dst_set_diseqc(struct dvb_fro
>
> static int dst_set_voltage(struct dvb_frontend *fe,
> fe_sec_voltage_t voltage)
> {
> - int need_cmd, retval = 0;
> + int retval = 0;
> struct dst_state *state = fe->demodulator_priv;
>
> state->voltage = voltage;
> if (state->dst_type != DST_TYPE_IS_SAT)
> return -EOPNOTSUPP;
> -
> - need_cmd = 0;
>
> switch (voltage) {
> case SEC_VOLTAGE_13:
> case SEC_VOLTAGE_18:
> if ((state->diseq_flags & HAS_POWER) == 0)
> - need_cmd = 1;
> - state->diseq_flags |= HAS_POWER;
> - state->tx_tuna[4] = 0x01;
> + retval = dst_tone_power_cmd(state);
> + if (retval == 0)
> + state->diseq_flags |= HAS_POWER;
> break;
> case SEC_VOLTAGE_OFF:
> - need_cmd = 1;
> - state->diseq_flags &= ~(HAS_POWER | HAS_LOCK | ATTEMPT_TUNE);
> - state->tx_tuna[4] = 0x00;
> + if ((state->diseq_flags & HAS_POWER) != 0)
> + retval = dst_tone_power_cmd(state);
> + if (retval == 0)
> + state->diseq_flags &= ~(HAS_POWER | HAS_LOCK | ATTEMPT_TUNE);
> break;
> default:
> return -EINVAL;
> }
>
> - if (need_cmd)
> - retval = dst_tone_power_cmd(state);
> -
> return retval;
> }
>
> static int dst_set_tone(struct dvb_frontend *fe,
> fe_sec_tone_mode_t tone)
> {
> + int retval = -EINVAL;
> struct dst_state *state = fe->demodulator_priv;
>
> - state->tone = tone;
> if (state->dst_type != DST_TYPE_IS_SAT)
> return -EOPNOTSUPP;
>
> switch (tone) {
> case SEC_TONE_OFF:
> - if (state->type_flags & DST_TYPE_HAS_OBS_REGS)
> - state->tx_tuna[2] = 0x00;
> - else
> - state->tx_tuna[2] = 0xff;
> - break;
> -
> case SEC_TONE_ON:
> - state->tx_tuna[2] = 0x02;
> - break;
> - default:
> - return -EINVAL;
> - }
> - return dst_tone_power_cmd(state);
> + state->tone = tone;
> + retval = dst_tone_power_cmd(state);
> + if (retval != 0)
> + state->tone = -1;
> + break;
> + }
> + return retval;
> }
>
> static int dst_send_burst(struct dvb_frontend *fe,
> fe_sec_mini_cmd_t minicmd)
> {
> + int retval = -EINVAL;
> struct dst_state *state = fe->demodulator_priv;
>
> if (state->dst_type != DST_TYPE_IS_SAT)
> return -EOPNOTSUPP;
> - state->minicmd = minicmd;
> +
> switch (minicmd) {
> case SEC_MINI_A:
> - state->tx_tuna[3] = 0x02;
> - break;
> case SEC_MINI_B:
> - state->tx_tuna[3] = 0xff;
> - break;
> - }
> - return dst_tone_power_cmd(state);
> + state->minicmd = minicmd;
> + retval = dst_tone_power_cmd(state);
> + break;
> + }
> + return retval;
> }
>
>
> @@ -1565,8 +1585,9 @@ static int dst_init(struct dvb_frontend
> static u8 atsc_tuner[] = { 0x00, 0x00, 0x03, 0xb6, 0x01, 0x07,
> 0x00, 0x00, 0x00, 0x00 };
>
> state->inversion = INVERSION_OFF;
> - state->voltage = SEC_VOLTAGE_13;
> - state->tone = SEC_TONE_OFF;
> + state->voltage = -1;
> + state->tone = -1;
> + state->minicmd = -1;
> state->diseq_flags = 0;
> state->k22 = 0x02;
> state->bandwidth = BANDWIDTH_7_MHZ;
> _______________________________________________
> linux-dvb mailing list
> linux-dvb at linuxtv.org
> http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb
More information about the linux-dvb
mailing list