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

📄 qam0297.c

📁 stv0297 寄存器 tuner 驱动 5105 方案
💻 C
📖 第 1 页 / 共 4 页
字号:
  /*
   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 + -