satfind - driver protocol ...

Sklaventreiber
hardsofty
Interessierter
Interessierter
Beiträge: 86
Registriert: Donnerstag 26. September 2002, 19:20

satfind - driver protocol ...

Beitrag von hardsofty »

Hallo!

Das Satfind geht von einem Werteberiech von 0-65535 aus, die Treiber liefern aber alle einen höheren Wertebereich.

=> Sollte man alle Treiber nicht auch auf den Wertebereich anpassen?

Wann wird das gefixed (in einigen ist es schon passiert).
ves1993.c fehlt auf jeden Fall noch.

Code in tda8044h.c schaut ja schon nicht schlecht aus, was mit nur aufgefallen ist, daß es immer nach meinen Berechnungen zu 0 scalen muß ... (da ja
static u8 fbcn = 0xF;
definiert ist)

Auch fehlt das Ausmaskieren der höheren Bits (gefixed in tda8044h.c, in anderen noch nicht gemacht). Führt dann zu negativen Werten am Display etc.

case FE_READ_BER:
{
u32 * ber = (u32 *) arg;
*ber = (readreg(client, 0x0B)&0x1F)<<16;
*ber |= readreg(client, 0x0C)<<8;
*ber |= readreg(client, 0x0D);
/* scale to bit errors per 10^9 bits */
*ber *= 1953125 / (2 << (5 + fbcn));
break;
}

Ein gut funktionierender Satfind mit allen Treibern wäre nicht schlecht ...

Relevant sind die folgenden ioctls:
case FE_READ_SNR:
case FE_READ_SIGNAL_STRENGTH:
case FE_READ_BER:

Es wäre auch interessant, die gemeinsamen Codeteile gemeinsam zu haben ...

Any comments?
obi
Senior Member
Beiträge: 1282
Registriert: Montag 12. November 2001, 00:00

Beitrag von obi »

hi.

0-65535 gilt bei SNR und SIGNAL_STRENGTH, nicht bei BER.
Bei welchen Treibern ausser VES1993 stimmt da was nicht?
Die Division im TDA kann ich mir nochmal anschauen.

Gruss,
obi
hardsofty
Interessierter
Interessierter
Beiträge: 86
Registriert: Donnerstag 26. September 2002, 19:20

Beitrag von hardsofty »

obi hat geschrieben:hi.

0-65535 gilt bei SNR und SIGNAL_STRENGTH, nicht bei BER.
Bei welchen Treibern ausser VES1993 stimmt da was nicht?
Die Division im TDA kann ich mir nochmal anschauen.

Gruss,
obi
Bei den max_values steht im satfind.c:
int max_values[3]={0,0xFFFF,0xFFFF};

Solte es nicht auch wie folgt heißen? (Scaling to 10-9 bits)
int max_values[3]={1000000000,0xFFFF,0xFFFF};
(int sollte ja 32 Bit sein ...)

Bei den CVS Versionen:
Bei at76c651.c ist mir nichts aufgefallen.
Bei tda8044h.c ist mir obiges aufgefallen (Testcode siehe unten)
Bei ves1820.c ist mir nichts aufgefallen.
Bei ves1893.c is mir ein höherer Wertebereich bei der BER aufgefallen.
Bei ves1993.c ist mir folgendes aufgefallen:
case FE_READ_BER:
{
u32 *ber=(u32 *) arg;

*ber = readreg(client,0x15);
*ber|=(readreg(client,0x16)<<8) ;
*ber|=(readreg(client,0x17)<<16) ;
*ber*=10;
// Größter Wert: 0xFFFFFF*10=167772150, wenn es satfind.c kann => OK.
break;
}

case FE_READ_SIGNAL_STRENGTH:
{
s32 *signal=(s32 *) arg;

*signal=0xff-readreg(client,0x0b) ;
// Wenn ich zusätzlich 50m Kabel anhänge habe ich eine Signal strength
// von 0 !!! und trotzdem tadellosen Empfang. Vielleicht fehlt da noch ein
// niederwertigen Byte???
break;
}
case FE_READ_SNR:
{
s32 *snr=(s32 *) arg;

*snr=(readreg(client,0x1c)<<8 ) ;
*snr=20000000+(10-(*snr>>8 ))*20000000/160;
// Diese Berechnung sollte buggy sein (negative Werte bei kein Signal)
// und durch folgendes ersetzt werden:
*snr = readreg(client,0x1c);
*snr = (*snr << 8) | *snr;

break;
}



/////////////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>

typedef unsigned long DWORD;

DWORD calc_ber(DWORD ber)
{
DWORD fbcn = 0x0;

//DWORD scale = (2 << (5 + fbcn));
//DWORD mul = 1953125 / (2 << (5 + fbcn));

/* scale to bit errors per 10^9 bits */
ber *= 1953125 / (2 << (5 + fbcn));
return ber;
}

DWORD calc_snr(DWORD snr)
{
snr = snr << 8;

snr = 20000000+(10-(snr>>8 ))*20000000/160;

return snr;
}

void main(void)
{
// BER
DWORD ber;
DWORD snr;

ber = 0x0;
printf("berorig=%lu, ber=%lu\n", ber, calc_ber(ber));

ber = 0xF;
printf("berorig=%lu, ber=%lu\n", ber, calc_ber(ber));

ber = 0xFFFF;
printf("berorig=%lu, ber=%lu\n", ber, calc_ber(ber));


ber = 0xFFFFF;
printf("berorig=%lu, ber=%lu\n", ber, calc_ber(ber));


ber = 0x1FFFFF;
printf("berorig=%lu, ber=%lu\n", ber, calc_ber(ber));

// Old SNR

snr = 0x0;
printf("snrorig=%lu, snr=%lu\n", snr, calc_snr(snr));

snr = 0xFF;
printf("snrorig=%lu, snr=%lu\n", snr, calc_snr(snr));

exit(0);
return;
}
obi
Senior Member
Beiträge: 1282
Registriert: Montag 12. November 2001, 00:00

Beitrag von obi »

hardsofty hat geschrieben:int max_values[3]={0,0xFFFF,0xFFFF};
Das sind nur Startwerte fuer die Grenzen.
hardsofty hat geschrieben:Bei ves1893.c is mir ein höherer Wertebereich bei der BER aufgefallen.
Was heisst das genau?
hardsofty hat geschrieben:Bei ves1993.c ist mir folgendes aufgefallen:
*signal=0xff-readreg(client,0x0b) ;
// Wenn ich zusätzlich 50m Kabel anhänge habe ich eine Signal strength
// von 0 !!! und trotzdem tadellosen Empfang. Vielleicht fehlt da noch ein
// niederwertigen Byte???
nein, da ist nix mehr.
hardsofty hat geschrieben: *snr = readreg(client,0x1c);
*snr = (*snr << 8) | *snr;
jo

- obi
obi
Senior Member
Beiträge: 1282
Registriert: Montag 12. November 2001, 00:00

Re: satfind - driver protocol ...

Beitrag von obi »

fbcn stellt uebrigens die anzahl an bits ein, fuer die die fehler gezaehlt werden.