[linux-dvb] [RFC] [PATCH] Make S/N values to appear at cx24123
yeasah at schwide.com
Wed Apr 19 00:12:05 CEST 2006
Trent Piepho wrote:
>So you're saying it a count of the number of 204 byte packets which the
>Reed-Solomon code couldn't correct? If that's the case then the code that's
>there is completely wrong. The BER value is wrong too, instead of BER, it's
>really getting UCB. My guess is that the snr function was written with the
>demod counter set to return a different value, something like error bits out
>of the last X.
Yes, according to the demod datasheet. There's two main modes the error
counter can run in -- reed solomon, or PN sequence BER (as well as
several sub-modes for reed-solomon counting). It's currently setup as
the default, which is to count reed solomon block errors. I agree that
sounds like something that should be returned as uncorrected blocks
count rather than a bit error rate.
>I don't think you can get SNR from uncorrected blocks. You need to know the
>bit errors before the Vitterbi error correction, much less the Reed-Solomon
>stage, is done. If the R-S code detects a single error, then there were too
>many bit errors for the Vitterbi code fix. That means your SNR is already
>bad. How bad would depend on the FEC ratio used, 1/2 vs 7/8 would be
>completely different. The code in the driver doesn't take the FEC ratio into
>account, so it's obviously completely wrong, besides the fact that the scale
>is completely wrong too.
>In order to get SNR, I think the driver needs to reconfigure the counter to
>return a more suitable value.
Again, I can't disagree with any of this. It's a trivial change --
changing the initialization of register 0x56 to 0x20 (instead of 0x41,
the default) would configure the counter for PN BER mode, with a window
size of 2^22. There are other options for things such as PN sequence
inversion or window size, but that seems like a reasonable
configuration. Certainly easy to try, anyway.
I thought it was pretty strange/lame that the driver returned the same
value for both UCB and BER, but who would have suspected that it was
actually the UCB value that was correct, despite the fact that the code
calls the variable BER everywhere? :-) It would be theoretically
possible to switch the mode of the counter on demand to measure both UCB
and BER, but there would need to be extra code to reset the counter and
wait for the count to complete, and I'm not sure how long that would
take, so caller latency might be an issue.
More information about the linux-dvb