📄 mt352.c
字号:
/************************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 + -