📄 stv0399drv.c
字号:
{
CSI2CReleaseBus_inner( bTunerIndex);
return CSQPSK_FAILURE;
}
if(STV0399WriteOneRegister( bTunerIndex, STV0399REG_DIVCTRL, bDivider) != CSQPSK_SUCCESS)/* Set divider */
{
CSI2CReleaseBus_inner( bTunerIndex);
return CSQPSK_FAILURE;
}
if(STV0399WriteOneRegister( bTunerIndex, STV0399REG_DIVOUT, bMode) != CSQPSK_SUCCESS)/* Reset divider */
{
CSI2CReleaseBus_inner( bTunerIndex);
return CSQPSK_FAILURE;
}
if(STV0399WriteRegisterBits( bTunerIndex, STV0399REG_SYNTCTRL, N_BYP_MASK, N_BYP_MASK) != CSQPSK_SUCCESS)/* Synthesizer bypass */
{
CSI2CReleaseBus_inner( bTunerIndex);
return CSQPSK_FAILURE;
}
CSI2CReleaseBus_inner( bTunerIndex);
return CSQPSK_SUCCESS;
}
//#ifdef STV0399E_DRV
static BOOL STV0399Harmonic( CSHDITunerIndex bTunerIndex, DWORD dwMasterClock, DWORD dwRfFrequency, DWORD OFFSET)
{
DWORD dwGAP;
if(g_Tuner_Type[bTunerIndex] == STV0399_E){
dwGAP = dwRfFrequency % (dwMasterClock / 1000);
if((dwGAP <= OFFSET) || (dwGAP >= (dwMasterClock / 1000)-OFFSET))
return TRUE;
else
return FALSE;
}
else{
dwGAP = dwRfFrequency % (dwMasterClock / 1000);
if((dwGAP <= MINIMUM_GAP) || (dwGAP >= (dwMasterClock / 1000) - MINIMUM_GAP))
return TRUE;
else
return FALSE;
}
}
static BOOL STV0399Triple(DWORD dwMasterClock, DWORD dwSymbolRate)
{
DWORD dwRatio;
dwRatio = dwMasterClock / (dwSymbolRate/1000);
if((dwRatio >= 2990) && (dwRatio <= 3010))
return TRUE;
else
return FALSE;
}
static DWORD STV0399SelectOffset(DWORD dwSymbolRate)
{
DWORD dwOffset;
if(dwSymbolRate <= 10000000)
{
dwOffset = MINIMUM_GAP_low;
}
else
{
dwOffset =MINIMUM_GAP;
}
return dwOffset;
}
//#ifdef STV0399E_DRV
static int STV0399SelectMclk ( CSHDITunerIndex bTunerIndex, DWORD dwRfFrequency, DWORD dwSymbolRate, int dwExtClk )
{
BOOL bHarmonic, bTriple;
DWORD dwPLLDiv;
DWORD dwCOEFDiv = 6;
int pnClock[2][2];
int nIndex = 0;
int nRatio;
int dwClock[4][2] = {{108000000, 8},{86400000, 10},{96000000, 9},{123428571, 7}};
if(g_Tuner_Type[bTunerIndex] == STV0399_E){
dwPLLDiv = STV0399GetPLLMultCoeff( bTunerIndex);
if((dwPLLDiv == 34)&&(dwSymbolRate <= 10000000))
{
dwCOEFDiv=12;
}
else if((dwPLLDiv == 34)&&(dwSymbolRate > 10000000)&&(dwSymbolRate <= 20000000))
{
dwCOEFDiv=9;
}
else if((dwPLLDiv == 34)&&(dwSymbolRate > 20000000))
{
dwCOEFDiv=6;
}
else if((dwPLLDiv == 32)&&(dwSymbolRate <= 10000000))
{
dwCOEFDiv=12;
}
else if((dwPLLDiv == 32)&&(dwSymbolRate > 10000000)&&(dwSymbolRate <=20000000))
{
dwCOEFDiv=9;
}
else if((dwPLLDiv == 32)&&(dwSymbolRate >20000000))
{
dwCOEFDiv=6;
}
pnClock[0][0]=dwPLLDiv*27000000/dwCOEFDiv;
pnClock[0][1]=dwCOEFDiv;
pnClock[1][0]=dwPLLDiv*27000000/(dwCOEFDiv+1);
pnClock[1][1]=dwCOEFDiv+1;
nRatio = STV0399GetDivRatio( bTunerIndex);
if((nRatio>=6) && (nRatio<=13))
{
do
{
//bHarmonic = FE_399_Harmonic(hChip,pnClock[nIndex][0],RfFrequency);
bHarmonic = STV0399Harmonic( bTunerIndex, pnClock[nIndex][0],dwRfFrequency,STV0399SelectOffset(dwSymbolRate));
bTriple = STV0399Triple(pnClock[nIndex][0],dwSymbolRate);
nIndex++;
}
while((bHarmonic || bTriple) && (nIndex<2));
if(bHarmonic || bTriple)
STV0399SetDivRatio( bTunerIndex, dwCOEFDiv);
else
STV0399SetDivRatio( bTunerIndex, pnClock[nIndex-1][1]);
}
return STV0399GetMclkFreq( bTunerIndex, dwExtClk);
}
else{
nRatio = STV0399GetDivRatio( bTunerIndex);
//if (nRatio == FAILURE)
// return FAILURE;
/* TK - testing 26june2003 */
if ( ((dwRfFrequency >= 1144000) && (dwRfFrequency <= 1166000)) ||
((dwRfFrequency >= 1249000) && (dwRfFrequency <= 1251000)) ||
((dwRfFrequency >= 1599000) && (dwRfFrequency <= 1601000)) )
{
if (STV0399SetDivRatio( bTunerIndex, 10) != CSQPSK_SUCCESS)
return -1; /* org 13 leslie*/
}
else
{
/* TK - testing 26june2003 */
if((nRatio>=7) && (nRatio<=10))
{
do
{
bHarmonic = STV0399Harmonic( bTunerIndex, dwClock[nIndex][0], dwRfFrequency,0);
bTriple = STV0399Triple(dwClock[nIndex][0], dwSymbolRate);
nIndex++;
}
while((bHarmonic || bTriple) && (nIndex<4));
if(bHarmonic || bTriple)
{
if (STV0399SetDivRatio( bTunerIndex, 8) != CSQPSK_SUCCESS)
return -1;
}
else
{
if (STV0399SetDivRatio( bTunerIndex, dwClock[nIndex-1][1]) != CSQPSK_SUCCESS)
return -1;
}
}
}
return STV0399GetMclkFreq( bTunerIndex, dwExtClk);
}
}
/*****************************************************
**FUNCTION :: STV0399CalcAGC1Gain
**ACTION :: Compute the AGC1 gain
**PARAMS IN :: regvalue ==> register value
**PARAMS OUT:: NONE
**RETURN :: AGC1 gain multiplied by two
*****************************************************/
static int STV0399CalcAGC1Gain (BYTE bRegValue)
{
int nGain = 0;
nGain = (int)((bRegValue >> 2) & 0x1F);
if(!(bRegValue & 0x80))
nGain += 16;
return nGain;
}
/*****************************************************
**FUNCTION :: STV0399CalcAGC1Integrator
**ACTION :: Compute the AGC1 gain
**PARAMS IN :: gain ==> gain multiplied by two
**PARAMS OUT:: NONE
**RETURN :: AGC1 integrator value
*****************************************************/
static BYTE STV0399CalcAGC1Integrator(BYTE bGain)
{
BYTE bIntegrator = 0x00;
if(bGain > 31)
bGain -= 16;
else
bIntegrator |= 0x80;
bIntegrator |= (bGain & 0x1F) << 2;
return bIntegrator;
}
/*****************************************************
**FUNCTION :: STV0399CalcAGC0Gain
**ACTION :: Compute the AGC0 gain
**PARAMS IN :: regvalue ==> register value
**PARAMS OUT:: NONE
**RETURN :: AGC0 gain
*****************************************************/
static int STV0399CalcAGC0Gain(BYTE bRegValue)
{
int nGain = 0;
if((bRegValue>0) && (bRegValue<10))
{
nGain = (int)((bRegValue - 1) % 4) * 6;
if(bRegValue < 5)
nGain -= 20;
else if(bRegValue == 9)
nGain += 24;
}
return nGain;
}
static CSQPSK_Error_t STV0399Synt( CSHDITunerIndex bTunerIndex)
{
if(STV0399SetRegisterBits( bTunerIndex, STV0399REG_SYNTCTRL2, 0x04, 0x04) != CSQPSK_SUCCESS)/* Synthesizer bypass */
return CSQPSK_FAILURE;
if(STV0399SetRegisterBits( bTunerIndex, STV0399REG_SYNTCTRL2, 0x04, 0x00) != CSQPSK_SUCCESS)/* Synthesizer bypass */
return CSQPSK_FAILURE;
return CSQPSK_SUCCESS;
}
/*****************************************************
--FUNCTION :: STV0399CarrierTracking
--ACTION :: Optimize STV0399 parameters according to signal changes
--PARAMS IN :: NONE
--PARAMS OUT:: NONE
--RETURN :: Error (if any)
--***************************************************/
static CSQPSK_Error_t STV0399CarrierTracking ( CSHDITunerIndex bTunerIndex)
{
BYTE pbRegValue[4];
BYTE bAGC0Int;
int nAGC1Gain;
// print("\nS");
if (STV0399GetOneRegister ( bTunerIndex, STV0399REG_AGC0I, &bAGC0Int) != CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
bAGC0Int &= 0x0F;
if(g_Tuner_Type[bTunerIndex] == STV0399_E)
{
if (STV0399GetRegisters ( bTunerIndex, STV0399REG_AGC1S, pbRegValue, 2) != CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
nAGC1Gain = STV0399CalcAGC1Gain ( pbRegValue[1]) / 2;
if((nAGC1Gain < 1) && (bAGC0Int != 0))
{
bAGC0Int = MAX(0, bAGC0Int - 1);
// print("\nAGC %d", bAGC0Int);
if (STV0399SetOneRegister ( bTunerIndex, STV0399REG_AGC0I, bAGC0Int) != CSQPSK_SUCCESS)/* Write AGC0 integrator */
return CSQPSK_FAILURE;
pbRegValue[0] = 0x4b;
pbRegValue[1] = 0x4b;
if (STV0399SetRegisters ( bTunerIndex, STV0399REG_AGC1S, pbRegValue, 2) != CSQPSK_SUCCESS)/* Write into AGC1 registers to force update */
return CSQPSK_FAILURE;
}
else if((nAGC1Gain > 22) && (bAGC0Int != 12))
{
bAGC0Int = MIN(12, bAGC0Int + 1);
// print("\nAGC %d", bAGC0Int);
if (STV0399SetOneRegister ( bTunerIndex, STV0399REG_AGC0I, bAGC0Int) != CSQPSK_SUCCESS)/* Write AGC0 integrator */
return CSQPSK_FAILURE;
pbRegValue[0] = 0x4b;
pbRegValue[1] = 0x4b;
if (STV0399SetRegisters ( bTunerIndex, STV0399REG_AGC1S, pbRegValue, 2) != CSQPSK_SUCCESS)/* Write into AGC1 registers to force update */
return CSQPSK_FAILURE;
}
}
else
{
if (STV0399GetRegisters ( bTunerIndex, STV0399REG_AGC1S, pbRegValue, 2) != CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
nAGC1Gain = STV0399CalcAGC1Gain (pbRegValue[1]) / 2;
if((nAGC1Gain < 11) && (bAGC0Int != 1))
{
bAGC0Int = MAX(1, bAGC0Int - 1);
// print("\nAGC %d", bAGC0Int);
if (STV0399SetOneRegister ( bTunerIndex, STV0399REG_AGC0I, bAGC0Int) != CSQPSK_SUCCESS)/* Write AGC0 integrator */
return CSQPSK_FAILURE;
pbRegValue[0] = 0xc3;
pbRegValue[1] = 0xbf;
if (STV0399SetRegisters ( bTunerIndex, STV0399REG_AGC1S, pbRegValue, 2) != CSQPSK_SUCCESS)/* Write into AGC1 registers to force update */
return CSQPSK_FAILURE;
}
else if((nAGC1Gain > 19) && (bAGC0Int != 9))
{
bAGC0Int = MIN(9, bAGC0Int + 1);
// print("\nAGC %d", bAGC0Int);
if (STV0399SetOneRegister ( bTunerIndex, STV0399REG_AGC0I, bAGC0Int) != CSQPSK_SUCCESS)/* Write AGC0 integrator */
return CSQPSK_FAILURE;
pbRegValue[0] = 0xc3;
pbRegValue[1] = 0xbf;
if (STV0399SetRegisters ( bTunerIndex, STV0399REG_AGC1S, pbRegValue, 2) != CSQPSK_SUCCESS)/* Write into AGC1 registers to force update */
return CSQPSK_FAILURE;
}
}
return CSQPSK_SUCCESS;
}
CSQPSK_Error_t STV0399GetLockStatus ( CSHDITunerIndex bTunerIndex, int *status)
{
BYTE bRegValue;
int i;
for(i=0; i<20; i++)
{
STV0399GetOneRegister( bTunerIndex, STV0399REG_VSTATUS, &bRegValue);
if (bRegValue & STV0399_LK_MASK)
{
*status = TRUE;
return CSQPSK_SUCCESS;
}
CSSleep(1);
}
*status = FALSE;
return CSQPSK_SUCCESS;
}
void STV0399GetSignalPowerAndQuality ( CSHDITunerIndex bTunerIndex, int *nPower, int *nQuality)
{
int i;
STV0399SignalInfo_t pT_Info;
*nPower = 50;
*nQuality = 100;
STV0399GetSignalInfo( bTunerIndex, &pT_Info, &g_pT_Params[bTunerIndex]);
if(g_Tuner_Type[bTunerIndex] == STV0399_E){
for(i=0; i<20; ++i)
{
if(STV0399ESignalQuality_LookUp[i][0] >= pT_Info.C_N)
{
*nQuality = STV0399ESignalQuality_LookUp[i][1];
break;
}
}
}
else{
for(i=0; i<20; ++i)
{
if(STV0399SignalQuality_LookUp[i][0] >= pT_Info.C_N)
{
*nQuality = STV0399SignalQuality_LookUp[i][1];
break;
}
}
}
*nPower = (pT_Info.Power + 1060) / 10;
if(*nPower > 100)
*nPower = 100;
}
static int STV0399GetCFStatus ( CSHDITunerIndex bTunerIndex)
{
BYTE bRegValue;
if (STV0399GetOneRegister( bTunerIndex, STV0399REG_VSTATUS, &bRegValue) != CSQPSK_SUCCESS)
return -1;
if (bRegValue & STV0399_CF_MASK)
return CSQPSK_CF;
else
return CSQPSK_NO_CARRIER;
}
static int STV0399GetRFLevel( CSHDITunerIndex bTunerIndex, STV0399LookUp_t *lookup)
{
int agcGain = 0;
BYTE pbRegValue[4];
int Imin,
Imax,
i,
rfLevel = 0;
if((lookup != NULL) && lookup->nSize)
{
if (STV0399GetOneRegister( bTunerIndex, STV0399REG_AGC0I, pbRegValue) != CSQPSK_SUCCESS)
return -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -