📄 tun0299.c
字号:
return Tuner.BandWidth[Tuner.SelectBW];
}
else return 0;
}
/*****************************************************
**FUNCTION :: TunerGetNbSteps
**ACTION :: Get the number of steps of the tuner
**PARAMS IN :: NONE
**PARAMS OUT:: NONE
**RETURN :: Number of steps, 0 if an error occur
*****************************************************/
int TunerGetNbSteps(void)
{
int nbsteps = 0;
unsigned int Ncnt,Acnt,Prescaler;
if(!Tuner.Error)
{
switch (Tuner.PLL)
{
case PLL_5522:
case PLL_5655:
nbsteps = ((int)Tuner.WrBuffer[0] & 0x0000007F)<<8L;
nbsteps |= (int)Tuner.WrBuffer[1] & 0x000000FF;
break ;
case PLL_5659:
nbsteps = ((int)Tuner.WrBuffer[0] & 0x0000007F)<<8L;
nbsteps |= ((int)Tuner.WrBuffer[1] & 0x000000FF);
nbsteps |= (((int)Tuner.WrBuffer[2] & 0x00000060 )<<10L);
break;
case PLL_TUA6100:
Prescaler = (Tuner.WrBuffer[1] & 0x40) ? 64 : 32; /* Prescaler = 64 if high 32 if low */
Ncnt = (((int)Tuner.WrBuffer[1] & 0x3)<<9)|
(((int)Tuner.WrBuffer[2] & 0xFF)<<1)|
(((int)Tuner.WrBuffer[3] & 0x80)>>7); /* N counter value */
Acnt = (int)Tuner.WrBuffer[3] & 0x7F; /* A counter value */
nbsteps = (Prescaler * Ncnt) + Acnt;
break;
default:
Tuner.Error = TNR_PLL_ERR;
break;
}
}
return nbsteps;
}
/*****************************************************
**FUNCTION :: TunerSetNbSteps
**ACTION :: Set the number of steps of the tuner
**PARAMS IN :: nbsteps ==> number of steps of the tuner
**PARAMS OUT:: NONE
**RETURN :: NONE
*****************************************************/
void TunerSetNbSteps(int nbsteps)
{
unsigned int Ncnt,Acnt,Prescaler;
int freq;
if(!Tuner.Error)
{
switch(Tuner.PLL)
{
case PLL_5522:
case PLL_5655:
Tuner.WrBuffer[0]= (unsigned char)((nbsteps & 0x00007F00)>>8);
Tuner.WrBuffer[1]= (unsigned char)(nbsteps & 0x000000FF);
break ;
case PLL_5659:
Tuner.WrBuffer[0]= (unsigned char)((nbsteps & 0x00007F00)>>8);
Tuner.WrBuffer[1]= (unsigned char)(nbsteps & 0x000000FF );
/* VICKY - 010300 - corrected the programmble counter loading */
#if 0
Tuner.WrBuffer[2]= (unsigned char)((((long)Tuner.WrBuffer[2])&0xFF9F)|(nbsteps>>10));
#else
Tuner.WrBuffer[2]= (unsigned char)((((long)Tuner.WrBuffer[2])&0xFF9F)| ( ( nbsteps >> 10 ) & 0x60 ) );
#endif
break;
case PLL_TUA6100:
Prescaler = (Tuner.WrBuffer[1] & 0x40) ? 64 : 32; /* Prescaler = 64 if high 32 if low */
Ncnt = nbsteps / Prescaler; /* N counter = nbsteps / Prescaler */
Acnt = nbsteps - (Ncnt * Prescaler); /* A counter = nbsteps - N counter * Prescaler */
Tuner.WrBuffer[1]= Tuner.WrBuffer[1]|((unsigned char)((Ncnt & 0x600)>>9));
Tuner.WrBuffer[2]= (unsigned char)((Ncnt & 0x1FE)>>1);
Tuner.WrBuffer[3]= (unsigned char)(((Ncnt & 0x01)<<7)|(Acnt & 0x7F));
freq = TunerGetFrequency();
Tuner.WrBuffer[1] = (Tuner.WrBuffer[1] & 0x7F) | ((freq>1525000) ? 0x80 : 0x00); /* VCO switching */
Tuner.WrBuffer[1] = (Tuner.WrBuffer[1] & 0xCF) | ((freq>1430000) ? 0x00 : 0x20); /* N-counter value switching */
break;
default:
Tuner.Error = TNR_PLL_ERR;
break ;
}
TunerReadWrite(WRITE);
}
}
/*****************************************************
**FUNCTION :: TunerGetFrequency
**ACTION :: Get the frequency of the tuner
**PARAMS IN :: NONE
**PARAMS OUT:: NONE
**RETURN :: frequency of the tuner (KHz), 0 if an error occur
*****************************************************/
int TunerGetFrequency(void)
{
int frequency = 0;
if(Tuner.StepSize>0)
{
frequency = ((TunerGetNbSteps()*(Tuner.StepSize/2)) - 500*Tuner.IF)/500 ;
frequency *= Tuner.FreqFactor;
}
else
Tuner.Error = TNR_STEP_ERR;
return frequency;
}
/*****************************************************
**FUNCTION :: TunerSetFrequency
**ACTION :: Set the frequency of the tuner
**PARAMS IN :: frequency ==> the frequency of the tuner (KHz)
**PARAMS OUT:: NONE
**RETURN :: real tuner frequency, 0 if an error occur
*****************************************************/
int TunerSetFrequency(int frequency)
{
int nbsteps = 0,
chargepump = 0,
bandwidth =0;
TunerResetError();
if(Tuner.StepSize > 0)
{
switch(Tuner.Type)
{
case TNR_EVALMAX:
if(frequency < 1450000)
chargepump = 0x40;
else if(frequency < 2000000)
chargepump = 0x80;
else
chargepump = 0xC0;
Tuner.WrBuffer[3] = (Tuner.WrBuffer[3] & 0x3F) | chargepump;
break;
case TNR_VZ1011:
case TNR_VG1011:
/* VICKY - 010300 - band selection */
if ( frequency < 1450000 )
{
/* low-band */
Tuner . WrBuffer [ 3 ] |= 0x08;
}
else
{
Tuner . WrBuffer [ 3 ] &= ~0x08;
}
break;
/* Added by LP on 13/10/00 to optimize tuning process */
case TNR_DST7900:
#ifdef USE_PHILIPS_ZIF
if(frequency < 1500000)
chargepump = 0x40;
else if(frequency < 2000000)
chargepump = 0x80;
else
chargepump = 0xC0;
Tuner.WrBuffer[3] = (Tuner.WrBuffer[3] & 0x3F) | chargepump;
#endif
break;
/* Added by LP on 13/10/00 to optimize tuning process */
case TNR_SU1200:
if(frequency < 1500000)
chargepump = 0x40;
else if(frequency < 2000000)
chargepump = 0x80;
else
chargepump = 0xC0;
Tuner.WrBuffer[3] = (Tuner.WrBuffer[3] & 0x3F) | chargepump;
break;
default:
break;
}
nbsteps = (frequency * 500) / Tuner.FreqFactor;
nbsteps = (nbsteps + (500 * Tuner.IF)) / (Tuner.StepSize / 2);
TunerSetNbSteps(nbsteps);
}
#if 0
printf ( "TUNER_SET => R[%d] S[%d]\n",
frequency,
TunerGetFrequency ( ) );
#endif
return TunerGetFrequency();
}
#define MAX_NO_OF_TUNER_RETRIES 3
/*****************************************************
**FUNCTION :: TunerReadWrite
**ACTION :: Read or write the tuner and put/use data in RdBuffer/WrBuffer
**PARAMS IN :: mode ==> READ or WRITE
**PARAMS OUT:: NONE
**RETURN :: NONE
*****************************************************/
void TunerReadWrite(int mode)
{
int iRetryCount;
/* LP - 26/06/00 - Spy added to trace retries - Delete in final version */
int Spy = 0;
int status = 0;
unsigned char subadr;
#if 0
if ( mode == WRITE )
{
printf ( "TunerData [%02X %02X %02X %02X]\n",
Tuner . WrBuffer [ 0 ],
Tuner . WrBuffer [ 1 ],
Tuner . WrBuffer [ 2 ],
Tuner . WrBuffer [ 3 ] );
}
#endif
if(!Tuner.Error)
{
iRetryCount = 0;
Spy = MAX_NO_OF_TUNER_RETRIES;
while ( iRetryCount < MAX_NO_OF_TUNER_RETRIES )
{
if ( Tuner . Repeator )
RegSetField ( I2CT, 1 );
if ( mode == WRITE )
status = I2cReadWrite(WRITE,Tuner.Address,Tuner.WrBuffer,Tuner.WrSize);
else
{
switch(Tuner.PLL)
{
case PLL_TUA6100:
subadr = 0x80;
status = I2cReadWrite(WRITE,Tuner.Address,&subadr,1);
if(Tuner.Repeator)
RegSetField(I2CT,1);
default:
status = I2cReadWrite(READ,Tuner.Address,Tuner.RdBuffer,Tuner.RdSize);
break;
}
}
if ( status == 0 )
{
Tuner.Error = TNR_NO_ERR;
break;
}
++iRetryCount;
Tuner.Error = TNR_ACK_ERR;
}
}
}
/*****************************************************
**FUNCTION :: TunerGetTunerLock
**ACTION :: Read the tuner state
**PARAMS IN :: NONE
**PARAMS OUT:: NONE
**RETURN :: 1 if lock, 0 otherwyse
*****************************************************/
int TunerGetTunerLock(void)
{
unsigned char byte;
TunerResetError();
TunerReadWrite(READ);
if(!Tuner.Error)
{
switch(Tuner.PLL)
{
case PLL_TUA6100:
byte = 0x80;
break;
default:
byte = 0x40;
break;
}
if(Tuner.RdBuffer[0] & byte)
return 1;
else
return 0;
}
else
return 0;
}
/*{{{ PrintTunerInfo ()*/
void PrintTunerInfo ( void )
{
TUNER_PROP stTunerProp;
int iTemp;
TunerGetProperties ( &stTunerProp );
do_report ( severity_info, "Tuner Info\n===========\n" );
do_report ( severity_info, "Name => %s\n",
stTunerProp . Name );
do_report ( severity_info, "Addr => %02X\n",
stTunerProp . Address );
do_report ( severity_info, "PLL Type => %d\n",
stTunerProp . PLL );
do_report ( severity_info, "IQ => %d\n",
stTunerProp . I_Q );
do_report ( severity_info, "FreqFactor => %d\n",
stTunerProp . FreqFactor );
do_report ( severity_info, "StepSize => %d\n",
stTunerProp . StepSize );
do_report ( severity_info, "IF => %d\n",
stTunerProp . IF );
do_report ( severity_info, "I2C Repeater => %s\n",
stTunerProp . Repeator ? "ON" : "OFF" );
do_report ( severity_info, "Tuner Params (W) [%d] =>",
stTunerProp . WrSize );
for ( iTemp = 0; iTemp < stTunerProp . WrSize; ++iTemp )
{
do_report ( severity_info, " %02X",
stTunerProp . WrBuffer [ iTemp ] );
}
do_report ( severity_info, "\n" );
do_report ( severity_info, "Tuner Params (R) [%d] =>",
stTunerProp . RdSize );
for ( iTemp = 0; iTemp < stTunerProp . RdSize; ++iTemp )
{
do_report ( severity_info, " %02X",
stTunerProp . RdBuffer [ iTemp ] );
}
do_report ( severity_info, "\n" );
do_report ( severity_info, "Tuner BW (%d) =>",
TUN_MAX_BW );
for ( iTemp = 0; iTemp < TUN_MAX_BW; ++iTemp )
{
do_report ( severity_info, " %d",
stTunerProp . BandWidth [ iTemp ] );
}
do_report ( severity_info, "\n" );
do_report ( severity_info, "Curr Steps => %ld\n",
TunerGetNbSteps () );
do_report ( severity_info, "Curr Freq => %ld, %ld\n",
TunerGetFrequency (),
5150000 - TunerGetFrequency () );
do_report ( severity_info, "Error => %d\n",
TunerGetError () );
do_report ( severity_info, "\n" );
}
/*}}}*/
/*{{{ TunerGetType ()*/
TUNER_TYPE TunerGetType ( void )
{
return Tuner . Type;
}
/*}}}*/
/*{{{ TunerGetStepSize ()*/
int TunerGetStepSize ( void )
{
#ifndef USE_PHILIPS_ZIF
if ( Tuner . StepSize <= 0 || Tuner . StepSize > 125000 )
return 125000;
#endif
return Tuner . StepSize;
}
/*}}}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -