mt313drv.c

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

C
2,160
字号
	TimeOut = (int)((HigherRate*16386L*(to + 1))/(2*BAUD*1000))	;
	/*Hysteresis duration*/
	THysteresis = (int)((HigherRate*26112L*(hy + 1))/(2*BAUD*1000))	;/*26112 = 16*204*8 bits */
	/*a guard time of 1 ms is added*/
	return( 1 + Tviterbi + TimeOut + THysteresis )	;
}


long CalcTimingTimeConstant(long BAUD)
{
	long TConstant	;
	
	if (BAUD == 0)
		return 20;
	TConstant = 400000/BAUD	;//msec 000125:modified
	return( TConstant )	;
}

long CalcDerotTimeConstant(long BAUD)
{
	long TConstant	;
	
	if (BAUD == 0)
		return 10;		
	TConstant = 200000/BAUD	;//msec
	if(TConstant<10)
		TConstant=10;
	return( TConstant )	;
}
#endif
static CSQPSK_Error_t CSDSCTBCommand ( CSHDITunerIndex bTunerIndex, BYTE bTBSwitch )
{
	BYTE bValue;
	int ErrorCode;
	bValue = 0;

	if ( bTBSwitch == 0 )
	{
		ErrorCode = ZL1031XRdReg( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 );
		bValue &= ~0x07;
		bValue |= 2 ;
		ErrorCode = ZL1031XWrtReg ( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 );
			return ErrorCode;
	
	}
	else 
	{
		ErrorCode = ZL1031XRdReg( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 );
		bValue &= ~0x07;
		bValue |= 3 ;
		ErrorCode = ZL1031XWrtReg ( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 );
			return ErrorCode;
	}
	
}
 CSQPSK_Error_t ZL1031XToneBurstCommandOnly (CSHDITunerIndex bTunerIndex, BYTE bToneBurstSel)
{
	BYTE bValue;
	BYTE bPreF22KStatus;
	
	if (bToneBurstSel == 0)
		return CSQPSK_SUCCESS;   
	

	if ( ZL1031XRdReg( bTunerIndex,ZL1031X_DISEQC_MODE, &bValue, 1 ) != CSQPSK_SUCCESS )
	{
		return CSQPSK_FAILURE;
	}

	bPreF22KStatus = bValue & 0x01;	

	if ( ZL1031X_F22K_Switch( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS )		
	{
		return CSQPSK_FAILURE;
	}
	CSSleep(25);
	
	if (CSDSCTBCommand(bTunerIndex, bToneBurstSel-1) != CSQPSK_SUCCESS)
	{
		return CSQPSK_FAILURE;
	}

	CSSleep(40);
	if (ZL1031XRdReg ( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 ) != CSQPSK_SUCCESS)
	{
		return CSQPSK_FAILURE;
	}
	bValue |= bPreF22KStatus;

	if (ZL1031XWrtReg( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 ) != CSQPSK_SUCCESS)
	{
		return CSQPSK_FAILURE;
	}
	return CSQPSK_SUCCESS;

}
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;
	BYTE temp;
	BYTE bpre22k;
	//CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqCCommand]:\n=========Enter ZL1031XSendDiSEqCCommand=============");

	ZL1031XRdReg(bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1);
	bpre22k  =  temp & (0x07);
	ZL1031X_F22K_Switch (bTunerIndex, CSHDI_OFF);
	
	for ( ii = 0; ii < nCommandNum; ii++ )
	{
		bValue = *pbValue++;
		ZL1031XWrtReg(bTunerIndex, ZL1031X_DISEQC_INSTR, &bValue, 1);
	}

	ZL1031XRdReg(bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1);
	temp |= 4;
	temp |= (nCommandNum - 1) << 3;
	ZL1031XWrtReg ( bTunerIndex,ZL1031X_DISEQC_MODE, &temp, 1); 
	CSSleep(200);

	ZL1031XRdReg(bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1);
	temp &= ~0x07;
	temp  |= bpre22k;
	ZL1031XWrtReg ( bTunerIndex,ZL1031X_DISEQC_MODE, &temp, 1); 

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

}
CSQPSK_Error_t ZL1031XSendOptionCommand(CSHDITunerIndex bTunerIndex, BYTE ucOptionSwitch)
{
	int nOptionSwitch;	
	BYTE aucDiseqcCommand[4];

	 CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendOptionCommand]:\n ucOptionSwitch= %d",ucOptionSwitch);
	
	if (ucOptionSwitch == 1)
	{
		aucDiseqcCommand[0] = 0xE0;
		aucDiseqcCommand[1] = 0x15;
		aucDiseqcCommand[2] = 0x23;
	}
	else if (ucOptionSwitch == 2)
	{
		aucDiseqcCommand[0] = 0xE0;
		aucDiseqcCommand[1] = 0x15;
		aucDiseqcCommand[2] = 0x27;
	}

	if (nOptionSwitch != 0)
	{
		ZL1031XSendDiSEqCCommand(bTunerIndex, aucDiseqcCommand, 3);
		CSSleep(100);
	}
}
CSQPSK_Error_t ZL1031XSendDiSEqC10Command (CSHDITunerIndex bTunerIndex, BYTE bSwitchType, BYTE bCommittedByte, BYTE bToneBurstSel, BYTE bRepeat)
{
	
	BYTE bPreF22KStatus;
	BYTE bRepeatTimes;
	BYTE pbcommited[4];
	BYTE pbUncommited[4];
	BYTE pbUnCommittedCommand[4];
	BYTE bToneburst;
	BYTE bValue;
	BYTE temp;
	int ii;
	BYTE bpre22k;

    //USPPrint(ERROR_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC10Command]:\n=========Enter ZL1031XSendDiSEqC10Command=============");
    //USPPrint( ERROR_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC10Command]:\n bSwitchType = %d, bCommittedByte = 0x%x, bToneBurstSel = %d",bSwitchType,bCommittedByte,bToneBurstSel);
	/*1.0*/
	bRepeatTimes = bRepeat;
	pbcommited[0] = 0xE0;
	pbcommited[1] = 0x10;
	pbcommited[2] = 0x38;
	pbcommited[3] = bCommittedByte;
	/*for 1.1*/
	/*
	pbUncommited [0] = 0xE0;
	pbUncommited[1] = 0x10;
	pbUncommited[2] = 0x39;
	pbUncommited[3] = bUnCommittedByte;*/

	/*
	if ((1 == bSwitchType) || (4 == bSwitchType))
	{
		pbcommited[2] = 0x39;
	}*/
	ZL1031XRdReg(bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1);
	bpre22k  =  temp & (0x07);
	//CSTRACE(ERROR_LEVEL,"[hdi][qpsk] temp bpre22k 1111111111111=  %d, %d\n", temp, bpre22k);
	ZL1031X_F22K_Switch (bTunerIndex, CSHDI_OFF);
	
	while ( TRUE )
	{
		for ( ii = 0; ii < 4; ii++ )
		{
			bValue = pbcommited[ii];
			ZL1031XWrtReg ( bTunerIndex, ZL1031X_DISEQC_INSTR, &bValue, 1 );
			
		}
		temp &= (~0x3f);/*clear*/
		temp |= 0x1c;/*set mode and length after data send in fifo*/
		ZL1031XWrtReg ( bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1); 

		CSSleep(50);
		/*
		if ((3 == bSwitchType) || (4 == bSwitchType))
		{
			// USPPrint(ERROR_LEVEL,  "\n&&&&&&&&&&&&&&&&\r\n");
			ZL1031XToneBurstCommandOnly (bTunerIndex, bToneBurstSel);
		}*/
	
		if (bRepeatTimes == 0)
		{
			CSSleep(100);/*延时不够会导致22k 切换的时候出现切换不了的现象*/
			break;
		}
		else
		{
			CSSleep(130);
			pbcommited[0] = 0xE1;
			bRepeatTimes--;
		}
	}
	
	ZL1031XRdReg(bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1);
	temp &= ~0x07;
	temp  |= bpre22k;
	ZL1031XWrtReg ( bTunerIndex,ZL1031X_DISEQC_MODE, &temp, 1); 
	
	CSSleep(20);
	
       // CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC10Command]:\n=================================================\n");
            
	return CSQPSK_SUCCESS;
	  
}

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;
	BYTE temp;
	int ii;
	

       // USPPrint( ERROR_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC11Command]:\n=========Enter ZL1031XSendDiSEqC11Command=============");
       // USPPrint( ERROR_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC11Command]:\nbCommittedByte = 0x%x, bUnCommittedByte = 0x%x, bRepeat = %d",bCommittedByte,bUnCommittedByte,bRepeat);

	//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;


	
	if ( ZL1031XRdReg( bTunerIndex,ZL1031X_DISEQC_MODE, &bValue, 1 ) != CSQPSK_SUCCESS )
	{
		return CSQPSK_FAILURE;
	}
	bPreF22KStatus =bValue & (0x07);///22k off
	if ( ZL1031X_F22K_Switch( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS )			
	{
		return CSQPSK_FAILURE;
	}

	while ( TRUE )
	{
		
		#if 0
		for ( ii = 0; ii < 4; ii++ )
		{
			bValue = pbCommittedCommand[ii];
			ZL1031XWrtReg( bTunerIndex, ZL1031X_DISEQC_INSTR, &bValue, 1 );
		}
	
		temp &= (~0x3f);/*clear*/
		temp |= 0x1c;/*set mode and length after data send in fifo*/
		ZL1031XWrtReg (bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1); 

		CSSleep(150);/*延时太短会影响到下一个命令*/
		#endif
		for ( ii = 0; ii < 4; ii++ )
		{
			bValue = pbUnCommittedCommand[ii];
			ZL1031XWrtReg ( bTunerIndex, ZL1031X_DISEQC_INSTR, &bValue, 1 );
		}
		temp &= (~0x3f);/*clear*/
		temp |= 0x1c;/*set mode and length after data send in fifo*/
		ZL1031XWrtReg (bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1); 

		CSSleep(150);
	
		if (bRepeat == 0)
		{
			CSSleep(40);
			break;
		}
		else
		{
			//pbCommittedCommand[0] = 0xE1;
			pbUnCommittedCommand[0] = 0xE1;
			CSSleep(90);
			bRepeat--;
		}
	}
	
	ZL1031XRdReg( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 );
	bValue &= (~0x07);
	bValue |= bPreF22KStatus;
	ZL1031XWrtReg ( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 );
	//CSI2CReleaseBus(bTunerIndex);

	CSSleep(20);

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

CSQPSK_Error_t ZL1031XSetStandby( CSHDITunerIndex bTunerIndex, int nStandby )
{
	BYTE bValue;

	if(ZL1031XRdReg( bTunerIndex,ZL1031X_CONFIG, &bValue, 1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	
	if(nStandby)
		bValue &= 0x7f;
	else 
		bValue|=0x80;
	return ZL1031XWrtReg( bTunerIndex,ZL1031X_CONFIG, &bValue, 1);
}

CSQPSK_Error_t ZL1031XSetClockPolarity( CSHDITunerIndex bTunerIndex, T_ClockPolarity clockPol )
{
	BYTE bValue;
	 if (ZL1031XRdReg ( bTunerIndex,ZL1031X_OP_CTRL,&bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	 bValue &=( ~ZL1031X_OP_CTRL_MOCLKINV);
	if ( clockPol == LOW_TO_HIGH ) 
	{
		bValue |= ZL1031X_OP_CTRL_MOCLKINV;		
	}
	
	return ZL1031XWrtReg ( bTunerIndex, ZL1031X_OP_CTRL, &bValue,  1);
}

CSQPSK_Error_t ZL1031XSetFECRates(CSHDITunerIndex bTunerIndex, CSQPSK_FECRates FECRates)
{
	BYTE Data = 0;
	BYTE bValue;
	BYTE Data1;
	
	if(ZL1031XRdReg(bTunerIndex, ZL1031X_VIT_MODE, &bValue, 1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	Data1 = bValue;

	/*
	** For each STTUNER FEC rates (see sttuner.h)
	** Set specific bit of enable puncture rate register
	** Bit 0 - 1/2, 1 - 2/3, 2 - 3/4, 3 - 5/6, 4 - 7/8(DVB) or 6/7(DSS)
	*/
	if (FECRates==FEC1_2) // 1/2
		Data |= ZL1031X_VENRATE12;
	if (FECRates==FEC2_3) // 2/3
		Data |= ZL1031X_VENRATE23;
	if (FECRates==FEC3_4) // 3/4
		Data |= ZL1031X_VENRATE34;
	if (FECRates==FEC5_6) // 5/6
		Data |= ZL1031X_VENRATE56;
	else 
		Data |= ZL1031X_VENRATE78;
	//sttbx_Print("[ZL1031XSetFECRates]Data = 0x%x\n",Data);
	return ZL1031XWrtReg(bTunerIndex, ZL1031X_VIT_MODE, &Data, 1);
}   

⌨️ 快捷键说明

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