📄 qam0297.c
字号:
/*
Clear Timing Table
*/
linkClearTiming();
linkWbAgcOn();
linkSweepOn();
return 0;
}
unsigned char check_band(int frequency)
{
unsigned char band;
/* Select Band */
if( frequency >= 430000 ) /*UHF Band */
band=0x04;
else if( frequency >= 146500 ) /*VHF high Band */
band=0x02;
else
band=0x01;
return band;
}
unsigned char calculate_CP(int frequency)
{
unsigned char CP210=0;
/*VHF-L */
if( frequency<100000 ) CP210=2; /*50.5-99.9 */
else if( frequency< 122000 ) CP210=3; /*100-121.9 */
else if( frequency< 129000 ) CP210=4; /*122-128.9*/
else if( frequency< 136000 ) CP210=5; /*129-135.98*/
/*V1.01[041222]*/
else if( frequency<=146500 ) CP210=6; /*136-146.5*/
/* else if( frequency<=142500 ) CP210=6; *136-142.5*/
/*VHF=H*/
else if( frequency< 240000 ) CP210=1; /*149.5-239.9*/
else if( frequency< 310000 ) CP210=2; /*240-309.9*/
else if( frequency< 380000 ) CP210=3; /*310-379.9*/
/*V1.01[041222]*/
else if( frequency<=430000 ) CP210=4; /*380-430*/
/* else if( frequency<=426000. ) CP210=4; *380-426*/
/*UHF*/
else if( frequency< 578000 ) CP210=4; /*434-577.9*/
else if( frequency< 650000 ) CP210=5; /*578-649.9*/
else if( frequency< 746000 ) CP210=6; /*650-745.9*/
else CP210=7; /*746-858*/
return CP210;
}
/*----------------------------------------------------------------------------*/
static void tuner_process( void *pvParam )
{
int acquisition_time = 0,
acquisition_attempt_cnt = 0;
while ( TRUE )
{
switch ( tuner_state )
{
case TUNER_IDLE:
LockIndicator=0; /*fang020119 */
semaphore_signal ( psemTunerIdleStateEntered );
semaphore_wait ( psemTunerIdleStateReleased );
acquisition_attempt_cnt = MAX_ACQUISITION_ATTEMPT_BEFORE_IQ_INVERT;
/*the above is meant to force IQ invertion at the first unsuccesful
acquisition attempt when tuning to a new transponder*/
QAM_DEBUG_CODE ( do_report ( severity_info, "TIDLE => left idle state\n" ) );
break;
case SIGNAL_DETECTION:
{
unsigned int agc;
LockIndicator=0; /* fang020119 */
NoSignalCount=0;
MsgFlag=0;
#if 0
agc = linkGetAGC2();
do_report(0,"-->agc2 =0x%x\n",agc);
if( agc == 0 )
{
QAM_DEBUG_CODE ( do_report ( severity_info, "TSD => AGC [%d]\n", agc ));
}
else
{
QAM_DEBUG_CODE ( do_report ( severity_info, "TSD => Good signal [%d]\n", agc ));
}
#endif
UPDATE_TUNER_STATE ( SIGNAL_DETECTION, ACQUISITION );
break;
}
case ACQUISITION:
{
unsigned int agc;
BOOLEAN bLock;
agc = linkGetAGC2();
QAM_DEBUG_CODE ( do_report ( severity_info, "TSD => Good signal [%d]\n", agc ));
// do_report(0,"agc2 =0x%x\n",agc);
bLock=linkDataLock();
if(!bLock&&agc>=0x18f)
{
// TunerNotify(FALSE);
// do_report(0,"agc2 =0x%x\n",agc);
s_AgcNoSignal=2;
}
else
s_AgcNoSignal=1;
if( bLock)
{
// do_report( severity_info, "TSD => Data lock\n" );
// do_report(0,"lock agc2 =0x%x\n",agc);
QAM_DEBUG_CODE( do_report( severity_info, "TSD => Data lock\n" ));
/* Add YinFQ */
FrontPanelShowLock(TRUE);
LockIndicator=1; /* fang020119 */
NoSignalCount=0;
/*
CA_SendMsgFromCAToAuxHandler(GUIM_MESSAGE_CA_NOTIFY_MSG,2006);
*/
TunerNotify(TRUE);
s_AgcNoSignal=0;
/* END HEAR */
UPDATE_TUNER_STATE( ACQUISITION, MONITOR_TUNING );
}
else if( acquisition_time > ACQUISITION_TIMEOUT )
{
acquisition_attempt_cnt += 1;
QAM_DEBUG_CODE( do_report( severity_info, "TSD => acquisition timeout\n" ));
/* Add YinFQ */
FrontPanelShowLock(FALSE);
LockIndicator=0; /* fang020119 */
/* END HEAR */
acquisition_time = 0;
if( acquisition_attempt_cnt >= MAX_ACQUISITION_ATTEMPT_BEFORE_IQ_INVERT )
{
acquisition_attempt_cnt=0;
iSpectrumInversion = !iSpectrumInversion;
QAM_DEBUG_CODE( do_report( severity_info, "TSD => switching spectrum inversion %s\n",
iSpectrumInversion ? "ON" : "OFF" ));
if( NoSignalCount++>2)
{
MsgFlag=TRUE;
/*
CA_SendMsgFromCAToAuxHandler(GUIM_MESSAGE_CA_NOTIFY_MSG,2005);
*/
TunerNotify(FALSE);
}
}
linkSignalSearch( cQamSize, iSymbolRate, iSweepRate, iFrequencyOffset, iSpectrumInversion );
}
else
{
/*TUNER_TUNER_CRITICAL( do_report( severity_info, "TSD => acquisition ongoing\n" ));*/
/* Add YinFQ */
FrontPanelShowLock(FALSE);
LockIndicator=0; /* fang020119 */
/* END HEAR */
acquisition_time += LOCK_TEST_INTERVAL;
MILLI_DELAY( LOCK_TEST_INTERVAL );
}
}
break;
case MONITOR_TUNING:
MILLI_DELAY( MONITOR_LOCK_TEST_INTERVAL );
//task_delay(1000);
if( !linkDataLock())
{
QAM_DEBUG_CODE( do_report( severity_info, "TSD => Data lock lost\n" ));
acquisition_attempt_cnt = 0;
UPDATE_TUNER_STATE( MONITOR_TUNING, ACQUISITION );
}/* end of if */
}/* end of switch */
}/* end of while */
do_report ( severity_error, "ERROR => Unexpected exit in TUNER_PROCESS ...\n" );
}
/*----------------------------------------------------------------------------*/
void DVBNewTuneReq( ITF_TRANSPONDER_INFO_STRUCT *pstTransponderInfo )
{
unsigned char band,cp;
unsigned char TunerS[10];
int i;
int *written=NULL;
#ifndef INTEGRATE_TUNER_MODULE
return;
#endif
s_AgcNoSignal=0;
TUNER_PAUSE;
#if SHARP_tuner_6005
cQamSize = QAM64;
// iSymbolRate = 6890;
iSymbolRate = pstTransponderInfo -> iSymbolRate;
iTransponderFreq = pstTransponderInfo -> iTransponderFreq;
iCurTunedFreq = ( int )( CHANGE_KHZ_TO_LSB( iTransponderFreq )+0.5f);
TunerS[0] = (unsigned char) 0x00ff & (iCurTunedFreq >> 8);
TunerS[1] = (unsigned char) 0x00ff & iCurTunedFreq;
TunerS[2] = (unsigned char) 0xca; /* * CONTROL BYTE1 = 11001010B **/
cp=calculate_CP( iTransponderFreq);
band=check_band(iTransponderFreq);
TunerS[3] = (unsigned char)(((cp<<5) & 0xe0) + (band & 0x07));
tuner_write ( 0xc2,TunerS,4,written ) ;
#ifdef TESTTOOL_SHARP_TUNER
for(i=0;i<=3;i++)
{
do_report(severity_info,"0x%x ",TunerS[i]);
}
do_report(severity_info,"\n");
#endif
// #endif
#else
cQamSize = QAM64; /* fang020105 */
iSymbolRate = pstTransponderInfo -> iSymbolRate;
iTransponderFreq = pstTransponderInfo -> iTransponderFreq;
iCurTunedFreq = ( int )( CHANGE_KHZ_TO_LSB( iTransponderFreq ));
/*if( iTransponderFreq < LOW_BAND_UPPER_BOUNDARY )
{
gloabAGC2Threshould=0x50;
globalInitFrequencyOffser=-35;
band = LOW_BAND;
}
else if( iTransponderFreq < MID_BAND_UPPER_BOUNDARY )
{
gloabAGC2Threshould=0x50;
globalInitFrequencyOffser=-35;
band = MID_BAND;
}
else
{
gloabAGC2Threshould=0x50;
globalInitFrequencyOffser=-54;
band = HIGH_BAND;
}*/
#if 0
iTransponderFreq = iTransponderFreq + TUNER_IF;
band = 0x05; /*xiejiang add*/
if(iTransponderFreq>87000&&iTransponderFreq<165000)
band = 0x05;
/*if(iTransponderFreq>=165000&&iTransponderFreq<=172000)
band = 0x45; */ /*20020118a xiejiang add*/
if(iTransponderFreq>172000&&iTransponderFreq<179000)
band = 0x45;
/*if(iTransponderFreq>=179000&&iTransponderFreq<=186000)
band = 0x06; */ /*b xiejiang add*/
if(iTransponderFreq>186000&&iTransponderFreq<382000)
band = 0x06;
/*if(iTransponderFreq>=382000&&iTransponderFreq<=390000)
band = 0x46; */ /*c xiejiang add*/
if(iTransponderFreq>390000&&iTransponderFreq<430000)
band = 0x46;
/*if(iTransponderFreq>=430000&&iTransponderFreq<=438000)
band = 0x86; */ /*xiejiang add*/
if(iTransponderFreq>438000&&iTransponderFreq<462000)
band = 0x86;
/*if(iTransponderFreq>=462000&&iTransponderFreq<=470000)
band = 0x03; */ /*xiejiang add*/
if(iTransponderFreq>470000&&iTransponderFreq<692000)
band = 0x03;
/* if(iTransponderFreq>=692000&&iTransponderFreq<=700000)
band = 0x43; */ /*xiejiang add*/
if(iTransponderFreq>700000&&iTransponderFreq<828000)
band = 0x43;
/*if(iTransponderFreq>=828000&&iTransponderFreq<=836000)
band = 0x83; */ /*xiejiang add*/
if(iTransponderFreq>836000&&iTransponderFreq<894000)
band = 0x83;
#else /* fang020118 */
iTransponderFreq = iTransponderFreq + TUNER_IF;
band = 0x05;
if(iTransponderFreq>84000&&iTransponderFreq<169000)
band = 0x05; /* fang020320 0x05; */
if(iTransponderFreq>=169000&&iTransponderFreq<=182000)
band = 0x45;
if(iTransponderFreq>182000&&iTransponderFreq<386000)
band = 0x06;
if(iTransponderFreq>=386000&&iTransponderFreq<=434000)
band = 0x46;
if(iTransponderFreq>434000&&iTransponderFreq<466000)
band = 0x86;
if(iTransponderFreq>=466000&&iTransponderFreq<=696000)
band = 0x03;
if(iTransponderFreq>696000&&iTransponderFreq<832000)
band = 0x43;
if(iTransponderFreq>=832000&&iTransponderFreq<=896000)
band = 0x83;
#endif
iTransponderFreq = iTransponderFreq - TUNER_IF;
/*ori: tuner_write( iCurTunedFreq, band, CHARGE_PUMP_OFF );*/
tuner_write( iCurTunedFreq, band, CHARGE_PUMP_ON );
//fang- MILLI_DELAY( TUNER_SETTLING_TIME );
#endif
iSweepRate = INITIAL_SWEEP_RATE;
iFrequencyOffset = INITIAL_FREQUENCY_OFFSET;
iSpectrumInversion = INITIAL_SPECTRUM_INVERSION;
linkSignalSearch( cQamSize, iSymbolRate, iSweepRate, iFrequencyOffset, iSpectrumInversion );
TUNER_RESUME;
// do_report ( severity_info, "Quit DVBNewTunerReq...1\n");
}
#ifdef TESTTOOL_PRESENT
/*--------------------------------------------------------*/
boolean SetTuner( parse_t *pars_p, char *result_sym_p )
{
ITF_TRANSPONDER_INFO_STRUCT stTransponderInfo;
long lInputVal;
cget_integer ( pars_p, 500000, &lInputVal );
stTransponderInfo . iTransponderFreq = ( int )lInputVal;
cget_integer ( pars_p, 7000, &lInputVal );
stTransponderInfo . iSymbolRate = ( int )lInputVal;
DVBNewTuneReq( &stTransponderInfo );
return FALSE;
}
/*--------------------------------------------------------*/
boolean R297( parse_t *pars_p, char *result_sym_p )
{
unsigned char read_byte;
long address;
cget_integer ( pars_p, 0x00, &address );
link_read( (unsigned char)address, &read_byte );
do_report( severity_info, "Read %02x: %02x\n", (unsigned char)address,read_byte );
return FALSE;
}
/*--------------------------------------------------------*/
boolean W297( parse_t *pars_p, char *result_sym_p )
{
long value;
long address;
cget_integer ( pars_p, 0x00, &address );
cget_integer ( pars_p, 0x48, &value );
link_write( (unsigned char)address, (unsigned char)value );
do_report( severity_info, "Write %02x: %02x\n", (unsigned char)address,(unsigned char)value );
return FALSE;
}
#endif
/*----------------------------------------------------------------------------*/
#define I2C_BUS_ID 0
ST_ErrorCode_t DVBTunerInit ( void )
{
#ifndef INTEGRATE_TUNER_MODULE
return FALSE;
#endif
ITF_TRANSPONDER_INFO_STRUCT stTransponderInfo;
do_report ( severity_info, "TUNER (STV0297) Module Initialisation ver[%s]\n", TUNER_SOFTWARE_UPDATE_ID );
/* Creating TUNER module semaphores */
QAM_DEBUG_CODE(do_report ( severity_info, "Creating TUNER module semaphores ...\n" ));
psemLinkIcAccess = semaphore_create_fifo ( 1 );
psemTunerAccess = semaphore_create_fifo ( 1 );
psemTunerStateWriteAccess = semaphore_create_fifo ( 1 );
psemTunerIdleStateEntered = semaphore_create_fifo ( 0 );
psemTunerIdleStateReleased = semaphore_create_fifo ( 0 );
if ( psemLinkIcAccess == NULL ||
psemTunerAccess == NULL ||
psemTunerStateWriteAccess == NULL ||
psemTunerIdleStateEntered == NULL ||
psemTunerIdleStateReleased == NULL )
{
do_report ( severity_error, "TUNER_INIT=> Unable to Initialise Semaphores\n" ) ;
return FALSE;
}
#if 1 /* def ENABLE_STAPI_ENVIRONMENT */
{
STI2C_OpenParams_t I2cOpenParams;
ST_ErrorCode_t Error = ST_NO_ERROR;
/* Initialize the I2C interface */
I2cOpenParams.BusAccessTimeOut = 5;
I2cOpenParams.AddressType = STI2C_ADDRESS_7_BITS;
I2cOpenParams.I2cAddress = 0x38;
/*
TUNER_INIT ( do_report ( severity_info, "%s %d> Opening I2C access for STv0299 ... [%s] Addr[%02X]\n",
__FILE__,
__LINE__,
I2CDeviceName [ I2C_BUS_ID ],
I2cOpenParams . I2cAddress ) );
*/
if ( ( Error = STI2C_Open ( I2CDeviceName [ I2C_BUS_ID ],
&I2cOpenParams,
&I2CDemodHandle ) ) != ST_NO_ERROR )
{
do_report ( severity_error, "%s %d> Failed (%d) to open I2C access for STV0297 on [%s]\n",
__FILE__,
__LINE__,
Error,
I2CDeviceName [ I2C_BUS_ID ] );
return FALSE;
}
/* Initialize the I2C interface */
I2cOpenParams.BusAccessTimeOut = 5;
I2cOpenParams.AddressType = STI2C_ADDRESS_7_BITS;
I2cOpenParams.I2cAddress = 0xc2;
if ( ( Error = STI2C_Open ( I2CDeviceName [ I2C_BUS_ID ],
&I2cOpenParams,
&I2CTunerHandle ) ) != ST_NO_ERROR )
{
do_report ( severity_error, "%s %d> Failed (%d) to open I2C access for STV0297 on [%s]\n",
__FILE__,
__LINE__,
Error,
I2CDeviceName [ I2C_BUS_ID ] );
return FALSE;
}
/*
TUNER_INIT ( do_report ( severity_info, "%s %d> STv0299I2CHandle=%08X\n",
__FILE__,
__LINE__,
I2CDemodHandle ) );
*/
/*
* Re-use old open parameters structure, but modify the address
* to be used.
*/
#if 0
I2cOpenParams . I2cAddress = I2C_SLAVE_ADDR_FOR_TUNER;
#else
I2cOpenParams . I2cAddress = 0x38; /* by yxl for stv0297 */
#endif
/*
TUNER_INIT ( do_report ( severity_info, "%s %d> Opening I2C access for DEMOD ... [%s] Addr[%02X]\n",
__FILE__,
__LINE__,
I2CDeviceName [ I2C_BUS_ID ],
I2cOpenParams . I2cAddress ) );
*/
}
#endif /* ENABLE_STAPI_ENVIRONMENT */
FORCE_TUNER_STATE ( TUNER_IDLE );
/* Create tuner_process */
QAM_DEBUG_CODE ( do_report ( severity_info, "Creating TUNER Process\n" ) );
if ( ( ptidTunerTask = task_create ( tuner_process,
NULL,
TUNER_PROCESS_STACK_SIZE,
/*TUNER_PROCESS_PRIORITY*/9,//hht 9 20050428
"tuner_process",
0 ) ) == NULL )
{
do_report ( severity_error, "TUNER_INIT=> Unable to create TUNER process\n" ) ;
return TRUE;
}
a_RegInit();
/*
#ifdef TESTTOOL_PRESENT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -