@ -20,21 +20,35 @@
/* Incomplete list of register settings:
*
* Name Reg Bits Desc
* CHIP_ID 0x00 0 - 7 Chip ID ( constant 0xA1 )
* RF_A 0x01 0 - 3 Number of count - to - 9 cycles in RF
* divider ( suggested : 2. .9 )
* RF_M 0x02 0 - 7 Total number of cycles ( to - 8 and to - 9 )
* in RF divider
* RF_K_HIGH 0x03 0 - 6 Bits 8. .14 of fractional divider
* RF_K_LOW 0x04 0 - 7 Bits 0. .7 of fractional RF divider
* RF_OUTDIV_A 0x05 3 - 7 Power of two required ?
* LNA_POWER_DOWN 0x06 0 Set to 1 to switch off low noise amp
* VCO_SPEED 0x06 3 Set the speed of the VCO . example
* driver hardcodes to 1 for some reason
* RF_OUTDIV_B 0x06 1 Set to select 3 instead of 2 for the
* RF output divider
* VCO_SPEED 0x06 3 Select tuning range of VCO :
* 0 = Low range , ( ca . 1.1 - 1.5 GHz )
* 1 = High range ( ca . 1.4 - 1.8 GHz )
* BANDWIDTH 0x06 6 - 7 Set bandwidth . 6 MHz = 0x80 , 7 MHz = 0x40
* 8 MHz = 0x00
* XTAL_SPEED 0x07 5 Set to 1 for 28.8 MHz Crystal input
* or 0 for 36 MHz
* < agc params > 0x08 0 - 7
* EN_CAL_RSSI 0x09 4 Enable calibrate RSSI
* ( Receive Signal Strength Indicator )
* LNA_FORCE 0x0d 0
* AGC_FORCE 0x0d ?
* LNA_GAIN 0x13 0 - 4 Low noise amp gain
* LNA_GAIN 0x13 3 - 4 Low noise amp gain
* LNA_COMPS 0x15 3 ?
* VCO_CALIB 0x0e 7 Set high then low to calibrate VCO
*
* ( fast lock ? )
* VCO_VOLTAGE 0x0e 0 - 6 Read Control voltage of VCO
* ( big value - > low freq )
*/
/* glue functions to rtl-sdr code */
@ -99,12 +113,11 @@ void FC0012_Dump_Registers()
DEBUGF ( " LNA Force: \t %s \n " , ( regBuf & 0x1 ) ? " Forced " : " Not Forced " ) ;
FC0012_Read ( pTuner , 0x13 , & regBuf ) ;
DEBUGF ( " LNA Gain: \t " ) ;
switch ( regBuf ) {
case ( 0x10 ) : DEBUGF ( " 19.7dB \n " ) ; break ;
case ( 0x17 ) : DEBUGF ( " 17.9dB \n " ) ; break ;
case ( 0x08 ) : DEBUGF ( " 7.1dB \n " ) ; break ;
case ( 0x02 ) : DEBUGF ( " -9.9dB \n " ) ; break ;
default : DEBUGF ( " unknown gain value 0x02x \n " ) ;
switch ( regBuf & 0x18 ) {
case ( 0x00 ) : DEBUGF ( " Low \n " ) ; break ;
case ( 0x08 ) : DEBUGF ( " Middle \n " ) ; break ;
case ( 0x10 ) : DEBUGF ( " High \n " ) ; break ;
default : DEBUGF ( " unknown gain value 0x18 \n " ) ;
}
# endif
}
@ -173,7 +186,7 @@ void FC0012_Frequency_Control(unsigned int Frequency, unsigned short Bandwidth)
int FC0012_SetFrequency ( void * pTuner , unsigned long Frequency , unsigned short Bandwidth )
{
int VCO1 = 0 ;
int VCO_band = 0 ;
unsigned long doubleVCO ;
unsigned short xin , xdiv ;
unsigned char reg [ 21 ] , am , pm , multi ;
@ -230,7 +243,7 @@ int FC0012_SetFrequency(void *pTuner, unsigned long Frequency, unsigned short Ba
doubleVCO = Frequency * multi ;
reg [ 6 ] = reg [ 6 ] | 0x08 ;
VCO1 = 1 ;
VCO_band = 1 ;
xdiv = ( unsigned short ) ( doubleVCO / ( CrystalFreqKhz / 2 ) ) ;
if ( ( doubleVCO - xdiv * ( CrystalFreqKhz / 2 ) ) > = ( CrystalFreqKhz / 4 ) )
xdiv = xdiv + 1 ;
@ -269,7 +282,6 @@ int FC0012_SetFrequency(void *pTuner, unsigned long Frequency, unsigned short Ba
if ( FC0012_Write ( pTuner , 0x03 , reg [ 3 ] ) ) return - 1 ;
if ( FC0012_Write ( pTuner , 0x04 , reg [ 4 ] ) ) return - 1 ;
//reg[5] = reg[5] | 0x07; // This is really not cool. Why is it there?
// Same with hardcoding VCO=1
if ( FC0012_Write ( pTuner , 0x05 , reg [ 5 ] ) ) return - 1 ;
if ( FC0012_Write ( pTuner , 0x06 , reg [ 6 ] ) ) return - 1 ;
@ -277,16 +289,19 @@ int FC0012_SetFrequency(void *pTuner, unsigned long Frequency, unsigned short Ba
if ( FC0012_Write ( pTuner , 0x0E , 0x80 ) ) return - 1 ;
if ( FC0012_Write ( pTuner , 0x0E , 0x00 ) ) return - 1 ;
// VCO Re-Calibration if needed
// Read resulting VCO control voltage
if ( FC0012_Write ( pTuner , 0x0E , 0x00 ) ) return - 1 ;
if ( FC0012_Read ( pTuner , 0x0E , & read_byte ) ) return - 1 ;
reg [ 14 ] = 0x3F & read_byte ;
if ( VCO1 )
// Adjust VCO range if control voltage is at the limit
if ( VCO_band )
{
// high-band VCO hitting low frequency bound
if ( reg [ 14 ] > 0x3C )
{
reg [ 6 ] = 0x08 | reg [ 6 ] ;
// select low-band VCO
reg [ 6 ] = ~ 0x08 & reg [ 6 ] ;
if ( FC0012_Write ( pTuner , 0x06 , reg [ 6 ] ) ) return - 1 ;
if ( FC0012_Write ( pTuner , 0x0E , 0x80 ) ) return - 1 ;
@ -295,7 +310,9 @@ int FC0012_SetFrequency(void *pTuner, unsigned long Frequency, unsigned short Ba
}
else
{
// low-band VCO hitting high frequency bound
if ( reg [ 14 ] < 0x02 ) {
// select high-band VCO
reg [ 6 ] = 0x08 | reg [ 6 ] ;
if ( FC0012_Write ( pTuner , 0x06 , reg [ 6 ] ) ) return - 1 ;