mt313drv.c

来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 2,160 行 · 第 1/5 页

C
2,160
字号

		ErrorCode = ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqC, &bValue, 1 );
		if ( ErrorCode != CSQPSK_SUCCESS )
			return ErrorCode;

		bValue = 0xFF;

		return ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqCFIFO, &bValue, 1 );
	}
	
}

CSQPSK_Error_t CSToneBurstCommandOnly (CSHDITunerIndex bTunerIndex, BYTE bToneBurstSel)
{
	//sfg int nReturn = CSQPSK_SUCCESS;
	BYTE bValue;
	BYTE bPreF22KStatus;
	
	if (bToneBurstSel == 0)
		return CSQPSK_SUCCESS;
	
	if ( CSI2CRequestBus(bTunerIndex, CSHDI_TIMEOUT_INFINITY) == CSI2C_SUCCESS )
	{
		ZL1031XWaitDiSEqCFree(bTunerIndex);
		if ( ZL1031XReadReg ( bTunerIndex,STV0299REG_DiSEqC, &bValue, 1 ) != CSQPSK_SUCCESS )
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}

		bPreF22KStatus = bValue & DiSEqCMODE_MASK;	// 5C5=22KW4L,#,1cSZRT:s;V84!#

		if ( DiSEqCF22KSwitch ( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS )			// 9X22KJd3v!#
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}
		CSSleep(25);
		
		if (CSDSCTBCommand(bTunerIndex, bToneBurstSel-1) != CSQPSK_SUCCESS)
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}

		ZL1031XWaitDiSEqCFree(bTunerIndex);
		CSSleep(40);
		if (ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqC, &bPreF22KStatus, 1 ) != CSQPSK_SUCCESS)
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}
		CSI2CReleaseBus(bTunerIndex);
		return CSQPSK_SUCCESS;
	}
	else
		return CSQPSK_FAILURE;
}



void CSSetConfigASIInSel ( CSHDITunerIndex bTunerIndex, int nASIInSel, int nASIStatusPin) 
{
	g_nASIInSelect[bTunerIndex] = nASIInSel ;
	g_nASIStatusPin[bTunerIndex] = nASIStatusPin ;
//	ZL1031XRegInit() ;
}

/* +==========================================================================+ */
/* | Function:	5C5=DiSEqC FIFO W4L,										  |	*/		
/* +==========================================================================+ */
static CSQPSK_Error_t CSDSCGetStatus ( CSHDITunerIndex bTunerIndex, int *pnDSCStatus )
{
	 BYTE bValue[4];
	 int ErrorCode;
	 
	 ErrorCode = ZL1031XReadReg ( bTunerIndex, STV0299REG_DiSEqCSTATUS, bValue, 1 );
	 if(ErrorCode != CSQPSK_SUCCESS)
	 	return ErrorCode;
	 
	 if (( bValue[0] & FIFO_FULL_MASK) ==  FIFO_FULL_MASK)
		 *pnDSCStatus = 1;
	 else
		*pnDSCStatus = 0;

	 return CSQPSK_SUCCESS;
}



static CSQPSK_Error_t ZL1031XWaitDiSEqCFree (CSHDITunerIndex bTunerIndex)
{
	int i=0;
	int nDSCStatus;
	
	do 
	{
		CSSleep(1);
		CSDSCGetStatus(bTunerIndex,&nDSCStatus);
		i++;
	} while (  nDSCStatus && (i < 50));	// 5H5=FIFO?U!#
	if(i>=45) 
	{
		CSTRACE( ERROR_LEVEL, "[HDIQPSK] Err ZL1031XWaitDiSEqCFree TimeOut\n");
		CSTRACE( ERROR_LEVEL, "Position:file = %s,line = %s\n", __FILE__, __LINE__);
	     	return CSQPSK_FAILURE;
	}
	else
		return CSQPSK_SUCCESS;
}


CSQPSK_Error_t ZL1031XSendDiSEqCCommand (CSHDITunerIndex bTunerIndex, PBYTE pbValue, int nCommandNum)
{
	BYTE bPreF22KStatus;
	BYTE bValue;
	int ii;

        CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqCCommand]:\n=========Enter ZL1031XSendDiSEqCCommand=============");
        
if ( CSI2CRequestBus(bTunerIndex, CSHDI_TIMEOUT_INFINITY) == CSI2C_SUCCESS )
	{
		ZL1031XWaitDiSEqCFree(bTunerIndex);
		if ( ZL1031XReadReg ( bTunerIndex,STV0299REG_DiSEqC, &bValue, 1 ) != CSQPSK_SUCCESS )
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}

		bPreF22KStatus = bValue & DiSEqCMODE_MASK;	// 5C5=22KW4L,#,1cSZRT:s;V84!#

		if ( DiSEqCF22KSwitch ( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS )			// 9X22KJd3v!#
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}
		CSSleep(25);

		if ( CSDSCActive (bTunerIndex) != CSQPSK_SUCCESS)		// =xHkDiSEqCD#J=
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}
		for ( ii = 0; ii < nCommandNum; ii++ )
		{
			ZL1031XWaitDiSEqCFree(bTunerIndex);
			bValue = *pbValue++;
			ZL1031XWriteReg ( bTunerIndex,STV0299REG_DiSEqCFIFO, &bValue, 1 );
		}
		ZL1031XWaitDiSEqCFree(bTunerIndex);

		CSSleep(40);
		if (ZL1031XWriteReg ( bTunerIndex,STV0299REG_DiSEqC, &bPreF22KStatus, 1 ) != CSQPSK_SUCCESS)
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}
		CSI2CReleaseBus(bTunerIndex);

            	CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqCCommand]:\n========================================\n");
				
		return CSQPSK_SUCCESS;
	}
	else
		return CSQPSK_FAILURE;
}


CSQPSK_Error_t ZL1031XSendDiSEqC10Command (CSHDITunerIndex bTunerIndex, BYTE bSwitchType, BYTE bCommittedByte, BYTE bToneBurstSel, BYTE bRepeat)
{
	BYTE bPreF22KStatus;
	BYTE bRepeatTimes;
	BYTE pbValue[4];
	BYTE bToneburst;
	BYTE bValue;
	int ii;

        CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC10Command]:\n=========Enter ZL1031XSendDiSEqC10Command=============");
        CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC10Command]:\n bSwitchType = %d, bCommittedByte = 0x%x, bToneBurstSel = %d",bSwitchType,bCommittedByte,bToneBurstSel);
        
	if ( CSI2CRequestBus(bTunerIndex, CSHDI_TIMEOUT_INFINITY) == CSI2C_SUCCESS )
	{
		bRepeatTimes = bRepeat;
		pbValue[0] = 0xE0;
		pbValue[1] = 0x10;
		pbValue[2] = 0x38;
		pbValue[3] = bCommittedByte;
		bToneburst = (bCommittedByte >> 2) & 0x01;
		if (1 == bSwitchType)
		{
			pbValue[2] = 0x39;
		}
		ZL1031XWaitDiSEqCFree(bTunerIndex);
		if ( ZL1031XReadReg ( bTunerIndex,STV0299REG_DiSEqC, &bValue, 1 ) != CSQPSK_SUCCESS )
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}

		bPreF22KStatus = bValue & DiSEqCMODE_MASK;	// 5C5=22KW4L,#,1cSZRT:s;V84!#

		if ( DiSEqCF22KSwitch ( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS )			// 9X22KJd3v!#
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}
		CSSleep(25);

		if ( CSDSCActive (bTunerIndex) != CSQPSK_SUCCESS)		// =xHkDiSEqCD#J=
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}
	
		while ( TRUE )
		{
			for ( ii = 0; ii < 4; ii++ )
			{
				ZL1031XWaitDiSEqCFree(bTunerIndex);
				bValue = pbValue[ii];
				ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqCFIFO, &bValue, 1 );
			}
			ZL1031XWaitDiSEqCFree(bTunerIndex);
			if (bRepeatTimes == 0)
			{
				CSSleep(40);
				break;
			}
			else
			{
				CSSleep(130);
				pbValue[0] = 0xE1;
				bRepeatTimes--;
			}
		}
		
		if (0 == bSwitchType)
		{
			if ( CSDSCTBCommand ( bTunerIndex, bToneburst ) != CSQPSK_SUCCESS )	// 7"KMTone BurstC|An
			{
				CSI2CReleaseBus(bTunerIndex);
				return CSQPSK_FAILURE;
			}
		}
		else if ((bToneBurstSel == 1) || (bToneBurstSel == 2))
		{
			if ( CSDSCTBCommand ( bTunerIndex, bToneburst-1 ) != CSQPSK_SUCCESS )	// 7"KMTone BurstC|An
			{
				CSI2CReleaseBus(bTunerIndex);
				return CSQPSK_FAILURE;
			}
		}
	
		ZL1031XWaitDiSEqCFree(bTunerIndex);
		CSSleep(40);
//		sttbx_Print("\nF22KStatus = 0x%x", bPreF22KStatus);
		if (ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqC, &bPreF22KStatus, 1 ) != CSQPSK_SUCCESS)
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}
		CSI2CReleaseBus(bTunerIndex);

		// delay to ensure the signal is stable
		CSSleep(20);
		
            CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC10Command]:\n=================================================\n");
                
		return CSQPSK_SUCCESS;
	}
	else
		return CSQPSK_FAILURE;
}

CSQPSK_Error_t ZL1031XSendDiSEqC11Command (CSHDITunerIndex bTunerIndex, BYTE bCommittedByte, BYTE bUnCommittedByte, BYTE bRepeat)
{
	BYTE bPreF22KStatus;
	BYTE bRepeatTimes;
	BYTE pbCommittedCommand[4];
	BYTE pbUnCommittedCommand[4];
	BYTE bToneburst;
	BYTE bValue;
	int ii;

        CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC11Command]:\n=========Enter ZL1031XSendDiSEqC11Command=============");
        CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC11Command]:\nbCommittedByte = 0x%x, bUnCommittedByte = 0x%x, bRepeat = %d",bCommittedByte,bUnCommittedByte,bRepeat);
	
	if ( CSI2CRequestBus(bTunerIndex, CSHDI_TIMEOUT_INFINITY) == CSI2C_SUCCESS )
	{
		bRepeatTimes = bRepeat;
		pbCommittedCommand[0] = 0xE0;
		pbCommittedCommand[1] = 0x10;
		pbCommittedCommand[2] = 0x38;
		pbCommittedCommand[3] = bCommittedByte;
		bToneburst = (bCommittedByte >> 2) & 0x01;
		pbUnCommittedCommand[0] = 0xE0;
		pbUnCommittedCommand[1] = 0x10;
		pbUnCommittedCommand[2] = 0x39;
		pbUnCommittedCommand[3] = bUnCommittedByte;

		ZL1031XWaitDiSEqCFree(bTunerIndex);
		if ( ZL1031XReadReg ( bTunerIndex,STV0299REG_DiSEqC, &bValue, 1 ) != CSQPSK_SUCCESS )
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}

		bPreF22KStatus = bValue & DiSEqCMODE_MASK;	// 5C5=22KW4L,#,1cSZRT:s;V84!#

		if ( DiSEqCF22KSwitch ( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS )			// 9X22KJd3v!#
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}
		CSSleep(40);

		if ( CSDSCActive (bTunerIndex) != CSQPSK_SUCCESS)		// =xHkDiSEqCD#J=
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}
	
		while ( TRUE )
		{
			for ( ii = 0; ii < 4; ii++ )
			{
				ZL1031XWaitDiSEqCFree(bTunerIndex);
				bValue = pbCommittedCommand[ii];
				ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqCFIFO, &bValue, 1 );
			}
			ZL1031XWaitDiSEqCFree(bTunerIndex) ;
			if ((bRepeatTimes == 0) && (bRepeat >0))
			{
				CSSleep(40);
				break;
			}
			CSSleep(50);

			for ( ii = 0; ii < 4; ii++ )
			{
				ZL1031XWaitDiSEqCFree(bTunerIndex);
				bValue = pbUnCommittedCommand[ii];
				ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqCFIFO, &bValue, 1 );
			}

			ZL1031XWaitDiSEqCFree(bTunerIndex);

			if (bRepeat == 0)
			{
				CSSleep(40);
				break;
			}
			else
			{
				pbCommittedCommand[0] = 0xE1;
				pbUnCommittedCommand[0] = 0xE1;
				CSSleep(90);
				bRepeatTimes--;
			}
		}
		if ( CSDSCTBCommand ( bTunerIndex, bToneburst ) != CSQPSK_SUCCESS )	// 7"KMTone BurstC|An
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}
	
		ZL1031XWaitDiSEqCFree(bTunerIndex);
		CSSleep(40);
		if (ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqC, &bPreF22KStatus, 1 ) != CSQPSK_SUCCESS)
		{
			CSI2CReleaseBus(bTunerIndex);
			return CSQPSK_FAILURE;
		}
		CSI2CReleaseBus(bTunerIndex);

		// delay to ensure the signal is stable
		CSSleep(20);

            	CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC11Command]:\n========================================\n");
		return CSQPSK_SUCCESS;
	}
	else
		return CSQPSK_FAILURE;
}



long CalcDataTimeConstant(int errorrate, int sn, int to, int hy, long BAUD)
{
	long	Tviterbi = 0	,
			TimeOut = 0	,
			THysteresis = 0	,
			PhaseNumber[5] = {2,6,4,6,8}	,
			averaging[4] = {1024L , 4096L , 16384L , 65536L}	,
			InnerCode = 1000	,
			HigherRate = 1000	;
	int		i	;
	
	if(BAUD == 0)
		return 100;
	/* Data capture time (msec)*/
	/*This time is due to the Viterbi synchronisation .*/
	for(i=0 ; i<5 ; i++)
	{
		if(((errorrate>>i)&0x01) == 0x01)
		{
			switch(i)
			{
				case 0	:/*inner code = 1/2*/
					InnerCode = 2000	;
				break	;
				case 1	:/*inner code = 2/3*/
					InnerCode = 1500	;
				break	;
				case 2	:/*inner code = 3/4*/
					InnerCode = 1333	;
				break	;
				case 3	:/*inner code = 5/6*/
					InnerCode = 1200	;
				break	;
				case 4	:/*inner code = 7/8*/
					InnerCode = 1143	;
				break	;
			}//switch(i)
			Tviterbi += (int)((PhaseNumber[i]*averaging[sn]*InnerCode)/(BAUD*1000))	;

			if(HigherRate < InnerCode)
				HigherRate = InnerCode	;
		}//if er
	}//for i=0乣4
	/*time out calculation(TimeOut)*/
	/*This value indicates the maximum duration of synchro word research .*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?