📄 hamaro_cx24128.c
字号:
}
}
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_ICP_MAN), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
}
/* ICP auto level. */
switch(p_viperparms->ICPauto_Lo)
{
case HAMARO_ICPAUTO_LEVEL1:
case HAMARO_ICPAUTO_LEVEL2:
case HAMARO_ICPAUTO_LEVEL3:
case HAMARO_ICPAUTO_LEVEL4:
reg_value = (unsigned long)p_viperparms->ICPauto_Lo;
break;
default:
{
/* Need define a new ERROR number. */
//HAMARO_DRIVER_SET_ERROR(p_nim,HAMARO_TUNERREF);
return(False);
}
}
switch(p_viperparms->ICPauto_MedLo)
{
case HAMARO_ICPAUTO_LEVEL1:
case HAMARO_ICPAUTO_LEVEL2:
case HAMARO_ICPAUTO_LEVEL3:
case HAMARO_ICPAUTO_LEVEL4:
reg_value |= (unsigned long)p_viperparms->ICPauto_MedLo << 2UL;
break;
default:
{
/* Need define a new ERROR number. */
//HAMARO_DRIVER_SET_ERROR(p_nim,HAMARO_TUNERREF);
return(False);
}
}
switch(p_viperparms->ICPauto_MedHi)
{
case HAMARO_ICPAUTO_LEVEL1:
case HAMARO_ICPAUTO_LEVEL2:
case HAMARO_ICPAUTO_LEVEL3:
case HAMARO_ICPAUTO_LEVEL4:
reg_value |= (unsigned long)p_viperparms->ICPauto_MedHi << 4UL;
break;
default:
{
/* Need define a new ERROR number. */
//HAMARO_DRIVER_SET_ERROR(p_nim,HAMARO_TUNERREF);
return(False);
}
}
switch(p_viperparms->ICPauto_Hi)
{
case HAMARO_ICPAUTO_LEVEL1:
case HAMARO_ICPAUTO_LEVEL2:
case HAMARO_ICPAUTO_LEVEL3:
case HAMARO_ICPAUTO_LEVEL4:
reg_value |= (unsigned long)p_viperparms->ICPauto_Hi << 6UL;
break;
default:
{
/* Need define a new ERROR number. */
//HAMARO_DRIVER_SET_ERROR(p_nim,HAMARO_TUNERREF);
return(False);
}
}
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_ICP_LEVEL), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
/* ICP digital. */
switch(p_viperparms->ICPdig)
{
case HAMARO_ICPDIG_LEVEL1:
case HAMARO_ICPDIG_LEVEL2:
case HAMARO_ICPDIG_LEVEL3:
case HAMARO_ICPDIG_LEVEL4:
reg_value = (unsigned long)p_viperparms->ICPdig;
break;
default:
{
/* Need define a new ERROR number. */
//HAMARO_DRIVER_SET_ERROR(p_nim,HAMARO_TUNERREF);
return(False);
}
}
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_IDIG_SEL), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
#if HAMARO_INCLUDE_RATTLER
/* Rattler specific */
if (p_nim->tuner_type == HAMARO_CX24113)
{
switch(p_viperparms->lna_gain)
{
case HAMARO_LNA_MIN_GAIN:
case HAMARO_LNA_MID_GAIN:
case HAMARO_LNA_MAX_GAIN:
reg_value = (unsigned long)p_viperparms->lna_gain;
break;
default:
{
return(False);
}
}
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_LNA_GC), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
}
#endif /* HAMARO_INCLUDE_RATTLER */
/* Analog CP ON. */
reg_value = (unsigned long)p_viperparms->ACP_on;
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_ACP_ON_ALW), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
/* Set VCO settings to tuner. */
switch(p_viperparms->VcoMode)
{
case HAMARO_VCOMODE_AUTO:
case HAMARO_VCOMODE_TEST:
reg_value = (unsigned long)p_viperparms->VcoMode;
break;
default:
//HAMARO_DRIVER_SET_ERROR(p_nim,HAMARO_TUNERREF); /* need define a new err number. */
return(False);
}
/* set the vco mode to the tuner */
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_BS_VCOMT), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
switch(p_viperparms->Vcobs)
{
case HAMARO_VCOBANDSHIFT_HIGH:
case HAMARO_VCOBANDSHIFT_LOW:
reg_value = (unsigned long)p_viperparms->Vcobs;
break;
default:
//HAMARO_DRIVER_SET_ERROR(p_nim,HAMARO_TUNERREF); /* need define a new err number. */
return(False);
}
/* set the vco band shift to the tuner */
if(HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_VCO_BSH_SPI), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
switch(p_viperparms->VcobandSel)
{
case HAMARO_VCOBANDSEL_1:
case HAMARO_VCOBANDSEL_2:
case HAMARO_VCOBANDSEL_3:
case HAMARO_VCOBANDSEL_4:
case HAMARO_VCOBANDSEL_5:
case HAMARO_VCOBANDSEL_6: /* -- Mongoose RevB -- */
reg_value = (unsigned long)p_viperparms->VcobandSel;
break;
default:
//HAMARO_DRIVER_SET_ERROR(p_nim,HAMARO_TUNERREF); /* need define a new err number. */
return(False);
}
/* set the vco band shift to the tuner */
if (p_viperparms->VcobandSel == HAMARO_VCOBANDSEL_6)
{
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_VCO6_SEL_SPI), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
}
else
{
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_VCO_SEL_SPI), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
}
/* Set other VCO parameters. */
reg_value = (unsigned long)p_viperparms->Bsdelay;
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_BS_DELAY), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
reg_value = (unsigned long)p_viperparms->Bsfreqcnt;
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_BS_FREQ), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
reg_value = (unsigned long)p_viperparms->Bsrdiv;
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_BS_DIV_CNT), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
/* Set pre-scaler mode. */
switch(p_viperparms->PrescalerMode)
{
case True:
reg_value = 0x01UL;
break;
case False:
reg_value = 0x00UL;
break;
default:
//HAMARO_DRIVER_SET_ERROR(p_nim,HAMARO_TUNERREF); /* need define a new err number. */
return(False);
break;
}
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_PS_TEST), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
/* -- Mongoose RevB -- */
reg_value = (p_viperparms->RFVGABiasControl == True) ? 0x01 : 0x00;
if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_RFBC_DISABLE), reg_value, p_nim->tuner.cx24128.io_method) != True)
{
return(False);
}
return(True);
} /* HAMARO_TUNER_CX24128_SetParameters() */
/*******************************************************************************************************
* HAMARO_TUNER_CX24128_set_NFRregisters()
* function to set N, F, R registers in tuner
*******************************************************************************************************/
BOOL
HAMARO_TUNER_CX24128_SetNFRRegisters(HAMARO_NIM *p_nim, /* pointer to nim */
unsigned int nvalue, /* N register */
int fvalue, /* F register */
HAMARO_RDIVVAL rvalue) /* R register */
{
unsigned long reg_value,reg_vlue_temp;
unsigned long pllfreq;
unsigned long Nfrac;
HAMARO_BCDNO bcd;
/* save last n,a,r settings */
p_nim->tuner.cx24128.N = nvalue;
p_nim->tuner.cx24128.F = fvalue;
p_nim->tuner.cx24128.R = rvalue;
/* High 8bits of N will be set to 0x19 */
reg_value = (nvalue >>1) & 0xFF;
/* Write */
if(HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x19), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)
{
return(False);
}
/* N[0] = 0x1A[7] F[17:11]=0x1A[6:0] */
reg_value = (nvalue & 0x01) << 7;
reg_vlue_temp = (fvalue >> 11) & 0x7F;
reg_value = reg_value | reg_vlue_temp;
if(HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x1A), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)
{
return(False);
}
/* F[10:3]=0x1B[7:0] */
reg_value = (fvalue >> 3) & 0xFF;
if(HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x1B), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)
{
return(False);
}
/* F[2:0]=0x1C[7:5] */
reg_vlue_temp = (fvalue <<5) & 0xE0;
if(HAMARO_TunerRegisterRead(p_nim, (unsigned short)(0x1C), (unsigned long*)®_value, HAMARO_IO_UNKNOWN)!= True)
{
return(False);
}
reg_value = reg_value & 0x1F;
reg_value |= reg_vlue_temp;
if(HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x1C), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)
{
return(False);
}
reg_value = (unsigned long)(rvalue - 1);
if (HAMARO_TUNER_CX24128_SetReferenceFreq(p_nim, (HAMARO_RFREQVAL)reg_value) == False)
{
return (False);
}
/* multiplication factor of 10000 is used to improve precision */
Nfrac = ( (fvalue * 10000L) / HAMARO_CX24128_DIVIDER) + (nvalue * 10000UL) + (32UL * 10000UL);
HAMARO_BCD_set(&bcd, (p_nim->tuner_crystal_freq / p_nim->tuner.cx24128.R));
HAMARO_BCD_mult(&bcd, Nfrac);
HAMARO_BCD_mult(&bcd, 2);
HAMARO_BCD_div(&bcd, 10000);
HAMARO_BCD_div(&bcd, p_nim->tuner.cx24128.vcodiv);
if ((p_nim->tuner_crystal_freq) / HAMARO_MM >= 20)
{
HAMARO_BCD_mult(&bcd, 2);
}
pllfreq = HAMARO_BCD_out(&bcd);
/* Now tuner is set to a new frequency. */
p_nim->pll_frequency = pllfreq;
return(True);
} /* HAMARO_TUNER_CX24128_set_NFRregisters() */
/*******************************************************************************************************
* HAMARO_TUNER_CX24128_SetFrequency()
* Set specified tuner pll frequency
******************************************************************************************************/
BOOL
HAMARO_TUNER_CX24128_SetFrequency(HAMARO_NIM *p_nim, /* pointer to nim */
unsigned long frequency) /* pointer to unsigned long */
{
unsigned short nvalue;
int fvalue;
unsigned long reg_value;
HAMARO_TUNER_CX24128_VALIDATE(p_nim);
HAMARO_CX24128_refresh_tuner_pll_lock = True;
p_nim->pll_frequency = frequency;
/* Switch to normal mode: set 0x14[7:6] to 0x00 */
/* Read 0x14, and clear 0x14[7:6] */
if (HAMARO_TunerRegisterRead(p_nim, (unsigned short)(0x14), (unsigned long*)®_value, HAMARO_IO_UNKNOWN) != True)
{
return(False);
}
reg_value &= 0x3F;
if (HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x14), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)
{
return(False);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -