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

📄 mt352.c

📁 PHILIPS1316 tuner 驱动软件用于PHILIPS TDM1316 DVB-T tuner。经过实际测试。
💻 C
📖 第 1 页 / 共 5 页
字号:

	TunerByte4=0x86;//DNOS204ZH101A
//	TunerByte4=0x84;//DNOS204ZH102A
	/* ChargePump Setting version 1*/
	if(dwTunerFreq < 546001)
	{/*3 --> 125uA (extended)*/ //CP=1;
		TunerByte4=TunerByte4 | 0x38;
	}
	else if(dwTunerFreq < 834001)
	{/*4 --> 250uA (extended)*/ //CP=2;
		TunerByte4=TunerByte4 | 0x70;
	}
	else if(dwTunerFreq < 884001)
	{/*5 --> 650uA (extended)*/ //CP=3;
		TunerByte4=TunerByte4 | 0x78;
	}
	else
	{
	printf("Error Input Centerfreq");
	}

	if(dwTunerFreq < 173251)
	{
		TunerByte5 = 0x01;
	}
	else if(dwTunerFreq < 470251)
	{
		TunerByte5 = 0x01;
	}
	else if(dwTunerFreq < 884000)
	{
		TunerByte5 = 0x08;
	}
	else
	{
		printf("Error Input Centerfreq");
	}

	dwTunerFreq=(TunerByte4<<8) + TunerByte5;
	if (!Tnim_WriteRegisterValue(psTnim,MT352_TUNER_CONT,2,dwTunerFreq))//MT352_TUNER_CONT=0x5B
		return FALSE;

	/* calculate LO frequency*/
	dwTunerFreq=FREQUENCY(dwBWandFreqkHz);/* kHz*/
	/* IF offset*/
	if ((psTnim->psTunerInfo->Settings) & TUNER_LO_INJECTION)//TUNER_LO_INJECTION  0x02
		dwTunerFreq -= psTnim->psTunerInfo->IF1kHz;      //Setting(SEM)==0x01
	else
		dwTunerFreq += psTnim->psTunerInfo->IF1kHz;

	/* convert frequency to divider ratio*/
//	if (psTnim->psTunerTable[ucIndex-1].FcompkHzx100==0) return FALSE;//FcompKHzx100==16667
	dwTunerFreq = (dwTunerFreq * 1000) / Refer_Value;//Refer_Value = 16667
	dwTunerFreq +=5;dwTunerFreq /=10;     /*round off the result*/

	/* program the registers*/
	if (!Tnim_WriteRegisterValue(psTnim,MT352_CHAN_START,2,dwTunerFreq))
		return FALSE;
	if (!Tnim_WriteRegisterValue(psTnim,MT352_CHAN_STOP,2,dwTunerFreq))
		return FALSE;

	return TRUE;
}
#endif


#ifdef SEM_DNOS204ZH102A
bool8 Tnim_ProgramTuner(PSTNIMCTL psTnim,u32 dwBWandFreqkHz)
{
	u8 ucIndex;
	u32 dwTunerFreq;
	u16 TunerByte2,TunerByte3,TunerByte4,TunerByte5;
	u32 Refer_Value;

	Refer_Value=16667;
	/*address*/
	#if 0
	if (!RegisterWrite2wb(psTnim->DeviceID,MT352_TUNER_ADDR,//MT352_TUNER_ADDR==0x58
		&(psTnim->psTunerInfo->Address),1)) 
			return FALSE;//psTnim->psTunerInfo->Address==0xC2
	#endif

	if (!RegisterWrite2wb(psTnim->DeviceID,MT352_TUNER_ADDR,//MT352_TUNER_ADDR==0x58
		&(psTnim->psTunerInfo->Address),1)) 
			return FALSE;//psTnim->psTunerInfo->Address==0xC2

	/* Control Bytes*/
//	dwTunerFreq= (FREQUENCY(dwBWandFreqkHz))/1000; /* RF (MHz)*/
	dwTunerFreq= (FREQUENCY(dwBWandFreqkHz)); /* RF (KHz)*/
	//FREQUENCY(dwBWfreq) ((dwBWfreq) & 0x00FFFFFF)

//	TunerByte4=0x86;//DNOS204ZH101A
	TunerByte4=0x84;//DNOS204ZH102A
	/* ChargePump Setting version 1*/
	if(dwTunerFreq < 370001)
	{/*3 --> 125uA (extended)*/
		TunerByte4=TunerByte4 | 0x38;
	}
	else if(dwTunerFreq < 450001)
	{/*4 --> 250uA (extended)*/
		TunerByte4=TunerByte4 | 0x70;
	}
	else if(dwTunerFreq < 470001)
	{/*5 --> 650uA (extended)*/
		TunerByte4=TunerByte4 | 0x78;
	}
	else if(dwTunerFreq < 762000)
	{/*3 --> 125uA (extended)*/
		TunerByte4=TunerByte4 | 0x38;
	}
	else if(dwTunerFreq < 834000)
	{/*4 --> 250uA (extended)*/
		TunerByte4=TunerByte4 | 0x70;
	}
	else if(dwTunerFreq < 884001)
	{/*5 --> 650uA (extended)*/
		TunerByte4=TunerByte4 | 0x78;
	}
	else
	{
	printf("Error Input Centerfreq");
	}

	if(dwTunerFreq < 173251)
	{
		TunerByte5 = 0x01;
	}
	else if(dwTunerFreq < 470251)
	{
		TunerByte5 = 0x02;
	}
	else if(dwTunerFreq < 884000)
	{
		TunerByte5 = 0x08;
	}
	else
	{
		printf("Error Input Centerfreq");
	}

	dwTunerFreq=(TunerByte4<<8) + TunerByte5;
	if (!Tnim_WriteRegisterValue(psTnim,MT352_TUNER_CONT,2,dwTunerFreq))//MT352_TUNER_CONT=0x5B
		return FALSE;

	/* calculate LO frequency*/
	dwTunerFreq=FREQUENCY(dwBWandFreqkHz);/* kHz*/
	/* IF offset*/
	if ((psTnim->psTunerInfo->Settings) & TUNER_LO_INJECTION)//TUNER_LO_INJECTION  0x02
		dwTunerFreq -= psTnim->psTunerInfo->IF1kHz;      //Setting(SEM)==0x01
	else
		dwTunerFreq += psTnim->psTunerInfo->IF1kHz;

	/* convert frequency to divider ratio*/
//	if (psTnim->psTunerTable[ucIndex-1].FcompkHzx100==0) return FALSE;//FcompKHzx100==16667
	dwTunerFreq = (dwTunerFreq * 1000) / Refer_Value;//Refer_Value = 16667
	dwTunerFreq +=5;dwTunerFreq /=10;     /*round off the result*/

	/* program the registers*/
	if (!Tnim_WriteRegisterValue(psTnim,MT352_CHAN_START,2,dwTunerFreq))
		return FALSE;
	if (!Tnim_WriteRegisterValue(psTnim,MT352_CHAN_STOP,2,dwTunerFreq))
		return FALSE;

	return TRUE;
}
#endif

#ifdef SEM_TDTC8250
//xd_li for Jeja 8250 tuner
//7M 8M switch
bool8 TnimBandSwitching(PSTNIMCTL psTnim, u8 ucBW)
{
	u8 Band_7M=0x83, Band_8M=0x8B;

	/*Switching SAW 7/8M Band Control*/
	if(ucBW==7)
	{
		//psTnim->pfRegisterWrite(psTnim->DeviceID, MT352_GPP_CTL, &Band_7M, 1);
		RegisterWrite2wb(psTnim->DeviceID,MT352_GPP_CTL, &Band_7M,1);
	}else if(ucBW==8)
	{
		//psTnim->pfRegisterWrite(psTnim->DeviceID, MT352_GPP_CTL, &Band_8M, 1);
		RegisterWrite2wb(psTnim->DeviceID,MT352_GPP_CTL, &Band_8M,1);
	}
	/*Switching SAW 7/8M Band Control End*/
	return TRUE;
}
//xd_li for Jeja 8250 tuner
#endif

/************************Zarlink Semiconductor*********************************
*   Name:Tnim_ProgramBW()
*   Purpose:Programs the TRL register according to bandwidth
*   Remarks:Also programs NON20_8 bit as required
*	    TRL_nom_rate= 2^16 (64/7) * (ucBW/8) / Fadc(MHz)
*		        = 2^16*64*3000/7/8 * ucBW/Fadc(kHzx3)
*			=224694857.143 *ucBW/Fadc(kHzx3)
*   Inputs: Bandwidth (Mhz)
*   Outputs:FALSE if write failed
********************************************************************************/
bool8 Tnim_ProgramBW(PSTNIMCTL psTnim,u8 ucBW)
{
	u32 dwTemp;
	u8 ucBuffer;
	u16 wADCclock;


#ifdef SEM_TDTC8250
	TnimBandSwitching(psTnim, ucBW);
#endif

	wADCclock = Tnim_ADCClock_x3(psTnim);
	dwTemp = 224694857;
	dwTemp *= ucBW; /* still less than 2^32*/
	dwTemp += wADCclock/2; /* for rounding*/
	dwTemp /= wADCclock;

	if (!Tnim_WriteRegisterValue(psTnim,MT352_TRL_NOM_RATE,2,dwTemp))
		return FALSE;

	psTnim->ucBW = ucBW;
	/* NON20_8 is set if Xtal=20.48 and */
	if (!MT352_READ(MT352_CLOCK_CTL)) 
		return FALSE;

	if ((psTnim->Xtal==0) && (ucBW ==8))
		ucBuffer &=~MT352_CLKCTL_NON208;
	else
		ucBuffer |= MT352_CLKCTL_NON208;

	return MT352_WRITE(MT352_CLOCK_CTL);
}

/************************Zarlink Semiconductor*********************************
*   Name:Tnim_WriteRegisterValue()
*   Purpose:writes a value (up to 32 bits) to a number of contiguous registers
*   Remarks:Takes one or more bytes from the passed value and writes to chip
*   Inputs: reg: address of first register to write
*           cound: number of bytes to write (+ve = MSB first, -ve =LSB first)
*           value: 32 bit varibale containing data to write
*   Outputs:status
********************************************************************************/
bool8 Tnim_WriteRegisterValue(PSTNIMCTL psTnim, u8 byReg, s8 cCount,u32 dwValue)
{
	u8 Buffer[4];/* since the biggest dwValue is 4 Uint8Ts */
	s8 counter;
	
	if ((u8)ABSVAL(cCount)>sizeof(Buffer)) 
		return FALSE;
	if (cCount>0) /* MSB first */
	{
		for (counter=(s8)(cCount-1);counter>=0;counter--)
		{
			Buffer[counter]= (u8) (dwValue & 0xFF);
			dwValue>>=8; 
		}
	}
	else /* LSB first */
	{
		for (counter=0;counter<cCount;counter++)
		{
			Buffer[counter]= (u8) (dwValue & 0xFF);
			dwValue>>=8; 
		}
	}

	return RegisterWrite2wb(psTnim->DeviceID,byReg, Buffer,(u8)ABSVAL(cCount));
}

/************************Zarlink Semiconductor*********************************
*   Name:Tnim_ADCClock_x3()
*   Purpose:Determines the clock frequency from the settings
*   Remarks: 2 ADC rates are available. If tuner IF is 44.75MHz
*      and the output is at IF1, we select the lower frequency (~19.5 MHz)
*      otherwise we use the higher 20.5MHz.
*      NOTE: this means that the 19.5 Xtal option is only suitable for
*      4.57 and 44.75 MHz inputs.
*   Inputs:STnimControl Structure
*   Outputs:16bit frequency kHz x3
********************************************************************************/
u16 Tnim_ADCClock_x3(PSTNIMCTL psTnim)
{
	return g_tnim2_wADCClock_x3[psTnim->Xtal]//When psTnim->Xtal==0, Xtal=20.48
		[((psTnim->psTunerInfo->IF1kHz>40000) && ((psTnim->psTunerInfo->Settings) & TUNER_IF1_OUTPUT))?1:0]
		[psTnim->AdcPll]; //61440 wonki
}

/************************Zarlink Semiconductor*********************************
*   Name:TnimReadSNRx8()
*   Purpose:Read the signal to noise ratio
*   Remarks:returns 0 if not locked
*   Inputs:
*   Outputs: snr in dB x8
********************************************************************************/
u8 TnimReadSNRx8(PSTNIMCTL psTnim)
{
	u8 ucBuffer =0;
	TNIM_ENTRYB;

	if(Tnim_IsLocked(psTnim))
	{
		if (!MT352_READ(MT352_SNR))	 
			ucBuffer=0;//MT352_SNR=0x09
	}

	TNIM_EXIT;

	return ucBuffer;
}

/************************Zarlink Semiconductor*********************************
*   Name: Tnim_IsLocked()
*   Purpose:Reads lock status from MT352
*   Remarks:
*   Inputs:
*   Outputs:TRUE if locked
********************************************************************************/
bool8 Tnim_IsLocked(PSTNIMCTL psTnim)
{
	u8 ucBuffer;

	if (MT352_READ(MT352_CONFIG))//MT352_CONFIG=0x8A
	{
		if ((ucBuffer & MT352_CONF_ENABLE)==MT352_CONF_ENABLE)//MT352_CONF_ENABLE=0x20
		{
			if (MT352_READ(MT352_FECSTAT))//MT352_FECSTAT=0x01
			{
				return (ucBuffer & MT352_FECSTAT_LOCKED)==MT352_FECSTAT_LOCKED;//MT352_FECSTAT_LOCKED=0x06
			}
		}
	}
	return FALSE;
}

/************************Zarlink Semiconductor*********************************
*   Name:TnimReadAGC()
*   Purpose:Read the AGC values
*   Remarks:
*   Inputs:
*   Outputs:
********************************************************************************/
bool8 TnimReadAGC(PSTNIMCTL psTnim,STnimAGC * psAGC)
{
	bool8 ret;
	u32 dwAGC;
	TNIM_ENTRYB;
	ret = Tnim_ReadRegisterValue(psTnim,MT352_AGC_GAIN,4,&dwAGC);//MT352_AGC_GAIN=0x12
	if (ret)
	{
		psAGC->wTotal = (u16) (dwAGC & 0x000FFF);
		psAGC->wRFsec = (u16) ((dwAGC>>12) & 0x3FF);
		psAGC->wIFpri = (u16) ((dwAGC>>22) & 0x3FF);
	}
	TNIM_EXIT;

	return ret;
}

/************************Zarlink Semiconductor*********************************
*   Name:Tnim_ReadRegisterValue()
*   Purpose:Reads Multibyte register values;
*   Remarks: packs up to 4 bytes (msb or lsb first) into a 32 bit result
*   Inputs: reg : address of first register
*           count : number of bytes to read +ve reads MSB first, -ve reads LSB first
*   Outputs: result 32bit unsigned value
********************************************************************************/
bool8 Tnim_ReadRegisterValue(PSTNIMCTL psTnim, u8 byReg,s8 cCount,u32 * pdwValue)
{
	u8 Buffer[4]={0,0,0,0};/* only 4 Uint8Ts allowed for up to u32*/
	s16 counter;
	u32 ans = 0;
	bool8 ret;

	if ((u8) ABSVAL(cCount)>sizeof(Buffer)) 
		return FALSE;

	ans =0;
	if (RegisterRead2wb(psTnim->DeviceID,byReg, Buffer,(u8)ABSVAL(cCount)))
	{
		if (cCount>0) /* MSB first */
		{
			for (counter=0;counter<cCount;counter++)
			{
				ans <<=8;
				ans +=(Buffer[counter]);
			}
			 *pdwValue = ans;
			ret = TRUE;
		}
		else	/* LSB first*/
		{
			for (counter=(u16)(-1-cCount);counter>=0;counter--)
			{
				ans <<=8;
				ans +=(Buffer[counter]);
			}
			 *pdwValue = ans;
			ret = TRUE;
		}
	}
	else
		ret = FALSE;

	return ret;
}


/************************Zarlink Semiconductor*********************************
*   Name:Tnim_Initialise()
*   Purpose:Initialise the MT352 after power up
*   Remarks:
*   Inputs:
*   Outputs:
********************************************************************************/
bool8 Tnim_Initialise(PSTNIMCTL psTnim)
{
	u8 ucBuffer;/* one byte buffer for now */
	/*Assume we have been hardware reset */

	/* set config register*/
	ucBuffer = MT352_CONF_ENABLE |
		   MT352_CONF_TEIEN |
		   MT352_CONF_BKERRINV |
		   MT352_CONF_MDOSWAP |
		   MT352_CONF_BG12;

	if (psTnim->MpegOff) 
		ucBuffer |=MT352_CONF_MPEGDIS;
	if (psTnim->MPEGserial) 
		ucBuffer |=MT352_CONF_BSO;

	if (psTnim->NoTEI)  
		ucBuffer &=~MT352_CONF_TEIEN;
	if (psTnim->NoBKERRinvert) 
		ucBuffer &= ~MT352_CONF_BKERRINV;
	/*psTnim->NoMD0swap=1*/
	if (psTnim->NoMDOswap) 
		ucBuffer &= ~MT352_CONF_MDOSWAP;//0x02
	if (psTnim->NoMPEGgap12) 
		ucBuffer &=~MT352_CONF_BG12;
		
	//printf("config=%x\n", ucBuffer); getch();
	//ucBuffer=0x2d
	if (! MT352_WRITE(MT352_CONFIG)) 
		return FALSE;//MT352_CONFIG=0x8A

	/* set clock mode*/
	ucBuffer = (u8)(Tnim_GetClockMode(psTnim)
		+psTnim->MPEGclkinEn?MT352_CLKCTL_MCLKINEN:0
		+psTnim->NoMPEGClkInv?0:MT352_CLKCTL_MCLKINV
		+MT352_CLKCTL_ADC_ENABLE);

	//printf("config=%x\n", ucBuffer);
	//ucBuffer=0x30
	if (! MT352_WRITE(MT352_CLOCK_CTL)) 
		return FALSE;//MT352_CLOCK_CTL=0x89

	/* delay around 200礢 use dummy read*/
	if (!MT352_READ(MT352_FECSTAT)) 
		return FALSE;

	/*reset*/
	ucBuffer=MT352_RESET_ALL;//0xFF
	if (! MT352_WRITE(MT352_RESET)) 
		return FALSE;//MT352_RESET=0x50

	/* Initialise ADC (only first byte needed)*/
	ucBuffer = MT352_ADC_CTL_INIT;//0x40
	if (! MT352_WRITE(MT352_ADC_CTL)) 
		return FALSE;//MT352_ADC_CTL=0x8E

	/*tuner AGC settings (10 bytes from AGC target onwards*/
	RegisterWrite2wb(psTnim->DeviceID,MT352_AGC_TARGET,psTnim->psTunerInfo->AGC,10);
					//MT352_AGC_TARGET=0x67

⌨️ 快捷键说明

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