@ -20,7 +20,8 @@ int r820t_SetRfFreqHz(void *pTuner, unsigned long RfFreqHz)
// R828Info.R828_Standard = (R828_Standard_Type)pExtra->StandardMode;
R828Info . R828_Standard = ( R828_Standard_Type ) DVB_T_6M ;
R828Info . RF_KHz = ( UINT32 ) ( RfFreqHz / 1000 ) ;
R828Info . RF_Hz = ( UINT32 ) ( RfFreqHz ) ;
R828Info . RF_KHz = ( UINT32 ) ( RfFreqHz / 1000 ) ;
if ( R828_SetFrequency ( pTuner , R828Info , NORMAL_MODE ) ! = RT_Success )
return FUNCTION_ERROR ;
@ -981,11 +982,11 @@ R828_ErrCode R828_Init(void *pTuner)
if ( R828_IMR_done_flag = = FALSE )
{
#if 0
//write initial reg
if ( R828_InitReg ( pTuner ) ! = RT_Success )
return RT_Fail ;
# endif
// if(R828_InitReg(pTuner) != RT_Success)
// return RT_Fail;
//Do Xtal check
if ( ( Rafael_Chip = = R820T ) | | ( Rafael_Chip = = R828S ) | | ( Rafael_Chip = = R820C ) )
{
@ -1022,6 +1023,7 @@ R828_ErrCode R828_Init(void *pTuner)
R828_Fil_Cal_flag [ i ] = FALSE ;
R828_Fil_Cal_code [ i ] = 0 ;
}
#if 0
//start imr cal.
if ( R828_InitReg ( pTuner ) ! = RT_Success ) //write initial reg before doing cal
@ -1266,7 +1268,7 @@ R828_ErrCode R828_IMR(void *pTuner, UINT8 IMR_MEM, int IM_Flag)
if ( R828_MUX ( pTuner , RingFreq - 5300 ) ! = RT_Success ) //MUX input freq ~ RF_in Freq
return RT_Fail ;
if ( R828_PLL ( pTuner , ( RingFreq - 5300 ) , STD_SIZE ) ! = RT_Success ) //set pll freq = ring freq - 6M
if ( R828_PLL ( pTuner , ( RingFreq - 5300 ) * 1000 , STD_SIZE ) ! = RT_Success ) //set pll freq = ring freq - 6M
return RT_Fail ;
if ( IM_Flag = = TRUE )
@ -1331,9 +1333,9 @@ R828_ErrCode R828_PLL(void *pTuner, UINT32 LO_Freq, R828_Standard_Type R828_Stan
UINT8 Si ;
UINT8 DivNum ;
UINT8 Nint ;
UINT32 VCO_Min ;
UINT32 VCO_Max ;
UINT32 VCO_Freq ;
UINT32 VCO_Min_kHz ;
UINT32 VCO_Max_kHz ;
uint64_t VCO_Freq ;
UINT32 PLL_Ref ; //Max 24000 (kHz)
UINT32 VCO_Fra ; //VCO contribution by SDM (kHz)
UINT16 Nsdm ;
@ -1349,8 +1351,8 @@ R828_ErrCode R828_PLL(void *pTuner, UINT32 LO_Freq, R828_Standard_Type R828_Stan
Si = 0 ;
DivNum = 0 ;
Nint = 0 ;
VCO_Min = 1770000 ;
VCO_Max = VCO_Min * 2 ;
VCO_Min_kHz = 1770000 ;
VCO_Max_kHz = VCO_Min_kHz * 2 ;
VCO_Freq = 0 ;
PLL_Ref = 0 ; //Max 24000 (kHz)
VCO_Fra = 0 ; //VCO contribution by SDM (kHz)
@ -1361,6 +1363,7 @@ R828_ErrCode R828_PLL(void *pTuner, UINT32 LO_Freq, R828_Standard_Type R828_Stan
//UINT8 Judge = 0;
VCO_fine_tune = 0 ;
#if 0
if ( ( Rafael_Chip = = R620D ) | | ( Rafael_Chip = = R828D ) | | ( Rafael_Chip = = R828 ) ) //X'tal can't not exceed 20MHz for ATV
{
if ( R828_Standard < = SECAM_L1 ) //ref set refdiv2, reffreq = Xtal/2 on ATV application
@ -1387,6 +1390,10 @@ R828_ErrCode R828_PLL(void *pTuner, UINT32 LO_Freq, R828_Standard_Type R828_Stan
PLL_Ref = R828_Xtal ;
}
}
# endif
//FIXME hack
R828_Arry [ 11 ] & = 0xEF ;
PLL_Ref = rtlsdr_get_tuner_clock ( pTuner ) ;
R828_I2C . RegAddr = 0x10 ;
R828_I2C . Data = R828_Arry [ 11 ] ;
@ -1410,14 +1417,14 @@ R828_ErrCode R828_PLL(void *pTuner, UINT32 LO_Freq, R828_Standard_Type R828_Stan
//Divider
while ( MixDiv < = 64 )
{
if ( ( ( LO_Freq * MixDiv ) > = VCO_Min ) & & ( ( LO_Freq * MixDiv ) < VCO_Max ) )
if ( ( ( ( LO_Freq / 1000 ) * MixDiv ) > = VCO_Min_kHz ) & & ( ( ( LO_Freq / 1000 ) * MixDiv ) < VCO_Max_kHz ) )
{
DivBuf = MixDiv ;
while ( DivBuf > 2 )
{
DivBuf = DivBuf > > 1 ;
DivNum + + ;
}
}
break ;
}
MixDiv = MixDiv < < 1 ;
@ -1442,9 +1449,14 @@ R828_ErrCode R828_PLL(void *pTuner, UINT32 LO_Freq, R828_Standard_Type R828_Stan
if ( I2C_Write ( pTuner , & R828_I2C ) ! = RT_Success )
return RT_Fail ;
VCO_Freq = LO_Freq * MixDiv ;
VCO_Freq = ( uint64_t ) ( LO_Freq * ( uint64_t ) MixDiv ) ;
Nint = ( UINT8 ) ( VCO_Freq / 2 / PLL_Ref ) ;
VCO_Fra = ( UINT16 ) ( VCO_Freq - 2 * PLL_Ref * Nint ) ;
VCO_Fra = ( UINT16 ) ( ( VCO_Freq - 2 * PLL_Ref * Nint ) / 1000 ) ;
//FIXME hack
PLL_Ref / = 1000 ;
// printf("VCO_Freq = %lu, Nint= %u, VCO_Fra= %lu, LO_Freq= %u, MixDiv= %u\n", VCO_Freq, Nint, VCO_Fra, LO_Freq, MixDiv);
//boundary spur prevention
if ( VCO_Fra < PLL_Ref / 64 ) //2*PLL_Ref/128
@ -1530,12 +1542,14 @@ R828_ErrCode R828_PLL(void *pTuner, UINT32 LO_Freq, R828_Standard_Type R828_Stan
if ( ( R828_I2C_Len . Data [ 2 ] & 0x40 ) = = 0x00 )
{
fprintf ( stderr , " [R820T] PLL not locked! " ) ;
fprintf ( stderr , " [R820T] PLL not locked for %u Hz ! \n " , LO_Freq ) ;
R828_I2C . RegAddr = 0x12 ;
R828_Arry [ 13 ] = ( R828_Arry [ 13 ] & 0x1F ) | 0x60 ; //increase VCO current
R828_I2C . Data = R828_Arry [ 13 ] ;
if ( I2C_Write ( pTuner , & R828_I2C ) ! = RT_Success )
return RT_Fail ;
return RT_Fail ;
}
//set pll autotune = 8kHz
@ -2518,7 +2532,7 @@ R828_ErrCode R828_Filt_Cal(void *pTuner, UINT32 Cal_Freq,BW_Type R828_BW)
return RT_Fail ;
//Set PLL Freq = Filter Cali Freq
if ( R828_PLL ( pTuner , Cal_Freq , STD_SIZE ) ! = RT_Success )
if ( R828_PLL ( pTuner , Cal_Freq * 1000 , STD_SIZE ) ! = RT_Success )
return RT_Fail ;
//Start Trigger
@ -2552,7 +2566,7 @@ R828_ErrCode R828_Filt_Cal(void *pTuner, UINT32 Cal_Freq,BW_Type R828_BW)
R828_ErrCode R828_SetFrequency ( void * pTuner , R828_Set_Info R828_INFO , R828_SetFreq_Type R828_SetFreqMode )
{
UINT32 LO_K Hz ;
UINT32 LO_Hz ;
#if 0
// Check Input Frequency Range
@ -2563,16 +2577,16 @@ R828_ErrCode R828_SetFrequency(void *pTuner, R828_Set_Info R828_INFO, R828_SetFr
# endif
if ( R828_INFO . R828_Standard = = SECAM_L1 )
LO_K Hz = R828_INFO . RF_K Hz - Sys_Info1 . IF_KHz ;
LO_Hz = R828_INFO . RF_Hz - ( Sys_Info1 . IF_KHz * 1000 ) ;
else
LO_K Hz = R828_INFO . RF_K Hz + Sys_Info1 . IF_KHz ;
LO_ Hz = R828_INFO . RF_Hz + ( Sys_Info1 . IF_KHz * 1000 ) ;
//Set MUX dependent var. Must do before PLL( )
if ( R828_MUX ( pTuner , LO_K Hz ) ! = RT_Success )
if ( R828_MUX ( pTuner , LO_Hz / 1000 ) ! = RT_Success )
return RT_Fail ;
//Set PLL
if ( R828_PLL ( pTuner , LO_K Hz , R828_INFO . R828_Standard ) ! = RT_Success )
if ( R828_PLL ( pTuner , LO_Hz , R828_INFO . R828_Standard ) ! = RT_Success )
return RT_Fail ;
R828_IMR_point_num = Freq_Info1 . IMR_MEM ;