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

📄 mt352.c

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

//===============================================================================
#if defined(SEM_TECC2349PG)|| defined(SEM_TDTC8250)
static u8 TrnAgc2Level(STnimAGC *pstAgc)
{
	u16 u16AGC;
    u8  u8Strength;

	u16AGC=pstAgc->wTotal;

	if ( u16AGC<=135 )
	{//step 95 ~ 100
		u16AGC= ((135-u16AGC)*5)/(135);
		u8Strength=(u8)u16AGC;
		u8Strength+=95;
	}else if ( u16AGC>135 && u16AGC<=170 )
	{//step 50 ~ 94
		u16AGC= ((170-u16AGC)*45)/(170-135);
		u8Strength=(u8)u16AGC;
		u8Strength+=50;
	}else if ( u16AGC>170 && u16AGC<=800 )
	{//step 2 ~ 49
		u16AGC= ((800-u16AGC)*48)/(800-170);
		u8Strength=(u8)u16AGC;
	}else if ( u16AGC>800 && u16AGC<4095 )
	{
		u8Strength=1;
	}else
	{
		u8Strength=0;
	}
	return u8Strength;
}
#endif

#if defined(TDM_1316)
static u8 TrnAgc2Level(STnimAGC *pstAgc)
{
	u16 u16AGC;
    u8  u8Strength;

	u16AGC=pstAgc->wIFpri;
	printf("the agc value is %ld\n",u16AGC);

	if ( u16AGC<=2048)
	{
		u16AGC=((u16AGC)*100)/(1024);
		u8Strength=(u8)u16AGC;
	}else
	{
		u8Strength=0;
	}
	return u8Strength;
}
#endif

#if defined(COMTECK_DVBT_3528)
/*
static u8 TrnAgc2Level(STnimAGC *pstAgc)
{
    u8  u8Strength;
	u16 u16AGC;

	// input : Total AGC AGC 
	u16AGC=pstAgc->wTotal;
	if ( u16AGC<1200 )
	{
		u8Strength=99;
	}else if ( u16AGC>=1200 && u16AGC<1790 )
	{
		u16AGC= ((1790-u16AGC)*(98-90))/(1790-1200);
		u8Strength=(u8)u16AGC;
		u8Strength+=90;
	}else if ( u16AGC>=1790 && u16AGC<1915 )
	{
		u16AGC= ((1915-u16AGC)*(90-50))/(1915-1790);
		u8Strength=(u8)u16AGC;
		u8Strength+=50;
	}else if ( u16AGC>=1915 && u16AGC<3090 )
	{
		u16AGC= ((3090-u16AGC)*(50-5))/(3090-1915);
		u8Strength=(u8)u16AGC;
		u8Strength+=5;
	}else if ( u16AGC>=3090 )
	{
		u16AGC= ((4096-u16AGC)*(5))/(4096-3090);
		u8Strength=(u8)u16AGC;
	}

	return u8Strength;
}
*/

static u8 TrnAgc2Level(STnimAGC *pstAgc)
{
    u8  u8Strength;
	u16 u16AGC;

	// input : RF AGC 
	u16AGC=pstAgc->wRFsec;
	if ( u16AGC<80 )
	{
		u16AGC=0;
	}else if ( u16AGC>210 )
	{
		u16AGC=100;
	}else
	{
		u16AGC=((u16AGC-80)*100)/(210-80);
	}
	u8Strength=u16AGC;
	return u8Strength;
}
#endif

#ifdef SEM_DNOS204
static u8 TrnAgc2Level(STnimAGC *pstAgc)
{
	u16 u16AGC;
    u8  u8Strength;

	u16AGC=pstAgc->wTotal;

	if ( u16AGC<=3050 )
	{//step 95 ~ 100
		u16AGC= ((3050-u16AGC)*5)/(3050);
		u8Strength=(u8)u16AGC;
		u8Strength+=95;
	}else if ( u16AGC>3050 && u16AGC<=3070 )
	{//step 80 ~ 94
		u16AGC= ((3070-u16AGC)*15)/(3070-3050);
		u8Strength=(u8)u16AGC;
		u8Strength+=80;
	}else if ( u16AGC>3070 && u16AGC<=3650 )
	{//step 30 ~ 79
		u16AGC= ((3650-u16AGC)*50)/(3650-3070);
		u8Strength=(u8)u16AGC;
		u8Strength+=30;
	}else if ( u16AGC>3650 && u16AGC<=3900 )
	{//step 2 ~ 29
		u16AGC= ((3900-u16AGC)*28)/(3900-3650);
		u8Strength=(u8)u16AGC;
		u8Strength+=2;
	}else if ( u16AGC>3900 && u16AGC<4000 )
	{
		u8Strength=1;
	}else
	{
		u8Strength=0;
	}
	return u8Strength;
}
#endif


//====================

u8 mt352_get_ss(void)
{
	STnimAGC stAgc;

	TnimReadAGC(&g_TheTnim, &stAgc);
	printf("AGC Total:%d RF:%d IF:%d.\n", stAgc.wTotal, stAgc.wRFsec, stAgc.wIFpri);

	return TrnAgc2Level(&stAgc);
}

void Read_TnimBER(u32 *dwPreBER, char *szStr)
{
#if defined(IO_EPP)
	//STnimAuxChannelInfo aux;
	u32 dwPostBER=0;
	char * pChar;

	TnimReadPreViterbiBER(&g_TheTnim,dwPreBER);
	TnimReadPostViterbiBER(&g_TheTnim,&dwPostBER,NULL);
	if (dwPostBER>100000000)
		//sprintf(szStr,"\n -----");
		strcpy(szStr,"\n -----");
	else if(dwPostBER==0)
		//sprintf(szStr,"0.00");
		strcpy(szStr,"0.00");
	else
	{
		sprintf(szStr,"%#4.2E",((float)dwPostBER)/100E6);
		/*find the E, and remove leading zeros in exponent*/
		pChar =(char *) strchr(szStr,'E');
		if (pChar !=NULL)
		{
			char * pFind;
			do
			{
				pFind = (char *)strchr(pChar,'0');
				if (pFind!=NULL)
				{
					*pFind = 0; /* zap it*/
					pChar=pFind+1;
				}
			}while(pFind==NULL);
			strcat(szStr,pChar);
		}
	}
#endif
}

//********************************************************************************/
#if 1
void Show_Status(void)
{
	u8 status=0, config=0, clock_ctl=0, adc_ctl=0;
	u32 status1=0;
	STnimAGC sAgc;
	STnimChannel channel;
	STnimAuxChannelInfo aux;

	u32 dwPreBER=0;
	char szStr[20];

	TnimReadChannel(&g_TheTnim, &channel, &aux);
//	printf ("\n Const  Hier  HP    LP   GI    FFT  CellID\n");
//	printf(" -----  ----  ---   ---  ---   ---  -----\n");
	if(aux.ucValid & UCVALID_TPSVALID) 
		TestPrintTPSdata(aux,TRUE);//UCVALID_TPSVALID=0x01
	else 
//		printf(" -----  ----  ---   ---  ---   ---  -----\n");

	RegisterRead2wb(g_TheTnim.DeviceID, 0x7F, &status, 1);
	printf("CHIP_ID = %d\n", status);

//	printf(" SNR(dB)=%4.1f ",((float)TnimReadSNRx8(&g_TheTnim))/8);
	RegisterRead2wb(g_TheTnim.DeviceID, 0x8A, &config, 1);
	RegisterRead2wb(g_TheTnim.DeviceID, 0x8E, &adc_ctl, 1);
	RegisterRead2wb(g_TheTnim.DeviceID, 0x89, &clock_ctl, 1);
	if(!(config&0x40) && (config&0x20) && adc_ctl==0x40)
	{
		RegisterRead2wb(g_TheTnim.DeviceID, 0x89, &clock_ctl, 1);
		if(clock_ctl & 0x30)
		{
		printf("HardWare RESET : OK\n");
		printf("SoftWare RESET : OK\n");
		}
		else
		{
		printf("HardWare RESET : FAIL\n");
		printf("SoftWare RESET : FAIL\n");
		}
	}
	else if(config==0x48 && clock_ctl==0x30)
	{
	printf("HardWare RESET : OK  \n");
	printf("SoftWare RESET : FAIL\n");
	}
	else
	{
	printf("HardWare RESET : FAIL\n");
	printf("SoftWare RESET : FAIL\n");
	}

	TnimReadAGC(&g_TheTnim, &sAgc);
	printf ("RFsec=%4d, IFpri=%4d, Total=%4d\n", sAgc.wRFsec, sAgc.wIFpri, sAgc.wTotal);
/*
	if (config&0x10)
		printf("MPEG output : Serial\n");
	else
		printf("MPEG output : Parallel\n");
*/

/*
	Read_TnimBER(&dwPreBER, szStr);
	printf("\n PreBER  = %0.3f", ((float)dwPreBER)/1000);
	printf("     PostBER = %s   \n", szStr);
	g_isRSUBCUpdate=g_isPreVitUpdate=g_isPostVitUpdate=TRUE;

	TnimReadRSUBC(&g_TheTnim,&g_wUBC);

	printf("\n UCBlock       =%d  \n", g_wUBC);
	Total+=g_wUBC;
	printf(" Total UCBlock =%lu  (C-key:Clear)     \n", Total);
	g_wUBC=0;
*/

	Tnim_ReadRegisterValue(&g_TheTnim,MT352_OFDMSTAT,4,&status1);//MT352_AGC_GAIN=0x12

	printf("\n 1)Tuner Status = %s  ", (status1 & 0x00000040)?"Lock  ":"Unlock");
	printf(" 2)AGC Status   = %s\n", (status1 & 0x01000000)?"Lock  ":"Unlock");
	printf(" 3)Descrambler  = %s  ", (status1 & 0x00040000)?"Lock  ":"Unlock");
	printf(" 4)Byte Aligner = %s\n", (status1 & 0x00020000)?"Lock  ":"Unlock");
	printf(" 5)TPS Valid    = %s  ", (status1 & 0x80000000)?"Lock  ":"Unlock");
	printf(" 6)Reed Solomon = %s\n", (status1 & 0x00000400)?"Lock  ":"Unlock");
	printf(" 7)Spectral Inv = %s\n", (status1 & 0x00000200)?"Changed":"Normal ");

}
#endif

