📄 stv0399drv.c
字号:
else if ((bSysCtrlReg & STV0399_VHIGH_MASK) == 1) /* VCO is too high */
nVCOState = VCO_TOO_HIGH;
return nVCOState;
}
/*****************************************************
**FUNCTION :: STV0399StartSynt
**ACTION :: start STV0399 analog synthesizer
**PARAMS IN :: hChip ==> handle to the chip
**PARAMS OUT:: NONE
**RETURN :: NONE
*****************************************************/
static CSQPSK_Error_t STV0399StartSynt ( CSHDITunerIndex bTunerIndex )
{
if ( CSI2CRequestBus_inner( bTunerIndex, CSHDI_TIMEOUT_INFINITY) != CSI2C_SUCCESS )
{
return CSQPSK_FAILURE;
}
if (STV0399WriteRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL, STV0399_N_BYP_MASK, 0) != CSQPSK_SUCCESS)
{
CSI2CReleaseBus_inner( bTunerIndex);
return CSQPSK_FAILURE;
}
if (STV0399WriteRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL, STV0399_A_DIS_MASK, STV0399_A_DIS_MASK) != CSQPSK_SUCCESS)
{
CSI2CReleaseBus_inner( bTunerIndex);
return CSQPSK_FAILURE;
}
if (STV0399WriteRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL, STV0399_A_DIS_MASK, 0) != CSQPSK_SUCCESS)
{
CSI2CReleaseBus_inner( bTunerIndex);
return CSQPSK_FAILURE;
}
if (STV0399WriteRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL, STV0399_N_BYP_MASK, STV0399_N_BYP_MASK) != CSQPSK_SUCCESS)
{
CSI2CReleaseBus_inner( bTunerIndex);
return CSQPSK_FAILURE;
}
CSI2CReleaseBus_inner( bTunerIndex);
return CSQPSK_SUCCESS;
}
/*****************************************************
**FUNCTION :: STV0399CalcSyntFreqInt
**ACTION :: compute the STV0399 digital synthetizer frequency (with integers)
**PARAMS IN :: hChip ==> handle to the chip
** mdiv ==> mdiv divider value
** ipe ==> ipe divider value
**PARAMS OUT:: NONE
**RETURN :: Synthesizer frequency (Hz)
*****************************************************/
//#ifdef STV0399E_DRV
static DWORD STV0399CalcSyntFreqInt( CSHDITunerIndex bTunerIndex , int dwQuartz, int mdiv, int ipe, int pll_mc)
{
DWORD dwFrequency = 0;
if(g_Tuner_Type[bTunerIndex] == STV0399_E)
dwFrequency = 1057 * (pll_mc) * (DWORD)(((32*dwQuartz)/4)/((((32767*(mdiv+33)-ipe))/31)));
else
dwFrequency = 33824 * (DWORD)(((32*dwQuartz)/4)/((((32767*(mdiv+33)-ipe))/31)));
// printf("\n[STV0399CalcSyntFreqInt] dwFrequency = %d", dwFrequency);
return dwFrequency;
}
/*****************************************************
**FUNCTION :: STV0399CalcSyntFreqFloat
**ACTION :: compute the STV0399 digital synthetizer frequency (with floats)
**PARAMS IN :: hChip ==> handle to the chip
** mdiv ==> mdiv divider value
** ipe ==> ipe divider value
**PARAMS OUT:: NONE
**RETURN :: Synthesizer frequency (Hz)
*****************************************************/
static DWORD STV0399CalcSyntFreqFloat( CSHDITunerIndex bTunerIndex, DWORD dwQuartz, int mdiv, DWORD ipe, int pll_mc)
{
DWORD dwFrequency = 0;
if(g_Tuner_Type[bTunerIndex] == STV0399_E)
dwFrequency = (DWORD)(32.0 * ((pll_mc*(double)dwQuartz/4.0)/(mdiv+33.0-(double)(ipe)/32767.0)));
else
dwFrequency = (DWORD)(32.0*((32.0*(double)dwQuartz/4.0)/(mdiv+33.0-(double)(ipe)/32767.0)));
// printf("\n[STV0399CalcSyntFreqFloat] dwFrequency = %d", dwFrequency);
return dwFrequency;
}
/*----------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
**FUNCTION :: FE_399_SetSyntFreq
**ACTION :: Set the STV0399 synthetizer frequency
**PARAMS IN :: hChip ==> handle to the chip
** Quartz ==> quartz frequency (Hz)
** Target ==> target frequency (Hz)
**PARAMS OUT:: NONE
**RETURN :: Synthesizer frequency (Hz)
------------------------------------------------------------------*/
/*****************************************************
**FUNCTION :: STV0399SetSyntFreq
**ACTION :: Set the STV0399 synthetizer frequency
**PARAMS IN :: hChip ==> handle to the chip
** Quartz ==> quartz frequency (Hz)
** Target ==> target frequency (Hz)
**PARAMS OUT:: NONE
**RETURN :: Synthesizer frequency (Hz)
*****************************************************/
static DWORD STV0399SetSyntFreq( CSHDITunerIndex bTunerIndex, DWORD Quartz, DWORD Target)
{
BYTE pbRegValue[4];
int ipe = 32767;
int mdiv = 0;
DWORD pll_mc = 32; /*cs 32.0*/
if(g_Tuner_Type[bTunerIndex] == STV0399_E){
pll_mc = STV0399GetPLLMultCoeff( bTunerIndex);
if((Target >= 202000000) && (Target <= 450000000) && Quartz)
{
mdiv = (4*(((2*pll_mc)*Quartz)/(Target/10000)))/10000 - 32;
ipe = (32767 * ((mdiv+33)*10000 - 4*(((2*pll_mc)*Quartz)/(Target/10000))))/10000;
if ( ((ipe & 0x03ff) > 0x01ff) || (ipe < 0x03ff) )
ipe |= 0x03ff;
else
ipe = (ipe & 0xfc00) - 1;
STV0399SetRegisterBits( bTunerIndex, STV0399REG_SYNTH1, STV0399_MD_MASK, (mdiv & 0x1F));
pbRegValue[0] = (BYTE)((ipe >> 8) & 0xFF);
pbRegValue[1] = (BYTE)(ipe & 0xFF);
STV0399SetRegisters( bTunerIndex, STV0399REG_SYNTH2, pbRegValue, 2);
}
else
{
STV0399GetRegisters( bTunerIndex, STV0399REG_SYNTH1, pbRegValue, 3);
mdiv = (int)(pbRegValue[0] & 0x1F);
if (mdiv & 0x10)
mdiv -= 0x20;
ipe = ((int)pbRegValue[1] << 8) + (int)pbRegValue[2];
}
return STV0399CalcSyntFreqInt( bTunerIndex, (int)Quartz,mdiv,ipe, pll_mc);
}
else{
if((Target >= 216000000) && (Target <= 432000000) && Quartz)
{
mdiv = (4*((64*Quartz)/(Target/10000)))/10000 - 32;
ipe = (32767 * ((mdiv+33)*10000 - 4*((64*Quartz)/(Target/10000))))/10000;
/* round ipe divider */
// printf("\nmdiv = %d, ipe = %d", mdiv, ipe);
if ( ((ipe & 0x03ff) > 0x01ff) || (ipe < 0x03ff) )
ipe |= 0x03ff;
else
ipe = (ipe & 0xfc00) - 1;
/* Set analog synthesizer */
STV0399SetRegisterBits( bTunerIndex, STV0399REG_SYNTH1, STV0399_MD_MASK, (mdiv & 0x1F));
pbRegValue[0] = (BYTE)((ipe >> 8) & 0xFF);
pbRegValue[1] = (BYTE)(ipe & 0xFF);
STV0399SetRegisters( bTunerIndex, STV0399REG_SYNTH2, pbRegValue, 2);
// printf("\n(mdiv & 0x1F) = 0x%x", (mdiv & 0x1F));
// ChipSetField(hChip,F399_MD,mdiv);
// ChipSetField(hChip,F399_PE_MSB,MSB(ipe));
// ChipSetField(hChip,F399_PE_LSB,LSB(ipe));
}
else
{
STV0399GetRegisters( bTunerIndex, STV0399REG_SYNTH1, pbRegValue, 3);
mdiv = (int)(pbRegValue[0] & 0x1F);
if (mdiv & 0x10)
mdiv -= 0x20;
ipe = ((int)pbRegValue[1] << 8) + (int)pbRegValue[2];
// ipe = MAKEWORD(ChipGetField(hChip,F399_PE_MSB),ChipGetField(hChip,F399_PE_LSB));
}
return STV0399CalcSyntFreqInt( bTunerIndex, (int)Quartz,mdiv,ipe,0);
}
}
/*----------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
**FUNCTION :: FE_399_Get_PLL_mult_coeff
------------------------------------------------------------------*/
DWORD STV0399GetPLLMultCoeff( CSHDITunerIndex bTunerIndex)
{
DWORD dwPLLDiv;
BYTE bRegValue;
STV0399GetOneRegister ( bTunerIndex, STV0399REG_DIVOUT, &bRegValue);
bRegValue &= 0x1f;
switch(bRegValue)
{
default:
dwPLLDiv = 32; /*cs 32.0*/
break;
case 2:
dwPLLDiv = 30; /*cs 30.0*/
break;
case 4:
dwPLLDiv = 32;/*cs 32.0*/
break;
case 6:
dwPLLDiv = 31;/*cs 32.0*/
break;
case 8:
dwPLLDiv = 34;/*cs 34.0*/
break;
case 12:
dwPLLDiv = 33;/*cs 33.0*/
break;
}
// printf("\n[STV0399GetPLLMultCoeff ]dwPLLDiv = %d", dwPLLDiv);
return dwPLLDiv;
}
DWORD STV0399PLLDIVSelect( DWORD dwStartFrequency, DWORD dwStopFrequency, DWORD dwPLLDiv, DWORD dwFrequency, DWORD dwOffset)
{
DWORD dwValue;
int n;
int i;
DWORD pdwTable[6]= {0};
if(dwFrequency <= 1200000000)
{
dwValue = dwFrequency/(4*1000000);
}
else
{
dwValue = dwFrequency/(5*1000000);
}
for(i=0;i<=5;i++)
{
if((dwPLLDiv*27*2-dwOffset<=dwFrequency/1000000+dwValue*(i-2))&&(dwFrequency/1000000+dwValue*(i-2)<= dwPLLDiv*27*2+dwOffset))
{
pdwTable[i] = 1;
}
else
{
pdwTable[i] = 0;
}
}
n = pdwTable[0]|pdwTable[1]|pdwTable[2]|pdwTable[3]|pdwTable[4]|pdwTable[5];
//}while(dwFrequency <= dwStopFrequency);
//printf("\n[STV0399PLLDIVSelect]n=%d", n);
return n;
}
/*----------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
**FUNCTION :: FE_399_GetSyntFreq
**ACTION :: Set the STV0399 digital synthetizer frequency
**PARAMS IN :: hChip ==> handle to the chip
** Quartz ==> quartz frequency (Hz)
**PARAMS OUT:: NONE
**RETURN :: Synthesizer frequency (Hz)
------------------------------------------------------------------*/
static int STV0399GetSyntFreq( CSHDITunerIndex bTunerIndex, int dwQuartz)
{
BYTE pbRegValue[4];
int mdiv;
int ipe;
int Fout, pll_mc;
if(g_Tuner_Type[bTunerIndex] == STV0399_E){
if (STV0399GetRegisters ( bTunerIndex, STV0399REG_SYNTH1, pbRegValue, 3) != CSQPSK_SUCCESS)
return -1;
/* analog synthesizer */
mdiv = (int)pbRegValue[0] & 0x1F;
if (mdiv & 0x10)
mdiv -= 0x20;
ipe = ((int)pbRegValue[1] << 8) + (int)pbRegValue[2];
pll_mc = STV0399GetPLLMultCoeff( bTunerIndex);
Fout = STV0399CalcSyntFreqFloat( bTunerIndex, dwQuartz,mdiv,ipe,pll_mc);
return Fout;
}
else{
if (STV0399GetRegisters ( bTunerIndex, STV0399REG_SYNTH1, pbRegValue, 3) != CSQPSK_SUCCESS)
return -1;
/* analog synthesizer */
mdiv = (int)pbRegValue[0] & 0x1F;
if (mdiv & 0x10)
mdiv -= 0x20;
ipe = ((int)pbRegValue[1] << 8) + (int)pbRegValue[2];
Fout = (int)(32.0*((32.0*(double)dwQuartz/4.0)/(mdiv+33.0-(double)(ipe)/32767.0)));
return Fout;
}
}
/*-----------------------------------------------------------
-------------------------------------------------------------
-------------------------------------------------------------
**FUNCTION :: FE_399_GetMclkFreq
**ACTION :: Set the STV0399 master clock frequency
**PARAMS IN :: hChip ==> handle to the chip
** ExtClk ==> External clock frequency (Hz)
**PARAMS OUT:: NONE
**RETURN :: MasterClock frequency (Hz)
-------------------------------------------------------------*/
static int STV0399GetMclkFreq ( CSHDITunerIndex bTunerIndex, int dwExtClk)
{
int dwMClk = 0;
BYTE bDivValue;
int nRatio;
DWORD pll_mc;
if(g_Tuner_Type[bTunerIndex] == STV0399_E){
pll_mc = STV0399GetPLLMultCoeff( bTunerIndex);
STV0399GetOneRegister ( bTunerIndex, STV0399REG_DIVOUT, &bDivValue);
nRatio = STV0399GetDivRatio( bTunerIndex);
// printf("\n[STV0399GetMclkFreq]bDivValue=%d, nRatio = %d, pll_mc=%d", bDivValue, nRatio, pll_mc);
switch (bDivValue >> 5)
{
default:
dwMClk = dwExtClk; /* synthe bypass */
break;
case 1:
dwMClk = (dwExtClk * pll_mc) / 2;
break;
case 2:
dwMClk = (dwExtClk * pll_mc) / STV0399GetDivRatio( bTunerIndex);
break;
case 3:
dwMClk = (dwExtClk * pll_mc) / (2 * STV0399GetDivRatio( bTunerIndex));
break;
case 4:
dwMClk = (dwExtClk * pll_mc) / (4 * STV0399GetDivRatio( bTunerIndex));
break;
}
// printf("\n[STV0399GetMclkFreq] MCLK = %d", dwMClk);
return dwMClk;
}
else{
STV0399GetOneRegister ( bTunerIndex, STV0399REG_DIVOUT, &bDivValue);
nRatio = STV0399GetDivRatio( bTunerIndex);
switch (bDivValue >> 5)
{
case 1:
dwMClk = (dwExtClk * 16); /* Divider bypass */
break;
case 2:
dwMClk = (dwExtClk * 32) / nRatio;
break;
case 3:
dwMClk = (dwExtClk * 16) / nRatio;
break;
case 4:
dwMClk = (dwExtClk * 8) / nRatio;
break;
default:
dwMClk = dwExtClk; /* synthe bypass */
break;
}
return dwMClk;
}
}
/*****************************************************
**FUNCTION :: STV0399SetTunerFreq
**ACTION :: Set the STV0399 analog synthetizer frequency
**PARAMS IN :: Quartz ==> quartz frequency (Hz)
** Frequency ==> tuner frequency (KHz)
**PARAMS OUT:: NONE
**RETURN :: tuner frequency (KHz)
*****************************************************/
static DWORD STV0399SetTunerFreq( CSHDITunerIndex bTunerIndex, DWORD Quartz, DWORD Frequency)
{
DWORD result;
int pllmult = 0;
STV0399PLL_MULTIPLIER_t pll;
STV0399VCO_t vco;
BYTE bTemp;
DWORD frequency;
if(g_Tuner_Type[bTunerIndex] == STV0399_E){
if(STV0399PLLDIVSelect(950000000,2150000000,34,Frequency,15) == 0)
{
STV0399SetRegisterBits( bTunerIndex, STV0399REG_DIVOUT, 0x1F, 8);
}
else if(STV0399PLLDIVSelect( 950000000,2150000000,32,Frequency,15) == 0)
{
STV0399SetRegisterBits( bTunerIndex, STV0399REG_DIVOUT, 0x1F, 0);
}
else
{
STV0399SetRegisterBits( bTunerIndex, STV0399REG_DIVOUT, 0x1F, 12);
}
pll = (Frequency >= 1200000000) ? PLL_X5: PLL_X4;
if(pll)
STV0399SetRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL2, STV0399_PLL_FACTOR_MASK, STV0399_PLL_FACTOR_MASK);
else
STV0399SetRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL2, STV0399_PLL_FACTOR_MASK, 0);
pllmult = (pll == PLL_X4) ? 4:5;
result = STV0399SetSyntFreq( bTunerIndex, Quartz,Frequency/pllmult) * pllmult;
STV0399SetRegisterBits ( bTunerIndex, STV0399REG_SYSCTRL, STV0399_CMD_MASK, STV0399_CMD_MASK);
STV0399SetRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL2, STV0399_RESET_SYNT_MASK, STV0399_RESET_SYNT_MASK);
STV0399SetRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL2, STV0399_RESET_SYNT_MASK, 0);
STV0399GetOneRegister( bTunerIndex, STV0399REG_SYSCTRL, &bTemp);
// printf("\nREG SYSCTRL 1 = 0x%x", bTemp);
if(((bTemp & 0x02) == 0) || ((bTemp & 0x20) == 0x20))
{
STV0399SetRegisterBits ( bTunerIndex, STV0399REG_SYSCTRL, STV0399_CMD_MASK, 0);
// STV0399GetOneRegister(STV0399REG_SYSCTRL, &bTemp);
// printf("\nREG SYSCTRL 2 = 0x%x", bTemp);
}
return result;
}
else{
if(ABS(((int)(Frequency/1000) - 1728000)) > MINIMUM_GAP)
{
if(ABS(((int)(Frequency/1000) - 2160000)) > MINIMUM_GAP)
frequency = Frequency;
else
frequency = 2160000000u;/*value given as unsigned*/
}
else
frequency = 1728000000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -