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

📄 qam029old7.c

📁 stv0297 寄存器 tuner 驱动 5105 方案
💻 C
📖 第 1 页 / 共 4 页
字号:
  {
    i2c_buffer[ 0 ] = reg;
    error = i2c_write( i2c_ssc0, LINKIC_DEV, i2c_buffer, 1, &actlen );
    if( !error )
    {
      error = i2c_read( i2c_ssc0, LINKIC_DEV, i2c_buffer, 1, &actlen );
      if( !error )
      {
        *value_p = i2c_buffer[ 0 ];
        break;
      }

      do_report( severity_error, "link_read->I2C_read error address[%02x]\n" ,reg);
    }
    else
    {
      do_report( severity_error, "link_read->I2C_write error address[%02x]\n" ,reg);
    }
    break;
  }
  semaphore_signal( psemLinkIcAccess );
  return error;
}

/*----------------------------------------------------------------------------*/
BOOLEAN link_write( BYTE reg, BYTE value )
{
  BOOLEAN  error = FALSE;
  int      actlen;

  semaphore_wait( psemLinkIcAccess );

  i2c_buffer[0] = reg;
  i2c_buffer[1] = value;
  error = i2c_write( i2c_ssc0, LINKIC_DEV, i2c_buffer, 2, &actlen );
  if( error )
  {
    do_report( severity_error, "link_write->I2C error address[%02x] value[%02x]\n",reg,value );
  }
 
  semaphore_signal( psemLinkIcAccess );

  return error;
}

/*
 * CODE       : tuner_write
 * TYPE       : sub
 * PROTOTYPE  : BOOLEAN  tuner_write ( int value );
 *
 * PURPOSE : to write the given data into the TUNER_IC for the PLL setup.
 */

/*----------------------------------------------------------------------------*/
BOOLEAN  tuner_write ( int value, unsigned char band, unsigned char charge_pump )
{
  BOOLEAN   error = true;
	int       actlen,i;
	unsigned char i2c_buffer1[ I2C_COMMAND_LEN ];
	int iBytes;

  semaphore_wait (psemTunerAccess);

	/*ENABLE_I2C_REPEATER*/

  i2c_buffer1[0] = ( BYTE )(( value >> 8 ) & 0x7F );    /* MSB */
  i2c_buffer1[1] = ( BYTE )( value & 0xFF );            /* LSB */
#ifdef DCF_8710  
  i2c_buffer1[2] = /*charge_pump*/0x85;
  i2c_buffer1[3] = band;

  iBytes=4;
#else
  i2c_buffer1[2] = /*charge_pump*/0x86;//0xc6;//0x86
  i2c_buffer1[3] = 0;
  iBytes=4;
#endif

	/*ENABLE_TUNER_I2C;*/
//	MILLI_DELAY(300);
	for(i=0;i<3 && error;i++)
	{
		ENABLE_I2C_REPEATER
		/*semaphore_wait( psemLinkIcAccess );*/
		QAM_DEBUG_CODE ( do_report ( severity_info, "tuner_write->%d ( %ld KHz ) data: %02x %02x %02x %02x\n",
                            value, ( long )(( long ) value * TUNER_STEP - TUNER_IF ),
                            i2c_buffer1[0], i2c_buffer1[1], i2c_buffer1[2], i2c_buffer1[3] ));
	//	error = i2c_write ( i2c_ssc0, TUNER_DEV, i2c_buffer1, iBytes, &actlen );
				error = i2c_write ( i2c_ssc0, 0xc2, i2c_buffer1, iBytes, &actlen );
		/*semaphore_signal( psemLinkIcAccess );*/
		if ( error )
		{
     		do_report( severity_error, "tuner_write->I2C error\n" ) ;
			MILLI_DELAY ( 30 );
		}
	}
	/*DISABLE_TUNER_I2C;*/
	
	DISABLE_I2C_REPEATER

   semaphore_signal (psemTunerAccess);
   return (error);
}

/*----------------------------------------------------------------------------*/
BOOLEAN  tuner_read ( BYTE *value_p )
{
  BOOLEAN   error = FALSE;
  int       actlen = 0;

   semaphore_wait (psemTunerAccess);

	ENABLE_I2C_REPEATER

	/*ENABLE_TUNER_I2C;*/
   error = i2c_read ( i2c_ssc0, TUNER_DEV, i2c_buffer, 1, &actlen );
   /*DISABLE_TUNER_I2C;*/
   
   DISABLE_I2C_REPEATER
   *value_p = i2c_buffer [ 0 ];

   semaphore_signal (psemTunerAccess);

	return(error);
}

/*----------------------------------------------------------------------------*/
#define linkReset()            \
{                              \
  link_write( CTRL_0, 0x01 ); \
  link_write( CTRL_0, 0x00 ); \
}

/*----------------------------------------------------------------------------*/
#define linkResetDi()          \
{                              \
  link_write( CTRL_1, 0x01 ); \
  link_write( CTRL_1, 0x00 ); \
}

/*----------------------------------------------------------------------------*/
void linkSweepOff( void )
{
  unsigned char data_read;

  link_read( CRL_10, &data_read );
  data_read |= 0x30;
  data_read &= 0xfc;
  link_write( CRL_10, data_read );
}

/*----------------------------------------------------------------------------*/
void linkSweepOn( void )
{
  unsigned char data_read;

  link_read( CRL_10, &data_read );
  data_read &= 0xcf;
  data_read |= 0x03;
  link_write( CRL_10, data_read );
}

/*----------------------------------------------------------------------------*/
#define linkWbAgcOff()          \
{                               \
  link_write( WBAGC_3, 0x40 );  \
}

/*----------------------------------------------------------------------------*/
#define linkWbAgcOn()           \
{                               \
  link_write( WBAGC_3, 0x10 );  \
}

/*----------------------------------------------------------------------------*/
#define linkClearTiming()        \
{                                \
  link_write( STLOOP_10, 0x3e ); \
  link_write( STLOOP_10, 0x5e ); \
}

/*----------------------------------------------------------------------------*/
BOOLEAN linkDataLock( void )
{
  unsigned char ucStatusRead;

  link_read( RS_DESC_15, &ucStatusRead );

  if( ucStatusRead & 0x80 )
    return TRUE;
  else
    return FALSE;
}

/*----------------------------------------------------------------------------*/
void linkSetQamSize( unsigned char iReqQAMSize )
{
  unsigned char equ0, equ1;

  switch( iReqQAMSize )
  {
    case QAM16:
      equ0 = 0x08;
      equ1 = 0x58;
      break;
    case QAM32:
      equ0 = 0x18;
      equ1 = 0x58;
      break;
    case QAM64:
      equ0 = 0x48;
      equ1 = 0x58;
      break;
    case QAM128:
      equ0 = 0x28;
      equ1 = 0x58;
      break;
    case QAM256:
      equ0 = 0x39;
      equ1 = 0x69;
      break;
    default:
      do_report( severity_error, "WRONG QAM size = %d\n", iReqQAMSize );
  }

  link_write( EQU_0, equ0 );
  link_write( EQU_1, equ1 );
}

/*----------------------------------------------------------------------------*/
void linkSetSymbolRate( int symbolRate )
{
  unsigned int tmp, ExtClk;

  ExtClk = LINK_CLOCK_FREQUENCY / 4;
  tmp = 131072 * symbolRate; /* 131072 = 2**17  */
  tmp /= ExtClk;
  tmp *= 8192; /* 8192L = 2**13 */

  link_write( STLOOP_5, ( unsigned char )tmp );
  link_write( STLOOP_6, ( unsigned char )( tmp >> 8 ) );
  link_write( STLOOP_7, ( unsigned char )( tmp >> 16 ) );
  link_write( STLOOP_8, ( unsigned char )( tmp >> 24 ) );
}

/*----------------------------------------------------------------------------*/
void linkSetSweepRate( int sweepRate )
{
  long long_tmp;
  unsigned char byte_temp;

  long_tmp = sweepRate * 262144L ;  /* 262144 = 2*18 */
  long_tmp /= iSymbolRate ;
	long_tmp *= 1024 ;
	/* rounding */
	if(long_tmp >= 0)
	  long_tmp += 500000 ;
	else
	  long_tmp -= 500000 ;
	long_tmp /= 1000000 ;

  QAM_DEBUG_CODE(do_report( severity_info, "sweep rate in register: %08x symbol rate: %d\n", long_tmp, iSymbolRate ));
  
  link_read(CRL_9,&byte_temp);
  link_write( CRL_0, ( unsigned char )( long_tmp & 0xFF ) );
  link_write( CRL_9, ( unsigned char )(( long_tmp >> 4 ) &0xf0)|(byte_temp&0x0f) );
}

/*----------------------------------------------------------------------------*/
void linkSetFrequencyOffset( int frequencyOffset )
{
  long long_tmp;
  unsigned char byte_temp;
  
  long_tmp = frequencyOffset * 1048576L ; /* 2**20 */
  long_tmp = long_tmp / iSymbolRate;
  long_tmp = long_tmp * 256;           ;
  if(long_tmp < 0) long_tmp += 0x10000000 ;
  long_tmp &= 0x0FFFFFFF ;

  QAM_DEBUG_CODE(do_report( severity_info, "carrier offset in register: %08x symbol rate: %d\n", long_tmp, iSymbolRate ));

  link_read(CRL_9,&byte_temp);
  link_write( CRL_6, ( unsigned char )long_tmp );
  link_write( CRL_7, ( unsigned char )( long_tmp >> 8 ) );
  link_write( CRL_8, ( unsigned char )( long_tmp >> 16 ) );
  link_write( CRL_9, ((( unsigned char )( long_tmp >> 24 ))&0x0f) | (byte_temp&0xf0) );
}

/*----------------------------------------------------------------------------*/
void linkSetSpectrumInversion( unsigned int spectrumInversion )
{
  unsigned char byte_read;

  link_read( CTRL_3, &byte_read );

  if( spectrumInversion )
    byte_read |= 0x08;
  else
    byte_read &= (~0x08);

  link_write( CTRL_3, byte_read );
}

/*----------------------------------------------------------------------------*/
#define RESERVED_REGISTER(__address0__)
#define KEEP_REGISTER_IN_RESET_VALUE(__adress1__,__value1__) link_write(__adress1__,__value1__)
#define NO_NEED_INIT(__address2__)



void a_RegInit(void)
{
	    
//  linkReset() ;
//  linkResetDi() ;
//  linkInitRegisters();
   linkReset() ;
  linkResetDi() ;
  RegInit();
  Driv0297CNEstimatorInit();
}

/*--------------------------------------------------------*/
short linkGetAGC2( void )
{
  unsigned char byte_read;
  unsigned short agc;

  link_read( WBAGC_2, &byte_read );
  agc = byte_read << 8;
  link_read( WBAGC_1, &byte_read );
  agc |= byte_read;
  agc &= 0x03ff;

  return agc;
}
void linkInitRegisters( void )
{
  link_write( EQU_0,         INIT_EQU_0        );
  link_write( EQU_1,         INIT_EQU_1        );
  RESERVED_REGISTER(EQU_2);
  link_write( EQU_3,         INIT_EQU_3        );
  NO_NEED_INIT(EQU_4);
  RESERVED_REGISTER(EQU_5);
  RESERVED_REGISTER(EQU_6);
  NO_NEED_INIT(EQU_7);
  NO_NEED_INIT(EQU_8);
  
  link_write(INITDEM_0,INIT_INITDEM_0);
  link_write(INITDEM_1,INIT_INITDEM_1);
  link_write(INITDEM_2,INIT_INITDEM_2);
  link_write(INITDEM_3,INIT_INITDEM_3);
  link_write(INITDEM_4,INIT_INITDEM_4);
  link_write(INITDEM_5,INIT_INITDEM_5);
  
  link_write(DELAGC_0,INIT_DELAGC_0);
  link_write(DELAGC_1,INIT_DELAGC_1);
  link_write(DELAGC_2,INIT_DELAGC_2);
  link_write(DELAGC_3,INIT_DELAGC_3);
  link_write(DELAGC_4,INIT_DELAGC_4);
  link_write(DELAGC_5,INIT_DELAGC_5);
  link_write(DELAGC_6,INIT_DELAGC_6);
  link_write(DELAGC_7,INIT_DELAGC_7);
  NO_NEED_INIT(DELAGC_8);


	  link_write(WBAGC_0,INIT_WBAGC_0);
	  link_write(WBAGC_1,INIT_WBAGC_1);/*NO_NEED_INIT(WBAGC_1);*/
	  link_write(WBAGC_2,INIT_WBAGC_2);

	  link_write(WBAGC_3,INIT_WBAGC_3);
	  link_write(WBAGC_4,INIT_WBAGC_4);
	  NO_NEED_INIT(WBAGC_5);
	  NO_NEED_INIT(WBAGC_6);
	  link_write(WBAGC_9,INIT_WBAGC_9);
	  NO_NEED_INIT(WBAGC_10);
	  NO_NEED_INIT(WBAGC_11);
  
  link_write(STLOOP_2,INIT_STLOOP_2);
  link_write(STLOOP_3,INIT_STLOOP_3);
  NO_NEED_INIT(STLOOP_5);
  NO_NEED_INIT(STLOOP_6);
  NO_NEED_INIT(STLOOP_7);
  NO_NEED_INIT(STLOOP_8);
  link_write(STLOOP_9,INIT_STLOOP_9);
  link_write(STLOOP_10,INIT_STLOOP_10);
  link_write(STLOOP_11,INIT_STLOOP_11);
  
  link_write(CRL_0,INIT_CRL_0);
  link_write(CRL_1,INIT_CRL_1);
  link_write(CRL_2,INIT_CRL_2);
  NO_NEED_INIT(CRL_3);
  NO_NEED_INIT(CRL_4);
  NO_NEED_INIT(CRL_5);
  link_write(CRL_6,INIT_CRL_6);
  link_write(CRL_7,INIT_CRL_7);
  link_write(CRL_8,INIT_CRL_8);
  link_write(CRL_9,INIT_CRL_9);
  link_write(CRL_10,INIT_CRL_10);
  link_write(CRL_11,INIT_CRL_11);/*NO_NEED_INIT(CRL_11);*/
  
  link_write(PMFAGC_0,INIT_PMFAGC_0);
  link_write(PMFAGC_1,INIT_PMFAGC_1);
  NO_NEED_INIT(PMFAGC_2);
  NO_NEED_INIT(PMFAGC_3);
  NO_NEED_INIT(PMFAGC_4);
  
  NO_NEED_INIT(CTRL_0);
  NO_NEED_INIT(CTRL_1);
  KEEP_REGISTER_IN_RESET_VALUE(CTRL_2,INIT_CTRL_2);
  KEEP_REGISTER_IN_RESET_VALUE(CTRL_3,INIT_CTRL_3);
  link_write(CTRL_4,INIT_CTRL_4);
  KEEP_REGISTER_IN_RESET_VALUE(CTRL_5,INIT_CTRL_5);
  link_write(CTRL_6,INIT_CTRL_6);
  link_write(CTRL_7,INIT_CTRL_7);
  link_write(CTRL_8,INIT_CTRL_8);
  KEEP_REGISTER_IN_RESET_VALUE(CTRL_9,INIT_CTRL_9);
  
  KEEP_REGISTER_IN_RESET_VALUE(DEINT_SYNC_0,INIT_DEINT_SYNC_0);
  link_write(DEINT_SYNC_1,INIT_DEINT_SYNC_1);
  
  NO_NEED_INIT(BERT_0);      
  NO_NEED_INIT(BERT_1);
  NO_NEED_INIT(BERT_2);
  
  KEEP_REGISTER_IN_RESET_VALUE(DEINT_0,INIT_DEINT_0);
  KEEP_REGISTER_IN_RESET_VALUE(DEINT_1,INIT_DEINT_1);
  RESERVED_REGISTER(DEINT_2);
  RESERVED_REGISTER(DEINT_3);
  
  link_write(OUTFORMAT_0,INIT_OUTFORMAT_0);
  KEEP_REGISTER_IN_RESET_VALUE(OUTFORMAT_1,INIT_OUTFORMAT_1);
  link_write(OUTFORMAT_2,INIT_OUTFORMAT_2);
  
  NO_NEED_INIT(RS_DESC_0);
  NO_NEED_INIT(RS_DESC_1);
  NO_NEED_INIT(RS_DESC_2);
  NO_NEED_INIT(RS_DESC_3);
  NO_NEED_INIT(RS_DESC_4);
  NO_NEED_INIT(RS_DESC_5);
  KEEP_REGISTER_IN_RESET_VALUE(RS_DESC_14,INIT_RS_DESC_14);
  KEEP_REGISTER_IN_RESET_VALUE(RS_DESC_15,INIT_RS_DESC_15);

}

/*----------------------------------------------------------------------------*/
int linkSignalSearch( int QAMSize, unsigned int SymbolRate, int SweepRate, int CarrierOffset, int SpectrumInversion )
{
//  linkReset();

//  linkInitRegisters();
    linkReset();
    linkResetDi() ;
  RegReset();
	 
	linkSweepOff();
	linkWbAgcOff();
  /*
   Parameters setting
  */
  linkSetQamSize( QAMSize );
  linkSetSymbolRate( SymbolRate );
  linkSetSweepRate( SweepRate );
  linkSetFrequencyOffset( CarrierOffset );
  linkSetSpectrumInversion( SpectrumInversion );
  /*
   Clear Timing Table
  */
  linkClearTiming();
  linkWbAgcOn();
  linkSweepOn();
  
  return 0;
}

⌨️ 快捷键说明

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