|
@@ -2929,7 +2929,60 @@ R828_ErrCode R828_GetRfGain(void *pTuner, R828_RF_Gain_Info *pR828_rf_gain)
|
|
return RT_Success;
|
|
return RT_Success;
|
|
}
|
|
}
|
|
|
|
|
|
-R828_ErrCode R828_RfGainMode(void *pTuner, R828_RF_Gain_TYPE R828_RfGainType)
|
|
|
|
|
|
+
|
|
|
|
+/* measured with a Racal 6103E GSM test set at 928 MHz with -60 dBm
|
|
|
|
+ * input power, for raw results see:
|
|
|
|
+ * http://steve-m.de/projects/rtl-sdr/gain_measurement/r820t/
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#define VGA_BASE_GAIN -47
|
|
|
|
+static const int r820t_vga_gain_steps[] = {
|
|
|
|
+ 0, 26, 26, 30, 42, 35, 24, 13, 14, 32, 36, 34, 35, 37, 35, 36
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static const int r820t_lna_gain_steps[] = {
|
|
|
|
+ 0, 9, 13, 40, 38, 13, 31, 22, 26, 31, 26, 14, 19, 5, 35, 13
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static const int r820t_mixer_gain_steps[] = {
|
|
|
|
+ 0, 5, 10, 10, 19, 9, 10, 25, 17, 10, 8, 16, 13, 6, 3, -8
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+R828_ErrCode R828_SetRfGain(void *pTuner, int gain)
|
|
|
|
+{
|
|
|
|
+ int i, total_gain = 0;
|
|
|
|
+ uint8_t mix_index = 0, lna_index = 0;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < 15; i++) {
|
|
|
|
+ if (total_gain >= gain)
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ total_gain += r820t_lna_gain_steps[++lna_index];
|
|
|
|
+
|
|
|
|
+ if (total_gain >= gain)
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ total_gain += r820t_mixer_gain_steps[++mix_index];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* set LNA gain */
|
|
|
|
+ R828_I2C.RegAddr = 0x05;
|
|
|
|
+ R828_Arry[0] = (R828_Arry[0] & 0xF0) | lna_index;
|
|
|
|
+ R828_I2C.Data = R828_Arry[0];
|
|
|
|
+ if(I2C_Write(pTuner, &R828_I2C) != RT_Success)
|
|
|
|
+ return RT_Fail;
|
|
|
|
+
|
|
|
|
+ /* set Mixer gain */
|
|
|
|
+ R828_I2C.RegAddr = 0x07;
|
|
|
|
+ R828_Arry[2] = (R828_Arry[2] & 0xF0) | mix_index;
|
|
|
|
+ R828_I2C.Data = R828_Arry[2];
|
|
|
|
+ if(I2C_Write(pTuner, &R828_I2C) != RT_Success)
|
|
|
|
+ return RT_Fail;
|
|
|
|
+
|
|
|
|
+ return RT_Success;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+R828_ErrCode R828_RfGainMode(void *pTuner, int manual)
|
|
{
|
|
{
|
|
UINT8 MixerGain;
|
|
UINT8 MixerGain;
|
|
UINT8 LnaGain;
|
|
UINT8 LnaGain;
|
|
@@ -2937,8 +2990,7 @@ R828_ErrCode R828_RfGainMode(void *pTuner, R828_RF_Gain_TYPE R828_RfGainType)
|
|
MixerGain = 0;
|
|
MixerGain = 0;
|
|
LnaGain = 0;
|
|
LnaGain = 0;
|
|
|
|
|
|
- if(R828_RfGainType==RF_MANUAL)
|
|
|
|
- {
|
|
|
|
|
|
+ if (manual) {
|
|
//LNA auto off
|
|
//LNA auto off
|
|
R828_I2C.RegAddr = 0x05;
|
|
R828_I2C.RegAddr = 0x05;
|
|
R828_Arry[0] = R828_Arry[0] | 0x10;
|
|
R828_Arry[0] = R828_Arry[0] | 0x10;
|
|
@@ -2958,25 +3010,15 @@ R828_ErrCode R828_RfGainMode(void *pTuner, R828_RF_Gain_TYPE R828_RfGainType)
|
|
if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success)
|
|
if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success)
|
|
return RT_Fail;
|
|
return RT_Fail;
|
|
|
|
|
|
- MixerGain = (R828_I2C_Len.Data[3] & 0xF0) >> 4;
|
|
|
|
- LnaGain = R828_I2C_Len.Data[3] & 0x0F;
|
|
|
|
|
|
+ /* set fixed VGA gain for now (16.3 dB) */
|
|
|
|
+ R828_I2C.RegAddr = 0x0C;
|
|
|
|
+ R828_Arry[7] = (R828_Arry[7] & 0x60) | 0x08;
|
|
|
|
+ R828_I2C.Data = R828_Arry[7];
|
|
|
|
+ if(I2C_Write(pTuner, &R828_I2C) != RT_Success)
|
|
|
|
+ return RT_Fail;
|
|
|
|
|
|
- //set LNA gain
|
|
|
|
- R828_I2C.RegAddr = 0x05;
|
|
|
|
- R828_Arry[0] = (R828_Arry[0] & 0xF0) | LnaGain;
|
|
|
|
- R828_I2C.Data = R828_Arry[0];
|
|
|
|
- if(I2C_Write(pTuner, &R828_I2C) != RT_Success)
|
|
|
|
- return RT_Fail;
|
|
|
|
|
|
|
|
- //set Mixer gain
|
|
|
|
- R828_I2C.RegAddr = 0x07;
|
|
|
|
- R828_Arry[2] = (R828_Arry[2] & 0xF0) | MixerGain;
|
|
|
|
- R828_I2C.Data = R828_Arry[2];
|
|
|
|
- if(I2C_Write(pTuner, &R828_I2C) != RT_Success)
|
|
|
|
- return RT_Fail;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
|
|
+ } else {
|
|
//LNA
|
|
//LNA
|
|
R828_I2C.RegAddr = 0x05;
|
|
R828_I2C.RegAddr = 0x05;
|
|
R828_Arry[0] = R828_Arry[0] & 0xEF;
|
|
R828_Arry[0] = R828_Arry[0] & 0xEF;
|
|
@@ -2990,6 +3032,13 @@ R828_ErrCode R828_RfGainMode(void *pTuner, R828_RF_Gain_TYPE R828_RfGainType)
|
|
R828_I2C.Data = R828_Arry[2];
|
|
R828_I2C.Data = R828_Arry[2];
|
|
if(I2C_Write(pTuner, &R828_I2C) != RT_Success)
|
|
if(I2C_Write(pTuner, &R828_I2C) != RT_Success)
|
|
return RT_Fail;
|
|
return RT_Fail;
|
|
|
|
+
|
|
|
|
+ /* set fixed VGA gain for now (26.5 dB) */
|
|
|
|
+ R828_I2C.RegAddr = 0x0C;
|
|
|
|
+ R828_Arry[7] = (R828_Arry[7] & 0x60) | 0x0B;
|
|
|
|
+ R828_I2C.Data = R828_Arry[7];
|
|
|
|
+ if(I2C_Write(pTuner, &R828_I2C) != RT_Success)
|
|
|
|
+ return RT_Fail;
|
|
}
|
|
}
|
|
|
|
|
|
return RT_Success;
|
|
return RT_Success;
|