//********************************************************************************/
//********************************************************************************/
//********************************************************************************/
//********************************************************************************/
#if defined(IO_EPP)
#pragma message("EPP DIAGNOSE OPTIONS")
typedef struct _AreaInfo
{
	u8 		bAreaCode ;
	char	cAreaName[16] ;
}	tAreaInfo ;
/************************Zarlink Semiconductor*********************************
*   Name:Tnim_GetBWfreqkHz()
*   Purpose:
*		Generates Frequency and bandwidth from channel number
*   Remarks:
*		this is the channel table look up routine
*   Inputs: 
*		Channel Number,offset, ChanTable
*   Outputs:
*		b23:0 Frequency kHz, b31:b24 Bandwidth MHz;
********************************************************************************/
u32 Tnim_GetBWfreqkHz(PSCHANNEL psChannel, u8 ucChanTable)
{
    u32 dwFrequencykHz=0;
    u8 bwMHz;

    switch (ucChanTable)
	{
	    case CHANTAB_EUROPE:
			bwMHz=7;
			if (psChannel->Number>=70)
			{
			    return 0;
			}
			else if (psChannel->Number>=21) /* 21 to 69*/
			{
			    dwFrequencykHz=306000; 		/* + 21 * 8 = 474*/
			    bwMHz=8;
			}
			else if (psChannel->Number>=13)
			{
			    return 0;
			}
			else if (psChannel->Number>=5)
			{
			    dwFrequencykHz=142500;		/* + 5*7 = 177.5*/
			}
			else if (psChannel->Number>=2)	/* 2,3,4*/
			{
			    dwFrequencykHz=36500;		/* + 2*7 = 50.5*/
			}
			else
			{
			    return 0;
			}
			break;
	    case CHANTAB_CHINA:
			if (psChannel->Number>62|| psChannel->Number<13)
			    return 0;
			if (psChannel->Number>=25) /* 25 to 62*/
			    dwFrequencykHz=410000;
			else                        /*13 to 24*/
			    dwFrequencykHz=370000;
			bwMHz=8;
			break;
	    case CHANTAB_USA:
	    case CHANTAB_CANADA:
			if (psChannel->Number>83|| psChannel->Number<14)
			    return 0;
			dwFrequencykHz = 389000;
			bwMHz=6;
		break;
	    case CHANTAB_JAPAN:
			if (psChannel->Number>62|| psChannel->Number<13)
			    return 0;
			dwFrequencykHz = 395000;
			bwMHz=6;
			break;
	    case CHANTAB_AUSTRALIA:
			bwMHz=7;
			if (psChannel->Number>=70)
			{
			    return 0;
			}
			else if (psChannel->Number>=28)        /* 28 to 69 */
			{
			    dwFrequencykHz=333500;				/* +(28 x 7) =  529.5MHz*/
			}
			else if (psChannel->Number>=12)
			{
			    return 0;
			}
			else if (psChannel->Number>=9)    	/*9A 10 & 11*/
			{
			    dwFrequencykHz=142500; 			/* + 9*7 = 205.5 */
			}
			else if (psChannel->Number>=6)    	/* 8 to 8*/
			{
			    dwFrequencykHz=135500;			/* + 6*7 = 177.5 */
			}
			else if(psChannel->Number>=4) 		/* 4&5 (5A not supported)*/
			{
			    dwFrequencykHz=69500;			/* + 4*7 = 97.5 */
			}
			else if(psChannel->Number==3) 		/* 3 only*/
			{
			    dwFrequencykHz=67500;			/* + 3*7 = 88.5 */
			}
			else    if(psChannel->Number>=1)    /* 1 & 2*/
			{
			    dwFrequencykHz= 52500; 			/* + 1*7 = 59.5 */
			}
			else        						/* ch 0*/
			{
			    dwFrequencykHz=48500;
			}
			break;
	    default:
			/* invalid channel table selection*/
		    return 0;
	}
	dwFrequencykHz = dwFrequencykHz
		+ (u32)bwMHz * (psChannel->Number) * 1000;

	if (-1 == psChannel->Offset) 
		dwFrequencykHz -= 167;
	if (1 == psChannel->Offset==1) 
		dwFrequencykHz += 167;

    return MAKEBWFREQ(bwMHz,dwFrequencykHz);
}


tAreaInfo	AreaInfoTable[] = 
{ 
	{0,"EUROPE"} ,
	{1,"CHINA"} ,
	{2,"USA"} ,
	{3,"CANADA"} ,
	{4,"JAPAN"} ,
	{5,"AUSTRALIA"} ,
} ;
int	NumOfAreaInfoItems = sizeof(AreaInfoTable)/sizeof(tAreaInfo) ;

void show_TV_freq_table()
{
	u8	i,bChNum ;
	u32 dwBWFreq ;
	
	printf("--- VHF/UHF TV Frequency Table in The World ---\n") ;
	for(i=0;i<NumOfAreaInfoItems;i++)
	{
		printf("In Area : %s\n",AreaInfoTable[i].cAreaName) ;
		
		for(bChNum=0;bChNum<127;bChNum++)
		{
			g_TheTnim.Channel.Number = bChNum ;
			dwBWFreq = Tnim_GetBWfreqkHz(&(g_TheTnim.Channel), i) ;
			printf("Ch_No. = %03d Bandwith = %02d Frequency = %ld\n",bChNum,BANDWIDTH(dwBWFreq),FREQUENCY(dwBWFreq) ) ;
		}
	}
}	

void scan_VHF_UHF_TV_ch(u8 bAreaCode)
{
	u8	bChNum ;
	u32 dwBWFreq ;
	u8	bBW ;
	u32	dwFreq ;
	u32	dwExpiredTime ;
	
	for(bChNum=0;bChNum<127;bChNum++)
	{
		g_TheTnim.Channel.Number = bChNum ;
		dwBWFreq = Tnim_GetBWfreqkHz(&(g_TheTnim.Channel

⌨️ 快捷键说明

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