summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/tuner_r820t.h1
-rw-r--r--src/tuner_r820t.c58
2 files changed, 37 insertions, 22 deletions
diff --git a/include/tuner_r820t.h b/include/tuner_r820t.h
index 5d15bfe..10b8a1e 100644
--- a/include/tuner_r820t.h
+++ b/include/tuner_r820t.h
@@ -130,6 +130,7 @@ typedef enum _R828_GPIO_Type
typedef struct _R828_Set_Info
{
+ UINT32 RF_Hz;
UINT32 RF_KHz;
R828_Standard_Type R828_Standard;
R828_LoopThrough_Type RT_Input;
diff --git a/src/tuner_r820t.c b/src/tuner_r820t.c
index d1a5e64..3adca2e 100644
--- a/src/tuner_r820t.c
+++ b/src/tuner_r820t.c
@@ -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_KHz;
+ 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_KHz = R828_INFO.RF_KHz - Sys_Info1.IF_KHz;
+ LO_Hz = R828_INFO.RF_Hz - (Sys_Info1.IF_KHz * 1000);
else
- LO_KHz = R828_INFO.RF_KHz + 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_KHz) != RT_Success)
+ if(R828_MUX(pTuner, LO_Hz/1000) != RT_Success)
return RT_Fail;
//Set PLL
- if(R828_PLL(pTuner, LO_KHz, 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;