Re: [PATCH] Enable the BER/UNC counting for the stv0297 frontend

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

 



Oliver Endriss wrote:
> e9hack wrote:
>   
>>
>> It comes from stv0297_cs2.c:
>>
>>         stv0297_writeregI(state, RS_DESC_15, 0x03);   /* freeze the
>> counters */
>>         stv0297_redregsI(state, RS_DESC_0, block_count, 6);
>>         stv0297_writeregI(state, RS_DESC_15, 0x03);   /* clear the
>> counters */
>>         stv0297_writeregI(state, RS_DESC_15, 0x03);   /* re-enable the
>> counters */
>>
>> Sorry, I didn't copy the comments. I've used stv0297_writereg_mask(),
>> because I don't know the meaning of register 0xDF and it seems that only
>> bit 0 and 1 are involved in the counters.
>>     
>
> Ok. Please re-add the comments. They clarify the code.
Done.

- Hartmut


Signed-of-by: Hartmut Birr <e9hack@xxxxxxxxxxxxxx>

Enable BER/UNC counting for the stv0297 frontend. The idea for this patch comes from stv0297_cs.c.

diff -r b1484f51c635 linux/drivers/media/dvb/frontends/stv0297.c
--- a/linux/drivers/media/dvb/frontends/stv0297.c	Sat Oct 21 18:01:35 2006 -0200
+++ b/linux/drivers/media/dvb/frontends/stv0297.c	Sat Oct 21 23:04:01 2006 +0200
@@ -35,6 +35,7 @@ struct stv0297_state {
 	const struct stv0297_config *config;
 	struct dvb_frontend frontend;
 
+	unsigned long last_ber;
 	unsigned long base_freq;
 };
 
@@ -310,6 +311,8 @@ static int stv0297_init(struct dvb_front
 		stv0297_writereg(state, state->config->inittab[i], state->config->inittab[i+1]);
 	msleep(200);
 
+	state->last_ber = 0;
+
 	return 0;
 }
 
@@ -340,11 +343,13 @@ static int stv0297_read_ber(struct dvb_f
 	struct stv0297_state *state = fe->demodulator_priv;
 	u8 BER[3];
 
-	stv0297_writereg(state, 0xA0, 0x80);	// Start Counting bit errors for 4096 Bytes
-	mdelay(25);		// Hopefully got 4096 Bytes
 	stv0297_readregs(state, 0xA0, BER, 3);
-	mdelay(25);
-	*ber = (BER[2] << 8 | BER[1]) / (8 * 4096);
+	if (!(BER[0] & 0x80)) {
+		state->last_ber = BER[2] << 8 | BER[1];
+		stv0297_writereg_mask(state, 0xA0, 0x80, 0x80);
+	}
+	
+	*ber = state->last_ber;
 
 	return 0;
 }
@@ -375,9 +380,14 @@ static int stv0297_read_ucblocks(struct 
 static int stv0297_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks)
 {
 	struct stv0297_state *state = fe->demodulator_priv;
+	
+	stv0297_writereg_mask(state, 0xDF, 0x03, 0x03); /* freeze the counters */
 
 	*ucblocks = (stv0297_readreg(state, 0xD5) << 8)
 		| stv0297_readreg(state, 0xD4);
+
+	stv0297_writereg_mask(state, 0xDF, 0x03, 0x02); /* clear the counters */
+	stv0297_writereg_mask(state, 0xDF, 0x03, 0x01); /* re-enable the counters */
 
 	return 0;
 }
@@ -648,6 +658,7 @@ struct dvb_frontend *stv0297_attach(cons
 	/* setup the state */
 	state->config = config;
 	state->i2c = i2c;
+	state->last_ber = 0;
 	state->base_freq = 0;
 
 	/* check if the demod is there */
_______________________________________________
linux-dvb mailing list
linux-dvb@xxxxxxxxxxx
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

[Index of Archives]     [Linux Media]     [Video 4 Linux]     [Asterisk]     [Samba]     [Xorg]     [Xfree86]     [Linux USB]

  Powered by Linux