📄 snimdriv.c
字号:
case SNIM_DATA_PROGRESS:
lResult =PSSNIM->wPerCent;
if (lResult>1000) lResult = 1000;
break;
case SNIM_DATA_FOFFKHZ:
lResult = Snim_GetFrequencyOffset(PSSNIM);
break;
case SNIM_DATA_PREVITBER:
lResult = Snim_CalcQPSKBER(PSSNIM);
break;
case SNIM_DATA_POSTVITBER:
lResult = Snim_CalcViterbiBER(PSSNIM);
break;
case SNIM_DATA_POSTVITCOUNT:
lResult = PSSNIM->dwErrorCount;
break;
case SNIM_DATA_SYSCLOCK:
Snim_ReadRegisterValue(PSSNIM,SNIM_SYS_CLK,1,(Uint32T*)&lResult);
break;
case SNIM_DATA_EBNOx10:
lResult =0;
if(Snim_ReadRegisterValue(PSSNIM, SNIM_M_SNR,(Uint32T*)&lResult))
lResult = (13312-(lResult & 0x7FFF)) * 10/683 ;
if (lResult<0) lResult =0;
break;
case SNIM_DATA_TUNERFREQ:
lResult = _SnimTunerRead(PSSNIM->hTuner,SNIM_TUNER_FREQUENCY);
break;
case SNIM_DATA_TRANSPONDERFREQ:
lResult = Snim_GetLNBFreq(PSSNIM,_LNBFREQ_MODE_ACTUAL);
break;
case SNIM_DATA_MPEGCLOCK:
lResult = Snim_GetMpegClock(PSSNIM);
break;
case SNIM_DATA_AGC:
if (Snim_ReadRegisterValue(PSSNIM,SNIM_AGC,(Uint32T*)&lResult))
lResult >>=14; /* reduce to 10 bits*/
break;
case SNIM_DATA_AGCERRDB:
if (Snim_ReadRegisterValue(PSSNIM,SNIM_AGC,(Uint32T*)&lResult))
lResult &= 0x3F;
break;
case SNIM_DATA_STATUS:
lResult =0;
if (Snim_ReadRegisterValue(hSnim,SNIM_STATUS,(Uint32T*)&lResult))
{
if (lResult & (SNIM_STATUS_FEC_DESCLOCK|SNIM_STATUS_FEC_BALOCK|SNIM_STATUS_FEC_VITLOCK))
{/* FEC lock so tuner must be*/
lResult |= SNIM_STATUS_SYNTH_LOCK;
}
else
{/* otherwise check*/
if (Snim_IsTunerLocked(PSSNIM)) lResult |= SNIM_STATUS_SYNTH_LOCK;
}
/* Get front end AGC lock condition*/
if (Snim_RegisterRead(PSSNIM,SNIM_SIGLEV_L,&ucBuffer,1))
{
if (ucBuffer & SNIM_SIGLEV_L_AGC)
{
lResult |= SNIM_STATUS_FEAGC_LOCK;
}
}
}
break;
case SNIM_DATA_IRQFLAGS:
break; /* TODO add some code here!*/
case SNIM_DATA_DEBUGFLAGS:
lResult = PSSNIM->wDebugFlags;
Snim_RegisterRead(PSSNIM,SNIM_DISEQC_MODE,&ucBuffer,1);
if (ucBuffer & SNIM_DISEQC_MODE_HORZ)lResult |= SNIM_DEBUG_POLARHORIZONTAL;
break;
default:
if (nSelect>=SNIM_DATA_MON_FIRST && nSelect <=SNIM_DATA_MON_LAST)
{
lResult = Snim_ReadMonitor(PSSNIM,Uint8T(nSelect-SNIM_DATA_MON_FIRST));
}
;
}
}
EXIT_SNIM_CONTENTION_LOCK;
return lResult;
}
/************************Zarlink Semiconductor*********************************
* Name:SnimWrite()
* Purpose:write data to driver
* Remarks:
* Inputs: data, selection
*
* Outputs: FALSE if an error occured
*
********************************************************************************/
BOOL SnimWrite(HANDLE hSnim,Uint16T nSelect,Sint32T lData)
{
BOOL bRet = TRUE;
Uint8T ucBuffer;
if (!Snim_CheckPointers(hSnim))return FALSE ;
ENTER_SNIM_CONTENTION_LOCK;
switch (nSelect)
{
case SNIM_DATA_POSTVITPERIOD:
if (lData>0 && lData<65536) /* 1 to 635535 seconds allowed */
PSSNIM->VitBerTime = Uint16T(lData);
else
bRet=FALSE;
break;
case SNIM_DATA_MPEGCLOCK:
if (!Snim_SetMpegClock(PSSNIM,lData))
bRet = FALSE;
break;
case SNIM_DATA_SCAN_STARTFREQ:
PSSNIM->wScanStart = Uint16T(lData);
break;
case SNIM_DATA_SCAN_STOPFREQ:
PSSNIM->wScanStop = Uint16T(lData);
break;
case SNIM_DATA_SCAN_STARTSYMB:
PSSNIM->ucScanRsMin = Uint8T(lData)*4;
break;
case SNIM_DATA_SCAN_ENDSYMB:
PSSNIM->ucScanRsMax = Uint8T(lData)*4;
break;
case SNIM_DATA_SCAN_OPTIONS:
PSSNIM->ucScanFlags = Uint8T(lData);
break;
case SNIM_DATA_SATDELAY:
PSSNIM->DelaySat = Uint16T(lData);
break;
case SNIM_DATA_DEBUGFLAGS:
PSSNIM->wDebugFlags |= Uint16T(lData);
if (PSSNIM->wDebugFlags & SNIM_DEBUG_NOCHANGEPOLAR)
{
bRet = (lData & SNIM_DEBUG_POLARHORIZONTAL)== SNIM_DEBUG_POLARHORIZONTAL;
if(bRet) bRet =Snim_RegisterRead(PSSNIM,SNIM_DISEQC_MODE,&ucBuffer,1);
ucBuffer |= SNIM_DISEQC_MODE_HORZ;
if (bRet) bRet =Snim_RegisterWrite(PSSNIM,SNIM_DISEQC_MODE,&ucBuffer,1);
}
bRet = TRUE;
break;
case SNIM_DATA_DEBUGFLAGS_CLR:
PSSNIM->wDebugFlags &= ~Uint16T(lData);
if (PSSNIM->wDebugFlags & SNIM_DEBUG_NOCHANGEPOLAR)
{
bRet = (lData & SNIM_DEBUG_POLARHORIZONTAL)== SNIM_DEBUG_POLARHORIZONTAL;
if(bRet) bRet =Snim_RegisterRead(PSSNIM,SNIM_DISEQC_MODE,&ucBuffer,1);
ucBuffer &= ~SNIM_DISEQC_MODE_HORZ;
if (bRet) bRet =Snim_RegisterWrite(PSSNIM,SNIM_DISEQC_MODE,&ucBuffer,1);
}
bRet = TRUE;
break;
#if defined(_INCLUDE_DISEQC)
case SNIM_DATA_DISEQCOPTIONS:
PSSNIM->SatToneBurstDisable=0;
PSSNIM->BandToneDisable=0;
PSSNIM->PolarVoltsDisable=0;
if (lData & SNIM_DISOPT_SATELLITE) PSSNIM->SatToneBurstDisable=1;
if (lData & SNIM_DISOPT_BANDSWITCH) PSSNIM->BandToneDisable=1;
if (lData & SNIM_DISOPT_POLARISATION) PSSNIM->PolarVoltsDisable=1;
break;
case SNIM_DATA_DISEQCOPTIONS_DISABLE:
PSSNIM->SatToneBurstDisable=0;
PSSNIM->BandToneDisable=0;
PSSNIM->PolarVoltsDisable=0;
break;
#endif
default:
if (nSelect<SNIM_DATA_FIRST)
bRet= _SnimTunerWrite(PSSNIM->hTuner,nSelect,lData);
else
bRet= FALSE;
}
EXIT_SNIM_CONTENTION_LOCK;
return bRet;
}
/************************Zarlink Semiconductor*********************************
* Name:SnimCommand()
* Purpose:command decoder
* Remarks:
* Inputs: command
*
* Outputs: FALSE if an error occured
*
********************************************************************************/
BOOL SnimCommand(HANDLE hSnim,Uint8T nCommand)
{
BOOL bRet = FALSE;
Uint8T ucBuffer;
if (!Snim_CheckPointers(PSSNIM))
{
printSnimDrvError(("[SnimCommand] () Error !!! Command [0x%X]\n", nCommand));
return SNIM_ERROR_GENERAL;
}
ENTER_SNIM_CONTENTION_LOCK;
switch (nCommand)
{
case SNIM_COMMAND_POWER_OFF:
PSSNIM->DemodFsmCommand=SNIM_FSMCOMMAND_OFF;
bRet = TRUE;
break;
case SNIM_COMMAND_POWER_ON:
PSSNIM->DemodFsmCommand=SNIM_FSMCOMMAND_RUN;
bRet = TRUE;
break;
case SNIM_COMMAND_MPEG_DISABLE:
if (PSSNIM->ucChipID == SNIM_ID_ZL10312 ||PSSNIM->ucChipID == SNIM_ID_ZL10313)
{
bRet = Snim_RegisterRead(hSnim,ZL31X_CTRL,&ucBuffer,1);
ucBuffer |=ZL31X_CTRL_MPEGDIS;
if (bRet) bRet = Snim_RegisterWrite(hSnim,ZL31X_CTRL,&ucBuffer,1);
}
break;
case SNIM_COMMAND_MPEG_ENABLE:
if (PSSNIM->ucChipID == SNIM_ID_ZL10312 ||PSSNIM->ucChipID == SNIM_ID_ZL10313)
{
bRet = Snim_RegisterRead(hSnim,ZL31X_CTRL,&ucBuffer,1);
ucBuffer &=~ZL31X_CTRL_MPEGDIS;
if (bRet) bRet = Snim_RegisterWrite(hSnim,ZL31X_CTRL,&ucBuffer,1);
}
break;
case SNIM_COMMAND_SCAN_START:
PSSNIM->DemodFsmCommand = SNIM_FSMCOMMAND_SCAN;
bRet = TRUE;
break;
case SNIM_COMMAND_SCAN_CONTINUE:
case SNIM_COMMAND_DISEQCDONE:
PSSNIM->DemodFsmCommand = SNIM_FSMCOMMAND_PROCEED;
bRet = TRUE;
break;
case SNIM_COMMAND_SCAN_ABORT:
PSSNIM->DemodFsmCommand = SNIM_FSMCOMMAND_SCANABORT;
bRet = TRUE;
break;
case SNIM_COMMAND_TRAIN_TUNER:
if (PSSNIM->DemodFsmState>=SNIM_DEMODFSM_IDLE)
{
PSSNIM->DemodFsmCommand=SNIM_FSMCOMMAND_TRAIN;
bRet =TRUE;
}
case SNIM_COMMAND_BYPASS_ON:
bRet = _SnimTunerWrite(PSSNIM->hTuner,SNIM_TUNER_SETBITS,SNIM_TUNER_BITS_RF);
break;
case SNIM_COMMAND_BYPASS_OFF:
bRet = _SnimTunerWrite(PSSNIM->hTuner,SNIM_TUNER_CLRBITS,SNIM_TUNER_BITS_RF);
break;
default: ;
}
EXIT_SNIM_CONTENTION_LOCK;
return bRet;
}
/************************Zarlink Semiconductor*********************************
* Name: Snim_SetMpegClock()
* Purpose:Sets the MPEG clock operation
* Remarks:
* SNIM_MCLK_SYMB MPEG clock will be derived from the symbol rate (default)
* SNIM_MCLK_EXT MPEG clock will be external using MICLK pin (MT312)
* or IRQ/DiSEqC2 pin (ZL10313)
* >0 MPEG clock is set to frequency, as near as available to that requested
* Inputs: iClock - required clock setting
*
* Outputs:TRUE if succesful, false if invalid
*
********************************************************************************/
BOOL Snim_SetMpegClock(PSSNIMCTL hSnim,Sint32T iClock)
{
Uint8T OPcontrol=0,FECsetup=0,FECstaten=0,SysClock=0,ucXtra;
Uint32T dwTemp;
BOOL bOk =TRUE;
/* Get the registers we need to modify*/
bOk = Snim_RegisterRead(hSnim,SNIM_SYS_CLK,&SysClock,1)
&& Snim_RegisterRead(hSnim,SNIM_OP_CTRL,&OPcontrol,1)
&& Snim_RegisterRead(hSnim,SNIM_FEC_SETUP,&FECsetup,1)
&& Snim_RegisterRead(hSnim,SNIM_FEC_STAT_EN,&FECstaten,1);
if (bOk && SNIM_ID_ZL10313==hSnim->ucChipID)
{
bOk = Snim_ReadExtra(hSnim,ZL313_CTRL_SELEXTRA_MPEG ,&ucXtra);
}
if (bOk)
{
/* these settings would give symbol derived MPEG clock */
hSnim->NoDiSEqC2Input=0; /* DiSEqC pin available*/
OPcontrol &= ~SNIM_OP_CTRL_MANMOCLK; /*MANUAL MCLK=0*/
FECsetup &= ~SNIM_FEC_SETUP_DIS_SR; /* DIS_SR (or reserved) = 0*/
ucXtra |= ZL313_XTRA_MPEG_EXTSERCLK; /* Serial MPEG clock off sss_20051031 check it...*/
if (iClock>0)
{/* Set requested frequency as close as possible*/
OPcontrol |= SNIM_OP_CTRL_MANMOCLK; /*Select MOCLK_RATIO derived clock*/
dwTemp = SysClock * 5000 ; /* 1000 to get kHz, *10 for rounding, and /2 because sys_clck is doubled*/
dwTemp /=iClock;
dwTemp +=5; /* apply rounding */
dwTemp/=10;
dwTemp -=6;
/*final result should be in range 0 to 15, any higher than this implies an arithmetic underflow */
if (dwTemp >15)
{
if (dwTemp>=0x80000000)
dwTemp=0; /* negative, clip to 0*/
else
dwTemp = 15;/* otherwise clip to 15 */
}
/* now write the result to the high nibble of FEC status enable*/
FECstaten = (Uint8T) ( (FECstaten & 0x0F) +(dwTemp<<4));
bOk = Snim_RegisterWrite(hSnim,SNIM_FEC_STAT_EN,&FECstaten,1);
}
else if (SNIM_MCLK_EXT==iClock && (PSSNIM->ucChipID==SNIM_ID_MT312||PSSNIM->ucChipID==SNIM_ID_ZL10313))
{/* External clock MT312 & ZL10313*/
OPcontrol |= SNIM_OP_CTRL_MANMOCLK; /* both of these select external clock mode*/
FECsetup |= SNIM_FEC_SETUP_DIS_SR;
if(OPcontrol & SNIM_OP_CTRL_BSO)
{/* if bit serial mode, turn on External serial clock */
ucXtra |= ZL313_XTRA_MPEG_EXTSERCLK;
if (0==(hSnim->wConfig & SNIM_CONFIG_MPEGIRQCLK))
{ /* flag that DiSEqC[2] input pin is not available for DiSEqC */
hSnim->NoDiSEqC2Input=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -