📄 drv_channel.c
字号:
// Input :
// Output :
// Return :
/////////////////////////////////////////////////////////////////////////////////
void AS_IQinversion(unsigned char unitId)
{
#ifdef THOMSON_MM
#else
/*Because 2nd tuner (single type) has H/W IQ swapped!! 2003.05.16*/
if( unitId == 1 )
DEMOD_REG[unitId][DEMOD_REG_CONF] |= (DEMOD_REG_BIT_IQP); // 0100 0000 : IQP = 1 : swap
else
DEMOD_REG[unitId][DEMOD_REG_CONF] &= ~(DEMOD_REG_BIT_IQP); // 1011 1111 : IQP = 0 : not swap
// DEMOD_REG[unitId][DEMOD_REG_CONF] = g_ucDemodID[unitId]; //10086
drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_CONF, &DEMOD_REG[unitId][DEMOD_REG_CONF], 1);
#endif
} // end of AS_IQinversion
/////////////////////////////////////////////////////////////////////////////////
// Function : drv_channel_ResetCarrier
// Description : The CLBCAR signal clears the carrier synchronization block
// Input :
// Output :
// Return :
/////////////////////////////////////////////////////////////////////////////////
void drv_channel_ResetCarrier(unsigned char unitId)
{
#ifdef THOMSON_MM
#else
// To reset the carrier synchronizer
DEMOD_REG[unitId][DEMOD_REG_CARINIT] &= ~(DEMOD_REG_BIT_CLBCAR);
drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_CARINIT, &DEMOD_REG[unitId][DEMOD_REG_CARINIT], 1);
VK_TASK_Sleep(2);
DEMOD_REG[unitId][DEMOD_REG_CARINIT] |= DEMOD_REG_BIT_CLBCAR;
drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_CARINIT, &DEMOD_REG[unitId][DEMOD_REG_CARINIT], 1);
#endif
} // end of drv_channel_ResetCarrier
/////////////////////////////////////////////////////////////////////////////////
// Function : AS_AlgoStart
// Description : Chip Algorithm ALL Clear & IQ Inersion Default Setting.
// Input :
// Output :
// Return : TRUE if error, FALSE if success
/////////////////////////////////////////////////////////////////////////////////
void AS_AlgoStart(unsigned char unitId)
{
AS_ResetAll(unitId);
AS_WriteInitAGCRA(unitId);
AS_IQinversion(unitId);
// drv_channel_ResetCarrier(unitId); // by kwonkh 2002/1215
} // end of AS_AlgoStart
/////////////////////////////////////////////////////////////////////////////////
// Function : SetCodeRate
// Description : set the rate of the Viterbi decoder
// Input :
// Output :
// Return :
/////////////////////////////////////////////////////////////////////////////////
void SetCodeRate(unsigned char unitId)
{
unsigned char ucFEC;
if (prevCodeRate[unitId] != g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode)
{
prevCodeRate[unitId] = g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode;
g_ChannelFlag[unitId].fgSpecialInversion = 0;
switch (g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode)
{
case TUNER_CODERATE_1_2: // 1/2
ucFEC = g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode;
break;
case TUNER_CODERATE_2_3: // 2/3
ucFEC = g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode;
break;
case TUNER_CODERATE_3_4: // 3/4
ucFEC = g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode;
break;
case TUNER_CODERATE_5_6: // 5/6
ucFEC = 0x04;
g_ChannelFlag[unitId].fgSpecialInversion = 1;
break;
case TUNER_CODERATE_7_8: // 7/8
ucFEC = 0x06;
g_ChannelFlag[unitId].fgSpecialInversion = 1;
break;
case TUNER_CODERATE_AUTO: // AUTO
ucFEC = 0x08;
g_ChannelFlag[unitId].fgSpecialInversion = 1;
break;
}
DEMOD_REG[unitId][DEMOD_REG_RATE] = ucFEC;
//thomson drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_RATE, &DEMOD_REG[unitId][DEMOD_REG_RATE], 1);
}
} // end of SetCodeRate
/////////////////////////////////////////////////////////////////////////////////
// Function : SetIQInversion
// Description : Check I,Q Status & Set I,Q Inversion or Normal
// Input :
// Output :
// Return :
/////////////////////////////////////////////////////////////////////////////////
void SetIQInversion(unsigned char unitId)
{
//thomson drv_ch_i2c_DEMODRead(unitId, DEMOD_REG_CONF, &DEMOD_REG[unitId][DEMOD_REG_CONF], 1);
// DEMOD_REG[unitId][DEMOD_REG_CONF] ^= 0x40; // IQP toggle
if (DEMOD_REG[unitId][DEMOD_REG_CONF] & DEMOD_REG_BIT_IQP)
DEMOD_REG[unitId][DEMOD_REG_CONF] &= ~(DEMOD_REG_BIT_IQP);
else
DEMOD_REG[unitId][DEMOD_REG_CONF] |= DEMOD_REG_BIT_IQP;
//thomson drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_CONF, &DEMOD_REG[unitId][DEMOD_REG_CONF], 1);
} // end of SetIQInversion
/////////////////////////////////////////////////////////////////////////////////
// Function : SearchRange
// Description : for Adjust Tuner
// 32 ~ 8Ms/s -> +/- 12MHz Carrier Tracking.
// 8 ~ 4Ms/s -> +/- 7MHz Carrier Tracking.
// 4 ~ 1Ms/s -> +/- 4MHz Carrier Tracking.
// Input :
// Output :
// Return :
/////////////////////////////////////////////////////////////////////////////////
void SearchRange(unsigned char unitId)
{
if (g_ChInfoWork[unitId].Tuner.Sat.ucAutoSearch == AUTOSEARCH_OFF)
{
if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 18000) g_ucMaxCarrierSweepLoop[unitId] = 6;
else if(g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 8000) g_ucMaxCarrierSweepLoop[unitId] = 12;
else if(g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 4000) g_ucMaxCarrierSweepLoop[unitId] = 24;
else g_ucMaxCarrierSweepLoop[unitId] = 28;
}
else
{
if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 18000) g_ucMaxCarrierSweepLoop[unitId] = 4;
else if(g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 8000) g_ucMaxCarrierSweepLoop[unitId] = 8;
else if(g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 4000) g_ucMaxCarrierSweepLoop[unitId] = 16;
else g_ucMaxCarrierSweepLoop[unitId] = 24;
}
} // end of SearchRange
/////////////////////////////////////////////////////////////////////////////////
// Function : SetCarrierSweep
// Description : Select the filter coefficients for the Carrier frequency recovery loop
// and define internal carrier sweep
// Input :
// Output :
// Return :
/////////////////////////////////////////////////////////////////////////////////
void SetCarrierSweep(unsigned char unitId)
{
if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 32000)
{
DEMOD_REG[unitId][DEMOD_REG_CARC] = 0x93; // RS/2800
DEMOD_REG[unitId][DEMOD_REG_CSWP] = 0x53;
DEMOD_REG[unitId][DEMOD_REG_AGCN] = 0x63;
DEMOD_REG[unitId][DEMOD_REG_ADCONF] = 0x89;
DEMOD_REG[unitId][DEMOD_REG_GTR2] = 0x4f;
//thomson drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_AGCN, &DEMOD_REG[unitId][DEMOD_REG_AGCN], 1);
//thomson drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_ADCONF, &DEMOD_REG[unitId][DEMOD_REG_ADCONF], 1);
//thomson drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_GTR2, &DEMOD_REG[unitId][DEMOD_REG_GTR2], 1);
}
else
{
if(g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 15000) // MCPC Mid
{
DEMOD_REG[unitId][DEMOD_REG_CARC] = 0x94; // RS/1400 (default)
DEMOD_REG[unitId][DEMOD_REG_CSWP] = 0x53;
}
else if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 7000) // MCPC Min
{
DEMOD_REG[unitId][DEMOD_REG_CARC] = 0x95; // RS/700
DEMOD_REG[unitId][DEMOD_REG_CSWP] = 0x00;
}
else if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate > 4000) // SCPC Max
{
DEMOD_REG[unitId][DEMOD_REG_CARC] = 0x96; // RS/350
DEMOD_REG[unitId][DEMOD_REG_CSWP] = 0x00;
}
else // SCPC Min
{
DEMOD_REG[unitId][DEMOD_REG_CARC] = 0x97; // RS/175
DEMOD_REG[unitId][DEMOD_REG_CSWP] = 0x00;
}
if (prevSymbolRate[unitId] > 32000)
{
DEMOD_REG[unitId][DEMOD_REG_AGCN] = 0x44;
DEMOD_REG[unitId][DEMOD_REG_ADCONF] = 0x81;
DEMOD_REG[unitId][DEMOD_REG_GTR2] = 0x43;
//thomson drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_AGCN, &DEMOD_REG[unitId][DEMOD_REG_AGCN], 1);
//thomson drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_ADCONF, &DEMOD_REG[unitId][DEMOD_REG_ADCONF], 1);
//thomson drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_GTR2, &DEMOD_REG[unitId][DEMOD_REG_GTR2], 1);
}
}
DEMOD_REG[unitId][DEMOD_REG_AFC0] = 0x03;
//thomson drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_AFC0, &DEMOD_REG[unitId][DEMOD_REG_AFC0], 1);
//thomson drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_CARC, &DEMOD_REG[unitId][DEMOD_REG_CARC], 2);
} // end of SetCarrierSweep
/////////////////////////////////////////////////////////////////////////////////
// Function : SetSymbolRate
// Description :
// Input :
// Output :
// Return :
/////////////////////////////////////////////////////////////////////////////////
void SetSymbolRate(unsigned char unitId)
{
#ifdef THOMSON_MM
#else
if (prevSymbolRate[unitId] != g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate)
{
prevSymbolRate[unitId] = g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate;
PN1010_Set_Symbolrate(unitId,g_ChInfoWork[unitId].Tuner.Sat.ucConvolutionCode, g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate);
}
#endif
} // end of SetSymbolRate
/////////////////////////////////////////////////////////////////////////////////
// Function : SetTunerFreq
// Description :
// Input :
// Output :
// Return :
/////////////////////////////////////////////////////////////////////////////////
void SetTunerFreq(unsigned char unitId)
{
#ifdef THOMSON_MM
#else
unsigned long N_pro;
N_pro = g_ChInfoWork[unitId].Tuner.Sat.dwFreq;
PN1010_Set_Frequency(unitId, N_pro); // Mhz
#endif
} // end of SetTunerFreq
/////////////////////////////////////////////////////////////////////////////////
// Function : AdjustTuner
// Description :
// Input :
// Output :
// Return :
/////////////////////////////////////////////////////////////////////////////////
void AdjustTuner(unsigned char unitId)
{
int iAdjustFrequencyOffset;
// Freq. OffSet 蔼阑 1MHz 窜困肺 佬绢 柯促.
iAdjustFrequencyOffset = iClockAdjustTable[g_ucClockSweepCnt[unitId]++];
if (g_ucClockSweepCnt[unitId] >= g_ucMaxCarrierSweepLoop[unitId]) // Freq. Sweep 捞 +/- 率栏肺 肯丰 等 版快
g_ChannelFlag[unitId].fgClockFreqSweepDone = 1;
if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate < 4000) // 2000 <= S.R. < 4000
iAdjustFrequencyOffset /= 4; // 250KHz
else if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate < 8000) // 4000 <= S.R. < 8000
iAdjustFrequencyOffset /= 2; // 500Khz
else if (g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate < 18000) // 8000 <= S.R. < 18000
; // 1MHz
else // 18000 <= S.R.
iAdjustFrequencyOffset *= 2; // 2MHz
g_ChInfoWork[unitId].Tuner.Sat.dwFreq = g_ChInfoWork[unitId].ulFrequencyBase + iAdjustFrequencyOffset;
SetTunerFreq(unitId);
} // end of SetTunerFreq
/////////////////////////////////////////////////////////////////////////////////
// Function : AS_ReadAFC
// Description : AFC provides the frequency offset, in 2's complement
// between the transmitter and receiver
// when carrier has been recovered.
// There are 2 cases depending on the position of the complex multiplier
// Input :
// Output :
// Return :
/////////////////////////////////////////////////////////////////////////////////
void AS_ReadAFC( unsigned char unitId, long *deltaF)
{
unsigned char ucVAFC;
unsigned long ulDeltaF;
VK_TASK_Sleep(10); // Wait until carrier loop is stable.
//thomson drv_ch_i2c_DEMODRead(unitId, DEMOD_REG_VAFC, &ucVAFC, 1);
if (ucVAFC & 0x80) // Negative case
{
ulDeltaF = (unsigned long)(0x100 - (unsigned long)ucVAFC); // calculate 2's complement
*deltaF = (long)fnEX_MulDiv64((ulDeltaF*1000), (unsigned long)g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate, 128);
}
else // Positive case
{
ulDeltaF = (unsigned long)ucVAFC;
*deltaF = -(long)fnEX_MulDiv64((ulDeltaF*1000), (unsigned long)g_ChInfoWork[unitId].Tuner.Sat.wSymbolRate, 128);
}
/*Because 2nd tuner (single type) has H/W IQ swapped!! 2003.05.16*/
if (unitId == 1)
*deltaF = (-1) * (*deltaF);
} // end of AS_ReadAFC
/////////////////////////////////////////////////////////////////////////////////
// Function : CheckTunerLock
// Description :
// Input :
// Output :
// Return :
/////////////////////////////////////////////////////////////////////////////////
__channel_TunerPhaseLock_t CheckTunerLock(unsigned char unitId)
{
#ifdef THOMSON_MM
unsigned char ucTunerState;
unsigned char ucTunerState2;
Snim_Drv_Run_Monitor();
ucTunerState = Snim_Drv_IsTunerLocked();
//printDrvCh((" ~~~~~~~~~~~~~~~~~~~~ucTunerState : %x \n\r" , ucTunerState));
return ucTunerState;
#else
unsigned char ucTunerState;
unsigned char ucTunerState2;
ucTunerState = PN1010_Check_Lock(unitId);
printDrvCh((" ~~~~~~~~~~~~~~~~~~~~ucTunerState : %x \n\r" , ucTunerState));
return ucTunerState;
#endif
} // end of CheckTunerLock
/////////////////////////////////////////////////////////////////////////////////
// Function : AS_WriteDecrementAGCRA
// Description : decrement the AGCRA register (0x0A -> 0x03 max)
// VAGCA : analog AGC information
// ERADC : error between the signal level at the ADC output
// and the AGCRA reference.
// Input :
// Output :
// Return :
/////////////////////////////////////////////////////////////////////////////////
void AS_WriteDecrementAGCRA(unsigned char unitId)
{
unsigned char ucVAGCA, ucERADC;
DEMOD_REG[unitId][DEMOD_REG_AGCRA] = 0x0A;
#ifdef PHILIPS_TUNER
DEMOD_REG[unitId][DEMOD_REG_AGCRA] |= DEMOD_REG_BIT_PWMOD;
#else
DEMOD_REG[unitId][DEMOD_REG_AGCRA] &= ~(DEMOD_REG_BIT_PWMOD);
#endif
//thomson drv_ch_i2c_DEMODWrite(unitId, DEMOD_REG_AGCRA, &DEMOD_REG[unitId][DEMOD_REG_AGCRA], 1); // by kwonkh 2002/1215
VK_TASK_Sleep(15);
GE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -