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

📄 mxl5007.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
字号:
/*
 MxL5007 Source Code : V4.1.3
 
 Copyright, Maxlinear, Inc.
 All Rights Reserved
 
 File Name:      MxL5007.c

 Description: The source code is for MxL5007 user to quickly integrate MxL5007 into their software.
	There are two functions the user can call to generate a array of I2C command that's require to
	program the MxL5007 tuner. The user should pass an array pointer and an integer pointer in to the 
	function. The funciton will fill up the array with format like follow:
	
		addr1
		data1
		addr2
		data2
		...
	
	The user can then pass this array to their I2C function to perform progromming the tuner. 
*/
//#include "StdAfx.h"
#include "MxL5007_Common.h"
#include "MxL5007.h"



UINT32 MxL5007_Init(UINT8* pArray,				// a array pointer that store the addr and data pairs for I2C write
					UINT32* Array_Size,			// a integer pointer that store the number of element in above array
					UINT8 Mode,				
					SINT32 IF_Diff_Out_Level,		 
					UINT32 Xtal_Freq_Hz,			
					UINT32 IF_Freq_Hz,				
					UINT8 Invert_IF,											
					UINT8 Clk_Out_Enable,    
					UINT8 Clk_Out_Amp													
					)
{
	
	UINT32 Reg_Index=0;
	UINT32 Array_Index=0;

	IRVType IRV_Init[]=
	{
		//{ Addr, Data}	
		{ 0x02, 0x06}, 
		{ 0x03, 0x48},
		{ 0x05, 0x04},  
		{ 0x06, 0x10}, 
		{ 0x2E, 0x15},  //Override
		{ 0x30, 0x10},  //Override
		{ 0x45, 0x58},  //Override
		{ 0x48, 0x19},  //Override
		{ 0x52, 0x03},  //Override
		{ 0x53, 0x44},  //Override
		{ 0x6A, 0x4B},  //Override
		{ 0x76, 0x00},  //Override
		{ 0x78, 0x18},  //Override
		{ 0x7A, 0x17},  //Override
		{ 0x85, 0x06},  //Override		
		{ 0x01, 0x01}, //TOP_MASTER_ENABLE=1
		{ 0, 0}
	};


	IRVType IRV_Init_Cable[]=
	{
		//{ Addr, Data}	
		{ 0x02, 0x06}, 
		{ 0x03, 0x48},
		{ 0x05, 0x04},  
		{ 0x06, 0x10},  
		{ 0x09, 0x3F},  
		{ 0x0A, 0x3F},  
		{ 0x0B, 0x3F},  
		{ 0x2E, 0x15},  //Override
		{ 0x30, 0x10},  //Override
		{ 0x45, 0x58},  //Override
		{ 0x48, 0x19},  //Override
		{ 0x52, 0x03},  //Override
		{ 0x53, 0x44},  //Override
		{ 0x6A, 0x4B},  //Override
		{ 0x76, 0x00},  //Override
		{ 0x78, 0x18},  //Override
		{ 0x7A, 0x17},  //Override
		{ 0x85, 0x06},  //Override	
		{ 0x01, 0x01}, //TOP_MASTER_ENABLE=1
		{ 0, 0}
	};
	//edit Init setting here

	PIRVType myIRV = IRV_Init;

	switch(Mode)
	{
	case MxL_MODE_ISDBT: //ISDB-T Mode	
		myIRV = IRV_Init;
		SetIRVBit(myIRV, 0x06, 0x1F, 0x10);  
		break;
	case MxL_MODE_DVBT: //DVBT Mode			
		myIRV = IRV_Init;
		SetIRVBit(myIRV, 0x06, 0x1F, 0x11);  
		break;
	case MxL_MODE_ATSC: //ATSC Mode			
		myIRV = IRV_Init;
		SetIRVBit(myIRV, 0x06, 0x1F, 0x12);  
		break;	
	case MxL_MODE_CABLE:						
		myIRV = IRV_Init_Cable;
		SetIRVBit(myIRV, 0x09, 0xFF, 0xC1);	
		SetIRVBit(myIRV, 0x0A, 0xFF, 8-IF_Diff_Out_Level);	
		SetIRVBit(myIRV, 0x0B, 0xFF, 0x17);							
		break;
	

	}

	switch(IF_Freq_Hz)
	{
	case MxL_IF_4_MHZ:
		SetIRVBit(myIRV, 0x02, 0x0F, 0x00); 		
		break;
	case MxL_IF_4_5_MHZ: //4.5MHz
		SetIRVBit(myIRV, 0x02, 0x0F, 0x02); 		
		break;
	case MxL_IF_4_57_MHZ: //4.57MHz
		SetIRVBit(myIRV, 0x02, 0x0F, 0x03); 
		break;
	case MxL_IF_5_MHZ:
		SetIRVBit(myIRV, 0x02, 0x0F, 0x04); 
		break;
	case MxL_IF_5_38_MHZ: //5.38MHz
		SetIRVBit(myIRV, 0x02, 0x0F, 0x05); 
		break;
	case MxL_IF_6_MHZ: 
		SetIRVBit(myIRV, 0x02, 0x0F, 0x06); 
		break;
	case MxL_IF_6_28_MHZ: //6.28MHz
		SetIRVBit(myIRV, 0x02, 0x0F, 0x07); 
		break;
	case MxL_IF_9_1915_MHZ: //9.1915MHz
		SetIRVBit(myIRV, 0x02, 0x0F, 0x08); 
		break;
	case MxL_IF_35_25_MHZ:
		SetIRVBit(myIRV, 0x02, 0x0F, 0x09); 
		break;
	case MxL_IF_36_15_MHZ:
		SetIRVBit(myIRV, 0x02, 0x0F, 0x0a); 
		break;
	case MxL_IF_44_MHZ:
		SetIRVBit(myIRV, 0x02, 0x0F, 0x0B); 
		break;
	}

	if(Invert_IF) 
		SetIRVBit(myIRV, 0x02, 0x10, 0x10);   //Invert IF
	else
		SetIRVBit(myIRV, 0x02, 0x10, 0x00);   //Normal IF


	switch(Xtal_Freq_Hz)
	{
	case MxL_XTAL_16_MHZ:
		SetIRVBit(myIRV, 0x03, 0xF0, 0x00);  //select xtal freq & Ref Freq
		SetIRVBit(myIRV, 0x05, 0x0F, 0x00);
		break;
	case MxL_XTAL_20_MHZ:
		SetIRVBit(myIRV, 0x03, 0xF0, 0x10);
		SetIRVBit(myIRV, 0x05, 0x0F, 0x01);
		break;
	case MxL_XTAL_20_25_MHZ:
		SetIRVBit(myIRV, 0x03, 0xF0, 0x20);
		SetIRVBit(myIRV, 0x05, 0x0F, 0x02);
		break;
	case MxL_XTAL_20_48_MHZ:
		SetIRVBit(myIRV, 0x03, 0xF0, 0x30);
		SetIRVBit(myIRV, 0x05, 0x0F, 0x03);
		break;
	case MxL_XTAL_24_MHZ:
		SetIRVBit(myIRV, 0x03, 0xF0, 0x40);
		SetIRVBit(myIRV, 0x05, 0x0F, 0x04);
		break;
	case MxL_XTAL_25_MHZ:
		SetIRVBit(myIRV, 0x03, 0xF0, 0x50);
		SetIRVBit(myIRV, 0x05, 0x0F, 0x05);
		break;
	case MxL_XTAL_25_14_MHZ:
		SetIRVBit(myIRV, 0x03, 0xF0, 0x60);
		SetIRVBit(myIRV, 0x05, 0x0F, 0x06);
		break;
	case MxL_XTAL_27_MHZ:
		SetIRVBit(myIRV, 0x03, 0xF0, 0x70);
		SetIRVBit(myIRV, 0x05, 0x0F, 0x07);
		break;
	case MxL_XTAL_28_8_MHZ: 
		SetIRVBit(myIRV, 0x03, 0xF0, 0x80);
		SetIRVBit(myIRV, 0x05, 0x0F, 0x08);
		break;
	case MxL_XTAL_32_MHZ:
		SetIRVBit(myIRV, 0x03, 0xF0, 0x90);
		SetIRVBit(myIRV, 0x05, 0x0F, 0x09);
		break;
	case MxL_XTAL_40_MHZ:
		SetIRVBit(myIRV, 0x03, 0xF0, 0xA0);
		SetIRVBit(myIRV, 0x05, 0x0F, 0x0A);
		break;
	case MxL_XTAL_44_MHZ:
		SetIRVBit(myIRV, 0x03, 0xF0, 0xB0);
		SetIRVBit(myIRV, 0x05, 0x0F, 0x0B);
		break;
	case MxL_XTAL_48_MHZ:
		SetIRVBit(myIRV, 0x03, 0xF0, 0xC0);
		SetIRVBit(myIRV, 0x05, 0x0F, 0x0C);
		break;
	case MxL_XTAL_49_3811_MHZ:
		SetIRVBit(myIRV, 0x03, 0xF0, 0xD0);
		SetIRVBit(myIRV, 0x05, 0x0F, 0x0D);
		break;	
	}

	if(!Clk_Out_Enable) //default is enable 
		SetIRVBit(myIRV, 0x03, 0x08, 0x00);   

	//Clk_Out_Amp
	SetIRVBit(myIRV, 0x03, 0x07, Clk_Out_Amp);   

	//Generate one Array that Contain Data, Address
	while (myIRV[Reg_Index].Num || myIRV[Reg_Index].Val)
	{
		pArray[Array_Index++] = myIRV[Reg_Index].Num;
		pArray[Array_Index++] = myIRV[Reg_Index].Val;
		Reg_Index++;
	}
	    
	*Array_Size=Array_Index;
	return 0;
}


UINT32 MxL5007_RFTune(UINT8* pArray, UINT32* Array_Size, UINT32 RF_Freq, UINT8 BWMHz)
{
	IRVType IRV_RFTune[]=
	{
	//{ Addr, Data}
		{ 0x0F, 0x00},  //abort tune
		{ 0x0C, 0x15},
		{ 0x0D, 0x40},
		{ 0x0E, 0x0E},	
		{ 0x1F, 0x87},  //Override
		{ 0x20, 0x1F},  //Override
		{ 0x21, 0x87},  //Override
		{ 0x22, 0x1F},  //Override		
		{ 0x80, 0x01},  //Freq Dependent Setting
		{ 0x0F, 0x01},	//start tune
		{ 0, 0}
	};

	UINT32 dig_rf_freq=0;
	UINT32 temp;
	UINT32 Reg_Index=0;
	UINT32 Array_Index=0;
	UINT32 i;
	UINT32 frac_divider = 1000000;

	switch(BWMHz)
	{
	case MxL_BW_6MHz: //6MHz
			SetIRVBit(IRV_RFTune, 0x0C, 0x3F, 0x15);  //set DIG_MODEINDEX, DIG_MODEINDEX_A, and DIG_MODEINDEX_CSF
		break;
	case MxL_BW_7MHz: //7MHz
			SetIRVBit(IRV_RFTune, 0x0C, 0x3F, 0x2A);
		break;
	case MxL_BW_8MHz: //8MHz
			SetIRVBit(IRV_RFTune, 0x0C, 0x3F, 0x3F);
		break;
	}


	//Convert RF frequency into 16 bits => 10 bit integer (MHz) + 6 bit fraction
	dig_rf_freq = RF_Freq / MHz;
	temp = RF_Freq % MHz;
	for(i=0; i<6; i++)
	{
		dig_rf_freq <<= 1;
		frac_divider /=2;
		if(temp > frac_divider)
		{
			temp -= frac_divider;
			dig_rf_freq++;
		}
	}

	//add to have shift center point by 7.8124 kHz
	if(temp > 7812)
		dig_rf_freq ++;
    	
	SetIRVBit(IRV_RFTune, 0x0D, 0xFF, (UINT8)dig_rf_freq);
	SetIRVBit(IRV_RFTune, 0x0E, 0xFF, (UINT8)(dig_rf_freq>>8));

	if (RF_Freq >=333*MHz)
		SetIRVBit(IRV_RFTune, 0x80, 0x40, 0x40);

	//Generate one Array that Contain Data, Address 
	while (IRV_RFTune[Reg_Index].Num || IRV_RFTune[Reg_Index].Val)
	{
		pArray[Array_Index++] = IRV_RFTune[Reg_Index].Num;
		pArray[Array_Index++] = IRV_RFTune[Reg_Index].Val;
		Reg_Index++;
	}
    
	*Array_Size=Array_Index;
	
	return 0;
}

//local functions called by Init and RFTune
UINT32 SetIRVBit(PIRVType pIRV, UINT8 Num, UINT8 Mask, UINT8 Val)
{
	while (pIRV->Num || pIRV->Val)
	{
		if (pIRV->Num==Num)
		{
			pIRV->Val&=~Mask;
			pIRV->Val|=Val;
		}
		pIRV++;

	}	
	return 0;
}

⌨️ 快捷键说明

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