⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snimdriv.c

📁 ST5100 driver files for ST chipset
💻 C
📖 第 1 页 / 共 5 页
字号:
            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 + -