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

📄 reg0299.c

📁 Zoran V966 DVD 解码 Soc芯片的源程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	return CalcDerotatorFrequency(FieldGetVal(handle,DEROTATORFREQUENCYMSB),
									FieldGetVal(handle,DEROTATORFREQUENCYLSB), 
									RegGetMasterFreq(handle));  	
}

/*****************************************************
**FUNCTION	::	CalcAuxClkFrequency
**ACTION	::	Compute Auxiliary clock frequency 
**PARAMS IN	::	NONE
**PARAMS OUT::	NONE
**RETURN	::	Auxiliary Clock frequency
*****************************************************/
long CalcAuxClkFrequency(DEMOD_HANDLE handle,INT32 k, INT32 m, INT32 acr)
{
	long aclk,factor;
	INT32 function,value;
	
	function = acr>>5;
	value = acr & 0x1F;    
	
	switch(function)
	{
		case 0:
			aclk = 0;
		break;
	
		case 1:
			if(value)
				aclk = CalcVCOFrequency(handle,k,m)/8/value;
			else
				aclk = CalcVCOFrequency(handle,k,m)/8;  
		break;
		
		default:
			factor = 8192L*PowOf2(function-2);
			aclk = CalcVCOFrequency(handle,k,m)/factor/(32+value);
		break;
	}
	
	return aclk; 
}

/*****************************************************
**FUNCTION	::	RegGetAuxFreq
**ACTION	::	Read registers and compute Auxiliary clock frequency 
**PARAMS IN	::	NONE
**PARAMS OUT::	NONE
**RETURN	::	Auxiliary Clock frequency
*****************************************************/
long RegGetAuxFreq(DEMOD_HANDLE handle)
{

	/*	Read registers	*/
	RegGetOneRegister(handle,R_RCR);
	RegGetOneRegister(handle,R_ACR);
	
	return CalcAuxClkFrequency(handle,FieldGetVal(handle,K),
								FieldGetVal(handle,M),
								FieldGetVal(handle,ACR));	/*	Compute auxiliary clock freq	*/   
}


int RegGetErrorCount(DEMOD_HANDLE handle)
{
	int lsb,msb;
	
	//Do not modified the read order (lsb first)
	lsb = RegGetField(handle,ERRCNTLSB);
	msb = RegGetField(handle,ERRCNTMSB);
	return (MAKEWORD(msb,lsb));
}

void RegSetErrorCount(DEMOD_HANDLE handle, int Value)
{

	RegSetField(handle,ERRCNTMSB,MSB(Value));
	RegSetField(handle,ERRCNTLSB,LSB(Value));
}






/*
**
**------------------------------------------------------------------------------
**
**								INT32 GetRollOff(void)
**
**  Simple function whichs read the register 00h  bit bit1 and which sets
**  corresponding Nyquist filter roll-off value.
**------------------------------------------------------------------------------
**
*/
int  RegGetRollOff(DEMOD_HANDLE handle)
{

	if ( RegGetField(handle,NYQUISTFILTER)==1 )
		return 20;
	else
		return 35;
}
/*
**
*/
void  RegSetRollOff(DEMOD_HANDLE handle, INT32 _Value)
{

	if(_Value == 35)
		RegSetField(handle,NYQUISTFILTER,0);
	else
		RegSetField(handle,NYQUISTFILTER,1);
}


long BinaryFloatDiv(long n1, long n2, INT32 precision)
{
	INT32 i=0;
	long result=0;
	
	/*	division de N1 par N2 avec N1<N2	*/
	while(i<=precision) /*	n1>0	*/
	{
		if(n1<n2)
		{
			result*=2;      
			n1*=2;
		}
		else
		{
			result=result*2+1;
			n1=(n1-n2)*2;
		}
		i++;
	}
	
	return result;
}



/*****************************************************
**FUNCTION	::	CalcSymbolRate
**ACTION	::	Compute symbol frequency
**PARAMS IN	::	Hbyte	->	High order byte
**				Mbyte	->	Mid byte
**				Lbyte	->	Low order byte
**PARAMS OUT::	NONE
**RETURN	::	Symbol frequency
*****************************************************/
long CalcSymbolRate(DEMOD_HANDLE handle, INT32 Hbyte,INT32 Mbyte,INT32 Lbyte)
{
	long Ltmp,Ltmp2;
	long Mclk;

	Mclk =  RegGetMasterFreq(handle) / 4096L;	/* Fm_clk*10/2^20 */
	Ltmp = (((long)Hbyte<<12)+((long)Mbyte<<4))/16;
	Ltmp *= Mclk;
	Ltmp /=16;
	Ltmp2=((long)Lbyte*Mclk)/256;     
	Ltmp+=Ltmp2;
	
	return Ltmp;
}

long RegSetSymbolRate(DEMOD_HANDLE handle, long SymbolRate)
{
	unsigned long Result;
	long MasterClock;
	
	/*
	** in order to have the maximum precision, the symbol rate entered into
	** the chip is computed as the closest value of the "true value".
	** In this purpose, the symbol rate value is rounded (1 is added on the bit
	** below the LSB )
	*/
	MasterClock=RegGetMasterFreq(handle);  
	Result = BinaryFloatDiv(SymbolRate,MasterClock,20);       
	
	FieldSetVal(handle,SYMB_FREQH,(int)((Result>>12)&0xFF));
	FieldSetVal(handle,SYMB_FREQM,(int)((Result>>4)&0xFF));
	FieldSetVal(handle,SYMB_FREQL,(int)(Result&0x0F));
	
	RegSetRegisters(handle,R_SFRH,3);     
	
	return(SymbolRate) ;
}

/*****************************************************
**FUNCTION	::	RegGetSymbolRate
**ACTION	::	Return the symbol rate
**PARAMS IN	::	NONE	
**PARAMS OUT::	NONE
**RETURN	::	Symbol rate
*****************************************************/
long RegGetSymbolRate(DEMOD_HANDLE handle)
{
	RegGetRegisters(handle,R_SFRH,3);
	
	return CalcSymbolRate(handle,FieldGetVal(handle,SYMB_FREQH),
							FieldGetVal(handle,SYMB_FREQM),
							FieldGetVal(handle,SYMB_FREQL)); 	
}

/*****************************************************
**FUNCTION	::	RegIncrSymbolRate
**ACTION	::	add a correction to the symbol rate
**PARAMS IN	::	correction	-> correction	
**PARAMS OUT::	NONE
**RETURN	::	New symbol rate
*****************************************************/
long RegIncrSymbolRate(DEMOD_HANDLE handle, long correction)
{
	long Ltmp;
	
	RegGetRegisters(handle,R_SFRH,3);
	
	Ltmp = (long)FieldGetVal(handle,SYMB_FREQH)<<12;    
	Ltmp += (long)FieldGetVal(handle,SYMB_FREQM)<<4;
	Ltmp += FieldGetVal(handle,SYMB_FREQL);

	Ltmp += correction;

	FieldSetVal(handle,SYMB_FREQH,(INT16)((Ltmp>>12)&0xFF));
	FieldSetVal(handle,SYMB_FREQM,(INT16)((Ltmp>>4)&0xFF));
	FieldSetVal(handle,SYMB_FREQL,(INT16)(Ltmp&0x0F));
	
	RegSetRegisters(handle,R_SFRH,3);     
	
	return	RegGetSymbolRate(handle);
}

/*****************************************************
**FUNCTION	::	CalcAGC1TimeConstant
**ACTION	::	compute AGC1 time constant
**PARAMS IN	::	m1			->	AGC1 reference value   
**				fm			->	Master clock frequency (MHz)
**				betaagc1	->	BeatAgc1
**PARAMS OUT::	NONE
**RETURN	::	AGC1 time constant (us)
*****************************************************/
long CalcAGC1TimeConstant(INT32 m1,long fm,INT32 betaagc1)
{
	long  Tagc1;
	
	if((m1==0)||(fm==0)) 
		return(0);

	Tagc1 = 67108864L;			/*	2^26	*/
	Tagc1 /= PowOf2(betaagc1);	/*	2^betaagc1	*/
	Tagc1 /= m1;
	Tagc1 /= (fm/10000);		/*	Result is in mS*10	*/
	
	return Tagc1;
}

/*****************************************************
**FUNCTION	::	RegGetAGC1TimeConstant
**ACTION	::	compute AGC1 time constant
**PARAMS IN	::	NONE
**PARAMS OUT::	NONE
**RETURN	::	AGC2 time constant
*****************************************************/
long RegGetAGC1TimeConstant(DEMOD_HANDLE handle)
{
	long fm;
	
	RegGetOneRegister(handle,R_AGC1C);
	RegGetOneRegister(handle,R_AGC1R);    
	RegGetRegisters(handle,R_RCR,2);	/*	RCR,MCR		*/
	
	fm=CalcMasterClkFrequency(handle,FieldGetVal(handle,STDBY),
								FieldGetVal(handle,DIRCLK),
								FieldGetVal(handle,K),
								FieldGetVal(handle,M),
								FieldGetVal(handle,P));
								
	return CalcAGC1TimeConstant(FieldGetVal(handle,AGC1_REF),
								fm,
								FieldGetVal(handle,BETA_AGC1));    
}

/****************************************************
**FUNCTION	::	CalcAGC2TimeConstant
**ACTION	::	compute AGC2 time constant
**PARAMS IN	::	agc2coef	->	AGC2 coeficient
**				m1			->	AGC1 reference value
**				fm			->	Master clock frequency (MHz)
**PARAMS OUT::	NONE
**RETURN	::	AGC2 time constant (ns)
*****************************************************/
long CalcAGC2TimeConstant(long agc2coef, long m1, long fm)
{
	long	BetaAgc2,
			Tagc2=0;
	
	if((m1!=0) && (fm!=0))
	{
		BetaAgc2=PowOf2((agc2coef-1)*2);
		
		Tagc2=60000L*10000L;
		Tagc2/=(fm/1000); 
		Tagc2/=m1*BetaAgc2; 
		Tagc2*=100;
	}
	
	return Tagc2;
}
  
/*****************************************************
**FUNCTION	::	RegGetAGC2TimeConstant
**ACTION	::	compute AGC2 time constant
**PARAMS IN	::	agc2coef	->	AGC2 coeficient
**				m1			->	AGC1 reference value
**				fm			->	Master clock frequency
**PARAMS OUT::	NONE
**RETURN	::	AGC2 time constant
*****************************************************/
long RegGetAGC2TimeConstant(DEMOD_HANDLE handle)
{
	long fm;
	
	RegGetOneRegister(handle,R_AGC1R);
	RegGetOneRegister(handle,R_AGC2O);
	RegGetOneRegister(handle,R_RCR);
	RegGetOneRegister(handle,R_MCR);
	
	fm=CalcMasterClkFrequency(handle,FieldGetVal(handle,STDBY),
								FieldGetVal(handle,DIRCLK),
								FieldGetVal(handle,K),
								FieldGetVal(handle,M),
								FieldGetVal(handle,P));
								
	return CalcAGC2TimeConstant(FieldGetVal(handle,AGC2COEF),
								FieldGetVal(handle,AGC1_REF),
								fm);    
}

/*****************************************************
**FUNCTION	::	RegGetTimingLocked
**ACTION	::	Check the state of the timing loop
**PARAMS IN	::	agc2coef	->	AGC2 coeficient
**				m1			->	AGC1 reference value
**				fm			->	Master clock frequency
**PARAMS OUT::	NONE
**RETURN	::	Boolean ->true if timing loop is locked
*****************************************************/
INT32 RegGetTimingLocked(DEMOD_HANDLE handle)
{
	INT32 locked;
    long TimingFreq;
		
	unsigned char Sr[3];
		
	locked=RegGetField(handle,TLIR);
	
	if(locked>42)
	{
		if(locked>48)
			locked = 1;
		else
		{
			RegGetRegisters(handle,R_SFRH,3);	/*	Read symbol rate registers	*/
			
			Sr[0] = FieldGetVal(handle,SYMB_FREQH);	/*	Save symbol rate registers	*/    
			Sr[1] = FieldGetVal(handle,SYMB_FREQM);  
			Sr[2] = FieldGetVal(handle,SYMB_FREQL);  
			
			TimingFreq = CalcSymbolRate(handle,Sr[0],Sr[1],Sr[2]); 
			RegSetSymbolRate(handle,TimingFreq-(TimingFreq/100));
			
			if(RegGetField(handle,TLIR) < locked)
				locked = 1;
			else 
				locked = 0;
			
			FieldSetVal(handle,SYMB_FREQH,Sr[0]);
			FieldSetVal(handle,SYMB_FREQM,Sr[1]);
			FieldSetVal(handle,SYMB_FREQL,Sr[2]);
	
			RegSetRegisters(handle,R_SFRH,3);	/*	Write symbol rate registers	*/      
		}
	}
	else locked = 0;

	return locked;
}

/*=====================================================
**=====================================================
**||||                                             ||||
**||||           F22 GENERATION FACILITIES         ||||
**||||                                             ||||
**=====================================================
**===================================================*/
void  RegF22On(void)
{
	/*RegSetField(F22OUTPUT,1); */
}

void  RegF22Off(void)
{
	/*RegSetField(F22OUTPUT,0);	*/
}


/*=====================================================
**=====================================================
**||||                                             ||||
**||||           TRIGGER FACILITIES                ||||
**||||                                             ||||
**=====================================================
**===================================================*/
void RegTriggerOn(DEMOD_HANDLE handle)
{
	DEMOD_SAT_DATA *sDemodData = (DEMOD_SAT_DATA*)handle;
	if(sDemodData->RegTrigger == YES)
		/* I/O = 1 */
		RegSetField(handle,DACMODE,1);
}

void RegTriggerOff(DEMOD_HANDLE handle)
{
	DEMOD_SAT_DATA *sDemodData = (DEMOD_SAT_DATA*)handle;
	if(sDemodData->RegTrigger == YES)
		/* I/O = 0 */
		RegSetField(handle,DACMODE,0); 
}

FLAG_ RegGetTrigger(DEMOD_HANDLE handle)
{
	DEMOD_SAT_DATA *sDemodData = (DEMOD_SAT_DATA*)handle;
	return(sDemodData->RegTrigger);
}

void RegSetTrigger(DEMOD_HANDLE handle,FLAG_ _Trigger)
{
	DEMOD_SAT_DATA *sDemodData = (DEMOD_SAT_DATA*)handle;
	sDemodData->RegTrigger = _Trigger;
}

#endif // SATELLITE_299

#endif // FTA_SUPPORT

⌨️ 快捷键说明

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