parent
							
								
									6322c9343d
								
							
						
					
					
						commit
						b5e4b76885
					
				@ -1,5 +1,5 @@ | 
				
			|||||||
rtlsdr_HEADERS = rtl-sdr.h
 | 
					rtlsdr_HEADERS = rtl-sdr.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
noinst_HEADERS = rtlsdr_i2c.h tuner_e4000.h tuner_fc0012.h tuner_fc0013.h
 | 
					noinst_HEADERS = rtlsdr_i2c.h tuner_e4000.h tuner_fc0012.h tuner_fc0013.h tuner_fc2580.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rtlsdrdir = $(includedir)
 | 
					rtlsdrdir = $(includedir)
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,127 @@ | 
				
			|||||||
 | 
					#ifndef __TUNER_FC2580_H | 
				
			||||||
 | 
					#define __TUNER_FC2580_H | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	BORDER_FREQ	2600000	//2.6GHz : The border frequency which determines whether Low VCO or High VCO is used
 | 
				
			||||||
 | 
					#define USE_EXT_CLK	0	//0 : Use internal XTAL Oscillator / 1 : Use External Clock input
 | 
				
			||||||
 | 
					#define OFS_RSSI 57 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FC2580_I2C_ADDR		0xac | 
				
			||||||
 | 
					#define FC2580_CHECK_ADDR	0x01 | 
				
			||||||
 | 
					#define FC2580_CHECK_VAL	0x56 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum { | 
				
			||||||
 | 
						FC2580_UHF_BAND, | 
				
			||||||
 | 
						FC2580_L_BAND, | 
				
			||||||
 | 
						FC2580_VHF_BAND, | 
				
			||||||
 | 
						FC2580_NO_BAND | 
				
			||||||
 | 
					} fc2580_band_type; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum { | 
				
			||||||
 | 
						FC2580_FCI_FAIL, | 
				
			||||||
 | 
						FC2580_FCI_SUCCESS | 
				
			||||||
 | 
					} fc2580_fci_result_type; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum FUNCTION_STATUS | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
						FUNCTION_SUCCESS, | 
				
			||||||
 | 
						FUNCTION_ERROR, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern void fc2580_wait_msec(void *pTuner, int a); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fc2580_fci_result_type fc2580_i2c_write(void *pTuner, unsigned char reg, unsigned char val); | 
				
			||||||
 | 
					fc2580_fci_result_type fc2580_i2c_read(void *pTuner, unsigned char reg, unsigned char *read_data); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					       fc2580 initial setting | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This function is a generic function which gets called to initialize | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fc2580 in DVB-H mode or L-Band TDMB mode | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <input parameter> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ifagc_mode | 
				
			||||||
 | 
					    type : integer | 
				
			||||||
 | 
						1 : Internal AGC | 
				
			||||||
 | 
						2 : Voltage Control Mode | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==============================================================================*/ | 
				
			||||||
 | 
					fc2580_fci_result_type fc2580_set_init(void *pTuner, int ifagc_mode, unsigned int freq_xtal ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					       fc2580 frequency setting | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This function is a generic function which gets called to change LO Frequency | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  of fc2580 in DVB-H mode or L-Band TDMB mode | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <input parameter> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  f_lo | 
				
			||||||
 | 
						Value of target LO Frequency in 'kHz' unit | 
				
			||||||
 | 
						ex) 2.6GHz = 2600000 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==============================================================================*/ | 
				
			||||||
 | 
					fc2580_fci_result_type fc2580_set_freq(void *pTuner, unsigned int f_lo, unsigned int freq_xtal ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					       fc2580 filter BW setting | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This function is a generic function which gets called to change Bandwidth | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  frequency of fc2580's channel selection filter | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <input parameter> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  filter_bw | 
				
			||||||
 | 
					    1 : 1.53MHz(TDMB) | 
				
			||||||
 | 
						6 : 6MHz | 
				
			||||||
 | 
						7 : 7MHz | 
				
			||||||
 | 
						8 : 7.8MHz | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==============================================================================*/ | 
				
			||||||
 | 
					fc2580_fci_result_type fc2580_set_filter( void *pTuner, unsigned char filter_bw, unsigned int freq_xtal ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// The following context is FC2580 tuner API source code
 | 
				
			||||||
 | 
					// Definitions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AGC mode
 | 
				
			||||||
 | 
					enum FC2580_AGC_MODE | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
						FC2580_AGC_INTERNAL = 1, | 
				
			||||||
 | 
						FC2580_AGC_EXTERNAL = 2, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Bandwidth mode
 | 
				
			||||||
 | 
					enum FC2580_BANDWIDTH_MODE | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
						FC2580_BANDWIDTH_1530000HZ = 1, | 
				
			||||||
 | 
						FC2580_BANDWIDTH_6000000HZ = 6, | 
				
			||||||
 | 
						FC2580_BANDWIDTH_7000000HZ = 7, | 
				
			||||||
 | 
						FC2580_BANDWIDTH_8000000HZ = 8, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Manipulaing functions
 | 
				
			||||||
 | 
					int | 
				
			||||||
 | 
					fc2580_Initialize( | 
				
			||||||
 | 
						void *pTuner | 
				
			||||||
 | 
						); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int | 
				
			||||||
 | 
					fc2580_SetRfFreqHz( | 
				
			||||||
 | 
						void *pTuner, | 
				
			||||||
 | 
						unsigned long RfFreqHz | 
				
			||||||
 | 
						); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Extra manipulaing functions
 | 
				
			||||||
 | 
					int | 
				
			||||||
 | 
					fc2580_SetBandwidthMode( | 
				
			||||||
 | 
						void *pTuner, | 
				
			||||||
 | 
						int BandwidthMode | 
				
			||||||
 | 
						); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif | 
				
			||||||
@ -0,0 +1,494 @@ | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * FCI FC2580 tuner driver, taken from the kernel driver that can be found | 
				
			||||||
 | 
					 * on http://linux.terratec.de/tv_en.html
 | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 * This driver is a mess, and should be cleaned up/rewritten. | 
				
			||||||
 | 
					 * | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "rtlsdr_i2c.h" | 
				
			||||||
 | 
					#include "tuner_fc2580.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 16.384 MHz (at least on the Logilink VG0002A) */ | 
				
			||||||
 | 
					#define CRYSTAL_FREQ		16384000 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* glue functions to rtl-sdr code */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fc2580_fci_result_type fc2580_i2c_write(void *pTuner, unsigned char reg, unsigned char val) | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
						uint8_t data[2]; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						data[0] = reg; | 
				
			||||||
 | 
						data[1] = val; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (rtlsdr_i2c_write((rtlsdr_dev_t *)pTuner, FC2580_I2C_ADDR, data, 2) < 0) | 
				
			||||||
 | 
							return FC2580_FCI_FAIL; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return FC2580_FCI_SUCCESS; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fc2580_fci_result_type fc2580_i2c_read(void *pTuner, unsigned char reg, unsigned char *read_data) | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
						uint8_t data = reg; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (rtlsdr_i2c_write((rtlsdr_dev_t *)pTuner, FC2580_I2C_ADDR, &data, 1) < 0) | 
				
			||||||
 | 
							return FC2580_FCI_FAIL; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (rtlsdr_i2c_read((rtlsdr_dev_t *)pTuner, FC2580_I2C_ADDR, &data, 1) < 0) | 
				
			||||||
 | 
							return FC2580_FCI_FAIL; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*read_data = data; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return FC2580_FCI_SUCCESS; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int | 
				
			||||||
 | 
					fc2580_Initialize( | 
				
			||||||
 | 
						void *pTuner | 
				
			||||||
 | 
						) | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
						int AgcMode; | 
				
			||||||
 | 
						unsigned int CrystalFreqKhz; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//TODO set AGC mode
 | 
				
			||||||
 | 
						AgcMode = FC2580_AGC_EXTERNAL; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Initialize tuner with AGC mode.
 | 
				
			||||||
 | 
						// Note: CrystalFreqKhz = round(CrystalFreqHz / 1000)
 | 
				
			||||||
 | 
						CrystalFreqKhz = (unsigned int)((CRYSTAL_FREQ + 500) / 1000); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(fc2580_set_init(pTuner, AgcMode, CrystalFreqKhz) != FC2580_FCI_SUCCESS) | 
				
			||||||
 | 
							goto error_status_initialize_tuner; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return FUNCTION_SUCCESS; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					error_status_initialize_tuner: | 
				
			||||||
 | 
						return FUNCTION_ERROR; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int | 
				
			||||||
 | 
					fc2580_SetRfFreqHz( | 
				
			||||||
 | 
						void *pTuner, | 
				
			||||||
 | 
						unsigned long RfFreqHz | 
				
			||||||
 | 
						) | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
						unsigned int RfFreqKhz; | 
				
			||||||
 | 
						unsigned int CrystalFreqKhz; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Set tuner RF frequency in KHz.
 | 
				
			||||||
 | 
						// Note: RfFreqKhz = round(RfFreqHz / 1000)
 | 
				
			||||||
 | 
						//       CrystalFreqKhz = round(CrystalFreqHz / 1000)
 | 
				
			||||||
 | 
						RfFreqKhz = (unsigned int)((RfFreqHz + 500) / 1000); | 
				
			||||||
 | 
						CrystalFreqKhz = (unsigned int)((CRYSTAL_FREQ + 500) / 1000); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(fc2580_set_freq(pTuner, RfFreqKhz, CrystalFreqKhz) != FC2580_FCI_SUCCESS) | 
				
			||||||
 | 
							goto error_status_set_tuner_rf_frequency; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return FUNCTION_SUCCESS; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					error_status_set_tuner_rf_frequency: | 
				
			||||||
 | 
						return FUNCTION_ERROR; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@brief   Set FC2580 tuner bandwidth mode. | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/ | 
				
			||||||
 | 
					int | 
				
			||||||
 | 
					fc2580_SetBandwidthMode( | 
				
			||||||
 | 
						void *pTuner, | 
				
			||||||
 | 
						int BandwidthMode | 
				
			||||||
 | 
						) | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
						unsigned int CrystalFreqKhz; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Set tuner bandwidth mode.
 | 
				
			||||||
 | 
						// Note: CrystalFreqKhz = round(CrystalFreqHz / 1000)
 | 
				
			||||||
 | 
						CrystalFreqKhz = (unsigned int)((CRYSTAL_FREQ + 500) / 1000); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(fc2580_set_filter(pTuner, (unsigned char)BandwidthMode, CrystalFreqKhz) != FC2580_FCI_SUCCESS) | 
				
			||||||
 | 
							goto error_status_set_tuner_bandwidth_mode; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return FUNCTION_SUCCESS; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					error_status_set_tuner_bandwidth_mode: | 
				
			||||||
 | 
						return FUNCTION_ERROR; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void fc2580_wait_msec(void *pTuner, int a) | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
						/* USB latency is enough for now ;) */ | 
				
			||||||
 | 
					//	usleep(a * 1000);
 | 
				
			||||||
 | 
						return; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					       fc2580 initial setting | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This function is a generic function which gets called to initialize | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fc2580 in DVB-H mode or L-Band TDMB mode | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <input parameter> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ifagc_mode | 
				
			||||||
 | 
					    type : integer | 
				
			||||||
 | 
						1 : Internal AGC | 
				
			||||||
 | 
						2 : Voltage Control Mode | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==============================================================================*/ | 
				
			||||||
 | 
					fc2580_fci_result_type fc2580_set_init( void *pTuner, int ifagc_mode, unsigned int freq_xtal ) | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
						fc2580_fci_result_type result = FC2580_FCI_SUCCESS; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x00, 0x00);	/*** Confidential ***/ | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x12, 0x86); | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x14, 0x5C); | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x16, 0x3C); | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x1F, 0xD2); | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x09, 0xD7); | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x0B, 0xD5); | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x0C, 0x32); | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x0E, 0x43); | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x21, 0x0A); | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x22, 0x82); | 
				
			||||||
 | 
						if( ifagc_mode == 1 ) | 
				
			||||||
 | 
						{ | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x45, 0x10);	//internal AGC
 | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x4C, 0x00);	//HOLD_AGC polarity
 | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						else if( ifagc_mode == 2 ) | 
				
			||||||
 | 
						{ | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x45, 0x20);	//Voltage Control Mode
 | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x4C, 0x02);	//HOLD_AGC polarity
 | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x3F, 0x88); | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x02, 0x0E); | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x58, 0x14); | 
				
			||||||
 | 
						result &= fc2580_set_filter(pTuner, 8, freq_xtal);	//BW = 7.8MHz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return result; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					       fc2580 frequency setting | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This function is a generic function which gets called to change LO Frequency | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  of fc2580 in DVB-H mode or L-Band TDMB mode | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <input parameter> | 
				
			||||||
 | 
					  freq_xtal: kHz | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  f_lo | 
				
			||||||
 | 
						Value of target LO Frequency in 'kHz' unit | 
				
			||||||
 | 
						ex) 2.6GHz = 2600000 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==============================================================================*/ | 
				
			||||||
 | 
					fc2580_fci_result_type fc2580_set_freq( void *pTuner, unsigned int f_lo, unsigned int freq_xtal ) | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
						unsigned int f_diff, f_diff_shifted, n_val, k_val; | 
				
			||||||
 | 
						unsigned int f_vco, r_val, f_comp; | 
				
			||||||
 | 
						unsigned char pre_shift_bits = 4;// number of preshift to prevent overflow in shifting f_diff to f_diff_shifted
 | 
				
			||||||
 | 
						unsigned char data_0x18; | 
				
			||||||
 | 
						unsigned char data_0x02 = (USE_EXT_CLK<<5)|0x0E; | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						fc2580_band_type band = ( f_lo > 1000000 )? FC2580_L_BAND : ( f_lo > 400000 )? FC2580_UHF_BAND : FC2580_VHF_BAND; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fc2580_fci_result_type result = FC2580_FCI_SUCCESS; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						f_vco = ( band == FC2580_UHF_BAND )? f_lo * 4 : (( band == FC2580_L_BAND )? f_lo * 2 : f_lo * 12); | 
				
			||||||
 | 
						r_val = ( f_vco >= 2*76*freq_xtal )? 1 : ( f_vco >= 76*freq_xtal )? 2 : 4; | 
				
			||||||
 | 
						f_comp = freq_xtal/r_val; | 
				
			||||||
 | 
						n_val =	( f_vco / 2 ) / f_comp; | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						f_diff = f_vco - 2* f_comp * n_val; | 
				
			||||||
 | 
						f_diff_shifted = f_diff << ( 20 - pre_shift_bits ); | 
				
			||||||
 | 
						k_val = f_diff_shifted / ( ( 2* f_comp ) >> pre_shift_bits ); | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if( f_diff_shifted - k_val * ( ( 2* f_comp ) >> pre_shift_bits ) >= ( f_comp >> pre_shift_bits ) ) | 
				
			||||||
 | 
						k_val = k_val + 1; | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if( f_vco >= BORDER_FREQ )	//Select VCO Band
 | 
				
			||||||
 | 
							data_0x02 = data_0x02 | 0x08;	//0x02[3] = 1;
 | 
				
			||||||
 | 
						else | 
				
			||||||
 | 
							data_0x02 = data_0x02 & 0xF7;	//0x02[3] = 0;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					//	if( band != curr_band ) {
 | 
				
			||||||
 | 
							switch(band) | 
				
			||||||
 | 
							{ | 
				
			||||||
 | 
								case FC2580_UHF_BAND: | 
				
			||||||
 | 
									data_0x02 = (data_0x02 & 0x3F); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x25, 0xF0); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x27, 0x77); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x28, 0x53); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x29, 0x60); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x30, 0x09); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x50, 0x8C); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x53, 0x50); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if( f_lo < 538000 ) | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x5F, 0x13); | 
				
			||||||
 | 
									else					
 | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x5F, 0x15); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if( f_lo < 538000 ) | 
				
			||||||
 | 
									{ | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x61, 0x07); | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x62, 0x06); | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x67, 0x06); | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x68, 0x08); | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x69, 0x10); | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x6A, 0x12); | 
				
			||||||
 | 
									} | 
				
			||||||
 | 
									else if( f_lo < 794000 ) | 
				
			||||||
 | 
									{ | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x61, 0x03); | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x62, 0x03); | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x67, 0x03);  //ACI improve
 | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x68, 0x05);  //ACI improve
 | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x69, 0x0C); | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x6A, 0x0E); | 
				
			||||||
 | 
									} | 
				
			||||||
 | 
									else | 
				
			||||||
 | 
									{ | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x61, 0x07); | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x62, 0x06); | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x67, 0x07); | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x68, 0x09); | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x69, 0x10); | 
				
			||||||
 | 
										result &= fc2580_i2c_write(pTuner, 0x6A, 0x12); | 
				
			||||||
 | 
									} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x63, 0x15); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6B, 0x0B); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6C, 0x0C); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6D, 0x78); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6E, 0x32); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6F, 0x14); | 
				
			||||||
 | 
									result &= fc2580_set_filter(pTuner, 8, freq_xtal);	//BW = 7.8MHz
 | 
				
			||||||
 | 
									break; | 
				
			||||||
 | 
								case FC2580_VHF_BAND: | 
				
			||||||
 | 
									data_0x02 = (data_0x02 & 0x3F) | 0x80; | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x27, 0x77); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x28, 0x33); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x29, 0x40); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x30, 0x09); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x50, 0x8C); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x53, 0x50); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x5F, 0x0F); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x61, 0x07); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x62, 0x00); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x63, 0x15); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x67, 0x03); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x68, 0x05); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x69, 0x10); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6A, 0x12); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6B, 0x08); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6C, 0x0A); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6D, 0x78); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6E, 0x32); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6F, 0x54); | 
				
			||||||
 | 
									result &= fc2580_set_filter(pTuner, 7, freq_xtal);	//BW = 6.8MHz
 | 
				
			||||||
 | 
									break; | 
				
			||||||
 | 
								case FC2580_L_BAND: | 
				
			||||||
 | 
									data_0x02 = (data_0x02 & 0x3F) | 0x40; | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x2B, 0x70); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x2C, 0x37); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x2D, 0xE7); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x30, 0x09); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x44, 0x20); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x50, 0x8C); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x53, 0x50); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x5F, 0x0F); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x61, 0x0F); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x62, 0x00); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x63, 0x13); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x67, 0x00); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x68, 0x02); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x69, 0x0C); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6A, 0x0E); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6B, 0x08); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6C, 0x0A); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6D, 0xA0); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6E, 0x50); | 
				
			||||||
 | 
									result &= fc2580_i2c_write(pTuner, 0x6F, 0x14); | 
				
			||||||
 | 
									result &= fc2580_set_filter(pTuner, 1, freq_xtal);	//BW = 1.53MHz
 | 
				
			||||||
 | 
									break; | 
				
			||||||
 | 
								default: | 
				
			||||||
 | 
									break; | 
				
			||||||
 | 
							} | 
				
			||||||
 | 
					//		curr_band = band;
 | 
				
			||||||
 | 
					//	}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//A command about AGC clock's pre-divide ratio
 | 
				
			||||||
 | 
						if( freq_xtal >= 28000 ) | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x4B, 0x22 ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//Commands about VCO Band and PLL setting.
 | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x02, data_0x02); | 
				
			||||||
 | 
						data_0x18 = ( ( r_val == 1 )? 0x00 : ( ( r_val == 2 )? 0x10 : 0x20 ) ) + (unsigned char)(k_val >> 16); | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x18, data_0x18);						//Load 'R' value and high part of 'K' values
 | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x1A, (unsigned char)( k_val >> 8 ) );	//Load middle part of 'K' value
 | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x1B, (unsigned char)( k_val ) );		//Load lower part of 'K' value
 | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x1C, (unsigned char)( n_val ) );		//Load 'N' value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//A command about UHF LNA Load Cap
 | 
				
			||||||
 | 
						if( band == FC2580_UHF_BAND ) | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x2D, ( f_lo <= (unsigned int)794000 )? 0x9F : 0x8F );	//LNA_OUT_CAP
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return result; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					       fc2580 filter BW setting | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This function is a generic function which gets called to change Bandwidth | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  frequency of fc2580's channel selection filter | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <input parameter> | 
				
			||||||
 | 
					  freq_xtal: kHz | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  filter_bw | 
				
			||||||
 | 
					    1 : 1.53MHz(TDMB) | 
				
			||||||
 | 
						6 : 6MHz   (Bandwidth 6MHz) | 
				
			||||||
 | 
						7 : 6.8MHz (Bandwidth 7MHz) | 
				
			||||||
 | 
						8 : 7.8MHz (Bandwidth 8MHz) | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==============================================================================*/ | 
				
			||||||
 | 
					fc2580_fci_result_type fc2580_set_filter( void *pTuner, unsigned char filter_bw, unsigned int freq_xtal ) | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
						unsigned char	cal_mon, i; | 
				
			||||||
 | 
						fc2580_fci_result_type result = FC2580_FCI_SUCCESS; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(filter_bw == 1) | 
				
			||||||
 | 
						{ | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x36, 0x1C); | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x37, (unsigned char)(4151*freq_xtal/1000000) ); | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x39, 0x00); | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x2E, 0x09); | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						if(filter_bw == 6) | 
				
			||||||
 | 
						{ | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x36, 0x18); | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x37, (unsigned char)(4400*freq_xtal/1000000) ); | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x39, 0x00); | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x2E, 0x09); | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						else if(filter_bw == 7) | 
				
			||||||
 | 
						{ | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x36, 0x18); | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x37, (unsigned char)(3910*freq_xtal/1000000) ); | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x39, 0x80); | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x2E, 0x09); | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						else if(filter_bw == 8) | 
				
			||||||
 | 
						{ | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x36, 0x18); | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x37, (unsigned char)(3300*freq_xtal/1000000) ); | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x39, 0x80); | 
				
			||||||
 | 
							result &= fc2580_i2c_write(pTuner, 0x2E, 0x09); | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						for(i=0; i<5; i++) | 
				
			||||||
 | 
						{ | 
				
			||||||
 | 
							fc2580_wait_msec(pTuner, 5);//wait 5ms
 | 
				
			||||||
 | 
							result &= fc2580_i2c_read(pTuner, 0x2F, &cal_mon); | 
				
			||||||
 | 
							if( (cal_mon & 0xC0) != 0xC0) | 
				
			||||||
 | 
							{ | 
				
			||||||
 | 
								result &= fc2580_i2c_write(pTuner, 0x2E, 0x01); | 
				
			||||||
 | 
								result &= fc2580_i2c_write(pTuner, 0x2E, 0x09); | 
				
			||||||
 | 
							} | 
				
			||||||
 | 
							else | 
				
			||||||
 | 
								break; | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result &= fc2580_i2c_write(pTuner, 0x2E, 0x01); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return result; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					       fc2580 RSSI function | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This function is a generic function which returns fc2580's | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  current RSSI value. | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <input parameter> | 
				
			||||||
 | 
						none | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <return value> | 
				
			||||||
 | 
					  int | 
				
			||||||
 | 
					  	rssi : estimated input power. | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==============================================================================*/ | 
				
			||||||
 | 
					//int fc2580_get_rssi(void) {
 | 
				
			||||||
 | 
					//	
 | 
				
			||||||
 | 
					//	unsigned char s_lna, s_rfvga, s_cfs, s_ifvga;
 | 
				
			||||||
 | 
					//	int ofs_lna, ofs_rfvga, ofs_csf, ofs_ifvga, rssi;
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//	fc2580_i2c_read(0x71, &s_lna );
 | 
				
			||||||
 | 
					//	fc2580_i2c_read(0x72, &s_rfvga );
 | 
				
			||||||
 | 
					//	fc2580_i2c_read(0x73, &s_cfs );
 | 
				
			||||||
 | 
					//	fc2580_i2c_read(0x74, &s_ifvga );
 | 
				
			||||||
 | 
					//	
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//	ofs_lna = 
 | 
				
			||||||
 | 
					//			(curr_band==FC2580_UHF_BAND)?
 | 
				
			||||||
 | 
					//				(s_lna==0)? 0 :
 | 
				
			||||||
 | 
					//				(s_lna==1)? -6 :
 | 
				
			||||||
 | 
					//				(s_lna==2)? -17 :
 | 
				
			||||||
 | 
					//				(s_lna==3)? -22 : -30 :
 | 
				
			||||||
 | 
					//			(curr_band==FC2580_VHF_BAND)?
 | 
				
			||||||
 | 
					//				(s_lna==0)? 0 :
 | 
				
			||||||
 | 
					//				(s_lna==1)? -6 :
 | 
				
			||||||
 | 
					//				(s_lna==2)? -19 :
 | 
				
			||||||
 | 
					//				(s_lna==3)? -24 : -32 :
 | 
				
			||||||
 | 
					//			(curr_band==FC2580_L_BAND)?
 | 
				
			||||||
 | 
					//				(s_lna==0)? 0 :
 | 
				
			||||||
 | 
					//				(s_lna==1)? -6 :
 | 
				
			||||||
 | 
					//				(s_lna==2)? -11 :
 | 
				
			||||||
 | 
					//				(s_lna==3)? -16 : -34 :
 | 
				
			||||||
 | 
					//			0;//FC2580_NO_BAND
 | 
				
			||||||
 | 
					//	ofs_rfvga = -s_rfvga+((s_rfvga>=11)? 1 : 0) + ((s_rfvga>=18)? 1 : 0);
 | 
				
			||||||
 | 
					//	ofs_csf = -6*s_cfs;
 | 
				
			||||||
 | 
					//	ofs_ifvga = s_ifvga/4;
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//	return rssi = ofs_lna+ofs_rfvga+ofs_csf+ofs_ifvga+OFS_RSSI;
 | 
				
			||||||
 | 
					//				
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					       fc2580 Xtal frequency Setting | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This function is a generic function which sets 
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  the frequency of xtal. | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <input parameter> | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  frequency | 
				
			||||||
 | 
					  	frequency value of internal(external) Xtal(clock) in kHz unit. | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==============================================================================*/ | 
				
			||||||
 | 
					//void fc2580_set_freq_xtal(unsigned int frequency) {
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//	freq_xtal = frequency;
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue