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