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

📄 mt352.c

📁 上海tower公司DVB-T tuner驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:


/************************Zarlink Semiconductor*********************************
*   Name:Tnim_readInterrupts()
*   Purpose:Read in any interrupts
*   Remarks: Adds any new flags to the IRQ cache
*   Inputs:
*   Outputs:TRUE if successful read occured
********************************************************************************/
bool8 Tnim_ReadInterrupts(PSTNIMCTL psTnim)
{
	u32 dwIRQ;
	if (!Tnim_ReadRegisterValue(psTnim,MT352_IRQ,4,&dwIRQ))return FALSE;
	psTnim->IRQcache |=dwIRQ;
	return TRUE;
}

/************************Zarlink Semiconductor*********************************
*   Name:Tnim_AcqInit()
*   Purpose:Sets Acquisition of channel stored in TNIM structure
*   Remarks:If the channel number is not valid, skips programming
*			of tuner and bandwidth
*   Inputs:
*   Outputs:TRUE if successful programmed
********************************************************************************/
bool8 Tnim_AcqInit(PSTNIMCTL psTnim)
{
	u32 dwBWFreq;
	u8 ucBuffer;

	/* capture range*/
	if (!MT352_READ(MT352_CAPT_RANGE)) 
		return FALSE;//MT352_CAPT_RANGE=0x75
		
	ucBuffer &= 0xFC;
	ucBuffer |= 2; /* default capture range */
	if (!MT352_WRITE(MT352_CAPT_RANGE)) 
		return FALSE;

	/* default to HP data stream */
	if (!MT352_READ(MT352_TPS_GIVEN)) 
		return FALSE;//MT352_TPS_GIVEN=0x51
	ucBuffer &= ~MT352_TPS_GIVENH_LP;//MT352_TPS_GIVENH_LP=0x80
	if (!MT352_WRITE(MT352_TPS_GIVEN)) 
		return FALSE;
	
	/* turn on automatic acquisition features */
	if (! MT352_READ(MT352_ACQ_CTL)) 
		return FALSE;//MT352_ACQ_CTL=0x53
	ucBuffer &=MT352_ACQ_CTL_AUTO;//MT352_ACQ_CTL_AUTO=0xF4
	ucBuffer |=0x20;  /* Auto reaquire when Reedsolomon loss lock */
	if (! MT352_WRITE(MT352_ACQ_CTL)) 
		return FALSE;
	
	/* turn on automatic re-acquisition features */
	if (! MT352_READ(MT352_FSM_CTL)) 
		return FALSE;//MT352_FSM_CTL=0x7B
	ucBuffer |= MT352_FSM_CTL_AUTO;//MT352_FSM_CTL_AUTO=0x03

	if (! MT352_WRITE(MT352_FSM_CTL)) 
		return FALSE;

	ucBuffer=MT352_TUNER_GOAQUIRE;//MT352_TUNER_GOAQUIRE=0x01
	return MT352_WRITE(MT352_TUNER_GO);
}

/************************Zarlink Semiconductor*********************************
*   Name:TnimReadRSUBC()
*   Purpose:Read the uncorrected block count
*   Remarks: if psTnim->NoAutoRSUBC is set, returns value from chip
*   Inputs:
*   Outputs:
********************************************************************************/
bool8 TnimReadRSUBC(PSTNIMCTL psTnim, u16 *wRSUBC)
{
	bool8 ret;
	u32 dwRSUBC;
	TNIM_ENTRYB;
	ret= Tnim_IsLocked(psTnim);
	if (ret)
	{
		if (psTnim->NoAutoRSUBC)
		{
			ret = Tnim_ReadRegisterValue(psTnim,MT352_RS_UBC,2,&dwRSUBC);
			*wRSUBC = (u16) dwRSUBC;
		}
		else
			*wRSUBC = psTnim->RSUBC;
	}
	TNIM_EXIT;
	return ret;
}

/************************Zarlink Semiconductor*********************************
*   Name: TnimAcquireChannel()
*   Purpose:Acquires the channel in psChannel
*   Remarks:if psChannel=NULL, Acquires previous channel if any
*   Inputs:
*   Outputs:
********************************************************************************/
bool8 TnimAcquireChannel(PSTNIMCTL psTnim,STnimChannel *psChannel)
{
	TNIM_ENTRYB;
	if (psChannel!=NULL)
		psTnim->Channel = *psChannel;
	psTnim->Channel.Number &= 0x7F; /* mark number as valid*/
	TNIM_COMMAND(TNIM_COMMAND_ACQUIRE);
	TNIM_EXIT;
	return TRUE;
}


/************************Zarlink Semiconductor*********************************
*   Name: TnimAcquireSynth()
*   Purpose:allows direct programming of synth , followed by acquisition
*   Remarks:Reads 5 bytes into MT352, and kicks off Acquisition
*           if ucBW is non zero, programs the MT352 bandwidth as well
*   Inputs:
*   Outputs:
********************************************************************************/
bool8 TnimAcquireSynth(PSTNIMCTL psTnim,u8* ucBuffer,u8 ucBW)
{
	bool8 ret;
	TNIM_ENTRYB;
	ret = RegisterWrite2wb(psTnim->DeviceID,MT352_TUNER_ADDR,ucBuffer,5);
	if (ret && ucBW) 
		ret = Tnim_ProgramBW(psTnim,ucBW);
	psTnim->Channel.Number |= 0x80; /*invalidate the channel number*/
	TNIM_COMMAND(TNIM_COMMAND_ACQUIRE);
	TNIM_EXIT;
	return ret;
}

//===============================================================================
#if defined(SEM_TECC2349PG)|| defined(SEM_TDTC8250) || defined(PARTSNIC_TNIM) 
{
	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(THOM_DTT7592)
static u8 TrnAgc2Level(STnimAGC *pstAgc)
{
	u16 u16AGC;
    u8  u8Strength;

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

	if ( u16AGC<=1024)
	{
		u16AGC=((u16AGC)*100)/(1024);
		u8Strength=100-(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 : Total AGC AGC 
	u16AGC=pstAgc->wTotal;
	if ( u16AGC<2025 )
	{//step 99+
		u8Strength=99;
	}else if ( u16AGC>=2025 && u16AGC<2070 )
	{//step 60 ~ 98
		u16AGC= ((2070-u16AGC)*49)/(2070-2025);
		u8Strength=(u8)u16AGC;
		u8Strength+=50;
	}else if ( u16AGC>=2070 && u16AGC<3312 )
	{//step 3 ~ 50
		u16AGC= ((3312-u16AGC)*48)/(3312-2070);
		u8Strength=(u8)u16AGC;
		u8Strength+=3;
	}else if ( u16AGC>=3312 && u16AGC<4093 )
	{//step 1 ~ 2
		u16AGC= ((4093-u16AGC)*2)/(4093-3312);
		u8Strength=(u8)u16AGC;
		u8Strength+=1;
	}else if ( u16AGC>=4093 )
	{
		u8Strength=0;
	}

	return u8Strength;
}

#endif

#if defined(SEM_DNOS204) 
static u8 TrnAgc2Level(STnimAGC *pstAgc)
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;
**********************************************************

⌨️ 快捷键说明

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