📄 hamaro_cx24128.c
字号:
{
return (False);
}
}
else
{
return (False);
}
return (True);
}
/*******************************************************************************************************
* HAMARO_TUNER_CX24128_powerup()
* performs tuner power-up reset
*******************************************************************************************************/
BOOL
HAMARO_TUNER_CX24128_powerup(HAMARO_NIM *p_nim) /* pointer to nim */
{
unsigned long tuner_handle;
unsigned char chipid;
HAMARO_VIPERPARMS viperparms;
HAMARO_CX24128_refresh_tuner_pll_lock = True;
/* determine the io method */
/* supports I2C repeater mode */
/* Initialize the register offset in case of dual tuner system */
p_nim->tuner.cx24128.register_offset = 0;
p_nim->tuner.cx24128.io_method = HAMARO_VIPER_I2C_IO;
if (p_nim->tuner.cx24128.io_method == HAMARO_VIPER_I2C_IO)
{
/* First of all, detect the I2C address of Mongoose or Viper. */
/* Try I2C address 1, read chip ID. */
if (HAMARO_TUNER_CX24128_EnableDemodRepeaterMode(p_nim) == False)
{
return (False);
}
tuner_handle = p_nim->demod_handle;
HAMARO_SET_DEMOD_HANDLE_I2C_ADDR(tuner_handle, HAMARO_CX24128_I2C_ADD1);
/* --- CR 21101 begin --- */
if (HAMARO_TUNER_CX24128_SetDemodRepeaterMode(p_nim) == False)
{
return(False);
}
/* HW reset puts pulse out on tuner serial bus causing the very first transaction to fail.*/
/* This is a dummy read to fix that.*/
chipid = (*p_nim->SBRead)(tuner_handle, HAMARO_CX24128_CHIP_ID_00, &p_nim->iostatus);
/* --- CR 21101 end --- */
if (HAMARO_TUNER_CX24128_SetDemodRepeaterMode(p_nim) == False)
{
return(False);
}
chipid = (*p_nim->SBRead)(tuner_handle, HAMARO_CX24128_CHIP_ID_00, &p_nim->iostatus);
if ((p_nim->iostatus != 0UL) || ((chipid != HAMARO_VIPER_CHIP_ID) && (chipid != MONGOOSE_CHIP_ID))) /* Check address 2. */
{
tuner_handle = p_nim->demod_handle;
HAMARO_SET_DEMOD_HANDLE_I2C_ADDR(tuner_handle, HAMARO_CX24128_I2C_ADD2);
if (HAMARO_TUNER_CX24128_RepeaterModeReadData(p_nim, tuner_handle, HAMARO_CX24128_CHIP_ID_00, &chipid) == False)
{ /* Both addresses failed, return error. */
return(False);
}
}
/* check chip ID, make sure it is Mongoose/Viper. */
if ((chipid != HAMARO_VIPER_CHIP_ID) && (chipid != MONGOOSE_CHIP_ID))
{
return(False);
}
/* Keep the chip ID value. */
p_nim->tuner.cx24128.chipid = chipid;
/* Keep the tuner_handle value for later use. */
p_nim->tuner.cx24128.tuner_handle = tuner_handle;
/* Get tuner version (global) */
if (HAMARO_TUNER_CX24128_RepeaterModeReadData(p_nim, tuner_handle, HAMARO_CX24128_CHIP_VERSION_01, &p_nim->tuner.cx24128.version) == False)
{
return(False);
}
}
p_nim->tuner.cx24128.tuner_gain_thresh = -50; /* -50dBm default */
p_nim->tuner.cx24128.gain_setting_selection = HAMARO_SIGNAL_LEVEL_LOW;
/* Set reference frequency to use crystal frequency. */
if (HAMARO_TUNER_CX24128_SetReferenceFreq(p_nim, HAMARO_RFREQ_0) != True)
{
return(False);
}
/* Set parameters. */
/* Initialize ICP parameters. */
viperparms.ICPmode = HAMARO_ICPMODE_AUTO; /* ICP auto mode by default. */
/* The folowing values are for XTAL < 11 MHz */
if (p_nim->xtal < HAMARO_CX24128_ICP_XTAL_THRESH)
{
viperparms.ICPauto_Hi = HAMARO_ICPAUTO_LEVEL4; /* Auto analog ICP levels, 2.0 mA */
viperparms.ICPauto_MedHi = HAMARO_ICPAUTO_LEVEL4; /* 2.0 mA */
viperparms.ICPauto_MedLo = HAMARO_ICPAUTO_LEVEL3; /* 1.5 mA */
viperparms.ICPauto_Lo = HAMARO_ICPAUTO_LEVEL3; /* 1.5 mA */
}
else /* The folowing values are for XTAL > 11 MHz */
{
viperparms.ICPauto_Hi = HAMARO_ICPAUTO_LEVEL4; /* Auto analog ICP levels, 2.0 mA */
viperparms.ICPauto_MedHi = HAMARO_ICPAUTO_LEVEL4; /* 2.0 mA */
viperparms.ICPauto_MedLo = HAMARO_ICPAUTO_LEVEL3; /* 1.5 mA */
viperparms.ICPauto_Lo = HAMARO_ICPAUTO_LEVEL2; /* 1.0 mA */
}
viperparms.ICPdig = HAMARO_ICPDIG_LEVEL3; /* 2.0 times */
viperparms.ICPman = HAMARO_ICPMAN_LEVEL1; /* ICP manual mode default. */
viperparms.ACP_on = True; /* Analog CP off by default. */
/* Initialize VCO parameters. Include set VCO mode to be AUTO. */
viperparms.VcoMode = HAMARO_VCOMODE_AUTO;
viperparms.Vcobs = HAMARO_VCOBANDSHIFT_HIGH;
viperparms.VcobandSel = HAMARO_VCOBANDSEL_1;
viperparms.Bsdelay = 0x08; /* Band sel delay value, default is 8 */
/* Band sel freq cnt */
viperparms.Bsfreqcnt = 0x0FFF;
/* Band sel ref div value */
viperparms.Bsrdiv = 0x0FFF;
/* Initialize other parameters. */
viperparms.PrescalerMode = False;
/* Enable hardware parts. */
HAMARO_TUNER_CX24128_SetEnableRegister(p_nim, 0x3D); /* FTA LNA is disabled */
#if HAMARO_INCLUDE_RATTLER
if (p_nim->tuner_type == HAMARO_CX24113) /* Rattler specific */
{
viperparms.lna_gain = HAMARO_LNA_MAX_GAIN; /* LNA gain (max) */
}
#endif /*HAMARO_INCLUDE_RATTLER */
/* -- Mongoose RevB -- */
viperparms.RFVGABiasControl = True; /* Disable (=1) RFVGA bias control circuit */
/* Set parameters to tuner and nim. */
HAMARO_TUNER_CX24128_SetParameters(p_nim, &viperparms);
/* Set Gain default values. */
HAMARO_TUNER_CX24128_SetGainSettings(p_nim, 0UL);
/* Set BW default settings. */
HAMARO_TUNER_CX24128_SetFilterBandwidth(p_nim, 18025UL);
/* Set DSM clk inversion. */
HAMARO_TUNER_CX24128_SetClkInversion(p_nim, True);
HAMARO_FWindowEnable = True;
/* Set the Mongoose ref clock output (HAMARO_CX24128_REFSEL_SPI_DIV1 is the default setting) */
if (p_nim->xtal >= HAMARO_CX24128_A3_XTAL_FREQ) /* div 2 for A3 */
{
if (HAMARO_TUNER_CX24128_GlobalSetRefSelSpi(p_nim, HAMARO_CX24128_REFSEL_SPI_DIV2) != True)
{
return(False);
}
}
else
{
if (HAMARO_TUNER_CX24128_GlobalSetRefSelSpi(p_nim, HAMARO_CX24128_REFSEL_SPI_DIV1) != True)
{
return(False);
}
}
return(True);
}/* HAMARO_TUNER_CX24128_powerup() */
/*******************************************************************************************************
* HAMARO_TUNER_CX24128_SetReferenceDivider()
* sets the current reference divider value to nim only
*******************************************************************************************************/
BOOL
HAMARO_TUNER_CX24128_SetReferenceDivider(HAMARO_NIM *p_nim, /* pointer to nim */
HAMARO_RDIVVAL rvalue) /* reference divider value */
{
HAMARO_TUNER_CX24128_VALIDATE(p_nim);
if (p_nim->tuner.cx24128.vcodiv == HAMARO_VCODIV4 && p_nim->tuner.cx24128.chipid == HAMARO_VIPER_CHIP_ID) /* CR 21579 */
{
rvalue = HAMARO_RDIV_2;
}
if (p_nim->tuner.cx24128.chipid == HAMARO_VIPER_CHIP_ID && p_nim->tuner.cx24128.register_offset != 0) /* Tuner B */
{
if (p_nim->xtal >= HAMARO_CX24128_A3_XTAL_FREQ) /* Always set reference division ratio to /2 for A3 */
{
rvalue = HAMARO_RDIV_2;
}
}
switch(rvalue)
{
case HAMARO_RDIV_1:
case HAMARO_RDIV_2:
{
p_nim->tuner.cx24128.R = rvalue;
break;
}
default:
{
HAMARO_DRIVER_SET_ERROR(p_nim,HAMARO_TUNERREF);
return(False);
break;
}
} /* switch(... */
return(True);
} /* HAMARO_TUNER_CX24128_SetReferenceDivider() */
/*******************************************************************************************************
* HAMARO_TUNER_CX24128_GetReferenceFreq()
* retrieves current reference frequency value from nim
*******************************************************************************************************/
BOOL
HAMARO_TUNER_CX24128_GetReferenceFreq(HAMARO_NIM *p_nim, /* pointer to nim */
HAMARO_RFREQVAL *p_fvalue) /* pointer to HAMARO_RFREQVAL where value is returned to caller */
{
HAMARO_TUNER_CX24128_VALIDATE(p_nim);
*p_fvalue = p_nim->tuner.cx24128.rfreqval;
return(True);
} /* HAMARO_TUNER_CX24128_GetReferenceFreq() */
/*******************************************************************************************************
* HAMARO_TUNER_CX24128_SetVcoDivider()
* sets the vco divider to nim structure
*******************************************************************************************************/
BOOL
HAMARO_TUNER_CX24128_SetVcoDivider(HAMARO_NIM *p_nim, /* pointer to nim */
HAMARO_VCODIV vcodiv) /* vco divider value */
{
HAMARO_TUNER_CX24128_VALIDATE(p_nim);
p_nim->tuner.cx24128.vcodiv = vcodiv;
return(True);
} /* HAMARO_TUNER_CX24128_SetVcoDivider() */
/*******************************************************************************************************
* HAMARO_TUNER_CX24128_GetParameters()
* returns current tuner parameter settings to the caller
*******************************************************************************************************/
BOOL
HAMARO_TUNER_CX24128_GetParameters(HAMARO_NIM *p_nim, /* pointer to nim */
HAMARO_VIPERPARMS *p_viperparms) /* pointer to HAMARO_VIPERPARMS, where copy will be written */
{
unsigned long reg_value;
HAMARO_TUNER_CX24128_VALIDATE(p_nim);
if (p_viperparms == 0)
{
return(False);
}
/* copy tunerparms to caller storage */
memcpy(p_viperparms, &p_nim->tuner.cx24128.viperparms, sizeof(HAMARO_VIPERPARMS));
/* Those values may be updated by harware. */
if (HAMARO_RegisterRead(p_nim, HAMARO_CX24128_VCO_BSH_SPI, ®_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
p_viperparms->Vcobs = (HAMARO_VCOBANDSHIFT)reg_value;
/* set the vco band shift to the tuner */
if (HAMARO_RegisterRead(p_nim, HAMARO_CX24128_VCO_SEL_SPI, ®_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
p_viperparms->VcobandSel = (HAMARO_VCOBANDSEL)reg_value;
/* -- Mongoose RevB -- */
if (reg_value == 0) /* could be VCO6 */
{
if (HAMARO_RegisterRead(p_nim, HAMARO_CX24128_VCO6_SEL_SPI, ®_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
if (reg_value != 0)
{
p_viperparms->VcobandSel = HAMARO_VCOBANDSEL_6;
}
}
if (HAMARO_RegisterRead(p_nim, HAMARO_CX24128_BS_FREQ, ®_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
p_viperparms->Bsfreqcnt = (unsigned short)reg_value;
if (HAMARO_RegisterRead(p_nim, HAMARO_CX24128_BS_DIV_CNT, ®_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
p_viperparms->Bsrdiv = (unsigned short)reg_value;
return(True);
} /* HAMARO_TUNER_CX24128_GetParameters() */
/*******************************************************************************************************
* HAMARO_TUNER_CX24128_SetParameters()
* sets passed in parameters in nim and into tuner
*******************************************************************************************************/
BOOL
HAMARO_TUNER_CX24128_SetParameters(HAMARO_NIM *p_nim, /* pointer to nim */
HAMARO_VIPERPARMS *p_viperparms) /* copy of HAMARO_VIPERPARMS to use as default */
{
unsigned long reg_value;
HAMARO_TUNER_CX24128_VALIDATE(p_nim);
if (p_viperparms == 0)
{
return(False);
}
/* copy from user-buffer to tuner buffer */
memcpy(&p_nim->tuner.cx24128.viperparms, p_viperparms, sizeof(HAMARO_VIPERPARMS));
/* Set ICP settings to tuner. */
/* ICP mode */
reg_value = (unsigned long)p_viperparms->ICPmode;
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_MOR), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
/* ICP manual level. It's O.K if manual level is undefined.*/
if (p_viperparms->ICPman != HAMARO_ICPMAN_UNDEF)
{
switch(p_viperparms->ICPman)
{
case HAMARO_ICPMAN_LEVEL1:
case HAMARO_ICPMAN_LEVEL2:
case HAMARO_ICPMAN_LEVEL3:
case HAMARO_ICPMAN_LEVEL4:
reg_value = (unsigned long)p_viperparms->ICPman;
break;
default:
{
/* Need define a new ERROR number. */
//HAMARO_DRIVER_SET_ERROR(p_nim,HAMARO_TUNERREF);
return(False);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -