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

📄 hamaro_cx24128.c

📁 机顶盒Hamaro解调器驱动。包含自动搜台
💻 C
📖 第 1 页 / 共 5 页
字号:
		{
			return (False);
		}
	}
	else
	{
		return (False);
	}
	return (True);
}

/*******************************************************************************************************
 * HAMARO_TUNER_CX24128_powerup() 
 * performs tuner power-up reset 
 *******************************************************************************************************/
BOOL        
HAMARO_TUNER_CX24128_powerup(HAMARO_NIM  *p_nim)  /* pointer to nim */
{
	unsigned long tuner_handle;
	unsigned char chipid;
	HAMARO_VIPERPARMS    viperparms;

	HAMARO_CX24128_refresh_tuner_pll_lock = True; 
	

	/* determine the io method */
         /* supports I2C repeater mode */

	/* Initialize the register offset in case of dual tuner system */
         p_nim->tuner.cx24128.register_offset = 0;
	p_nim->tuner.cx24128.io_method = HAMARO_VIPER_I2C_IO;


	if (p_nim->tuner.cx24128.io_method == HAMARO_VIPER_I2C_IO)
	{
		/* First of all, detect the I2C address of Mongoose or Viper. */
		/* Try I2C address 1, read chip ID. */
		if (HAMARO_TUNER_CX24128_EnableDemodRepeaterMode(p_nim) == False)
		{
			return (False);
		}

		tuner_handle = p_nim->demod_handle;
		HAMARO_SET_DEMOD_HANDLE_I2C_ADDR(tuner_handle, HAMARO_CX24128_I2C_ADD1);

                  /* --- CR 21101 begin --- */
		if (HAMARO_TUNER_CX24128_SetDemodRepeaterMode(p_nim) == False)
		{
			return(False);
		}
       
                 /* HW reset puts pulse out on tuner serial bus causing the very first transaction to fail.*/ 
                 /* This is a dummy read to fix that.*/
       	        chipid = (*p_nim->SBRead)(tuner_handle, HAMARO_CX24128_CHIP_ID_00, &p_nim->iostatus);
                 /* --- CR 21101 end --- */

		if (HAMARO_TUNER_CX24128_SetDemodRepeaterMode(p_nim) == False)
		{
			return(False);
		}

		chipid = (*p_nim->SBRead)(tuner_handle, HAMARO_CX24128_CHIP_ID_00, &p_nim->iostatus);

		if ((p_nim->iostatus != 0UL) || ((chipid != HAMARO_VIPER_CHIP_ID) && (chipid != MONGOOSE_CHIP_ID))) /* Check address 2. */
		{
			tuner_handle = p_nim->demod_handle;
			HAMARO_SET_DEMOD_HANDLE_I2C_ADDR(tuner_handle, HAMARO_CX24128_I2C_ADD2);

			if (HAMARO_TUNER_CX24128_RepeaterModeReadData(p_nim, tuner_handle, HAMARO_CX24128_CHIP_ID_00, &chipid) == False)
			{   /* Both addresses failed, return error. */
				return(False);
			}
		}

		/* check chip ID, make sure it is Mongoose/Viper. */
		if ((chipid != HAMARO_VIPER_CHIP_ID) && (chipid != MONGOOSE_CHIP_ID))
		{
			return(False);
		}

		/* Keep the chip ID value. */
		p_nim->tuner.cx24128.chipid = chipid;

		/* Keep the tuner_handle value for later use. */
		p_nim->tuner.cx24128.tuner_handle = tuner_handle;

		/* Get tuner version (global) */
		if (HAMARO_TUNER_CX24128_RepeaterModeReadData(p_nim, tuner_handle, HAMARO_CX24128_CHIP_VERSION_01, &p_nim->tuner.cx24128.version) == False)
		{   
			return(False);
		}
	}
	

	p_nim->tuner.cx24128.tuner_gain_thresh = -50; /* -50dBm default */
	p_nim->tuner.cx24128.gain_setting_selection = HAMARO_SIGNAL_LEVEL_LOW;

	/* Set reference frequency to use crystal frequency. */
	if (HAMARO_TUNER_CX24128_SetReferenceFreq(p_nim, HAMARO_RFREQ_0) != True) 
	{
		return(False);
	}

	/* Set parameters. */
	/* Initialize ICP parameters. */   
	viperparms.ICPmode = HAMARO_ICPMODE_AUTO;       /* ICP auto mode by default. */           

	/* The folowing values are for XTAL < 11 MHz */
	if (p_nim->xtal < HAMARO_CX24128_ICP_XTAL_THRESH)
	{
	  viperparms.ICPauto_Hi    = HAMARO_ICPAUTO_LEVEL4;     /* Auto analog ICP levels, 2.0 mA */
	  viperparms.ICPauto_MedHi = HAMARO_ICPAUTO_LEVEL4;     /* 2.0 mA */
	  viperparms.ICPauto_MedLo = HAMARO_ICPAUTO_LEVEL3;     /* 1.5 mA */
	  viperparms.ICPauto_Lo    = HAMARO_ICPAUTO_LEVEL3;     /* 1.5 mA */
	}
	else /* The folowing values are for XTAL > 11 MHz */
	{      
	  viperparms.ICPauto_Hi    = HAMARO_ICPAUTO_LEVEL4;     /* Auto analog ICP levels, 2.0 mA */
	  viperparms.ICPauto_MedHi = HAMARO_ICPAUTO_LEVEL4;     /* 2.0 mA */
	  viperparms.ICPauto_MedLo = HAMARO_ICPAUTO_LEVEL3;     /* 1.5 mA */
	  viperparms.ICPauto_Lo    = HAMARO_ICPAUTO_LEVEL2;     /* 1.0 mA */
	}

	viperparms.ICPdig = HAMARO_ICPDIG_LEVEL3;      /* 2.0 times */
	viperparms.ICPman = HAMARO_ICPMAN_LEVEL1;       /* ICP manual mode default. */
	viperparms.ACP_on = True;             /* Analog CP off by default. */
	/* Initialize VCO parameters. Include set VCO mode to be AUTO. */   
	viperparms.VcoMode    = HAMARO_VCOMODE_AUTO;
	viperparms.Vcobs      = HAMARO_VCOBANDSHIFT_HIGH;
	viperparms.VcobandSel = HAMARO_VCOBANDSEL_1;
	viperparms.Bsdelay    = 0x08;             /* Band sel delay value, default is 8 */
    
         /* Band sel freq cnt */
	viperparms.Bsfreqcnt = 0x0FFF;          

        /* Band sel ref div value */
	viperparms.Bsrdiv    = 0x0FFF;             

	/* Initialize other parameters. */
	viperparms.PrescalerMode = False;

	/* Enable hardware parts. */
	HAMARO_TUNER_CX24128_SetEnableRegister(p_nim, 0x3D); /* FTA LNA is disabled */

#if HAMARO_INCLUDE_RATTLER
	if (p_nim->tuner_type == HAMARO_CX24113) /* Rattler specific */
	{
		viperparms.lna_gain = HAMARO_LNA_MAX_GAIN; /* LNA gain (max) */
	}
#endif /*HAMARO_INCLUDE_RATTLER */

	 /* -- Mongoose RevB -- */
         viperparms.RFVGABiasControl = True; /* Disable (=1) RFVGA bias control circuit */

	/* Set parameters to tuner and nim. */
	HAMARO_TUNER_CX24128_SetParameters(p_nim, &viperparms);

	/* Set Gain default values. */
	HAMARO_TUNER_CX24128_SetGainSettings(p_nim, 0UL);

	/* Set BW default settings. */
	HAMARO_TUNER_CX24128_SetFilterBandwidth(p_nim, 18025UL);

	/* Set DSM clk inversion. */
	HAMARO_TUNER_CX24128_SetClkInversion(p_nim, True);
	
       HAMARO_FWindowEnable = True;

    /* Set the Mongoose ref clock output (HAMARO_CX24128_REFSEL_SPI_DIV1 is the default setting) */
	if (p_nim->xtal >= HAMARO_CX24128_A3_XTAL_FREQ) /* div 2 for A3 */
	{
		if (HAMARO_TUNER_CX24128_GlobalSetRefSelSpi(p_nim, HAMARO_CX24128_REFSEL_SPI_DIV2) != True)
		{
			return(False);
		}
	}
	else
	{
		if (HAMARO_TUNER_CX24128_GlobalSetRefSelSpi(p_nim, HAMARO_CX24128_REFSEL_SPI_DIV1) != True)
		{
			return(False);
		}
	}
    return(True);
}/* HAMARO_TUNER_CX24128_powerup() */


/*******************************************************************************************************
 * HAMARO_TUNER_CX24128_SetReferenceDivider() 
 * sets the current reference divider value to nim only
 *******************************************************************************************************/
BOOL     
HAMARO_TUNER_CX24128_SetReferenceDivider(HAMARO_NIM     *p_nim,  /* pointer to nim */
                                        HAMARO_RDIVVAL  rvalue) /* reference divider value */
{
  HAMARO_TUNER_CX24128_VALIDATE(p_nim);

    if (p_nim->tuner.cx24128.vcodiv == HAMARO_VCODIV4 && p_nim->tuner.cx24128.chipid == HAMARO_VIPER_CHIP_ID) /* CR 21579 */
    {
        rvalue = HAMARO_RDIV_2;
    }

    if (p_nim->tuner.cx24128.chipid == HAMARO_VIPER_CHIP_ID && p_nim->tuner.cx24128.register_offset != 0) /* Tuner B */ 
    {
	    if (p_nim->xtal >= HAMARO_CX24128_A3_XTAL_FREQ) /* Always set reference division ratio to /2 for A3 */
	    {
            rvalue = HAMARO_RDIV_2;
	    }		
    }

  switch(rvalue)
  {
    case  HAMARO_RDIV_1:
    case  HAMARO_RDIV_2:
    {
		p_nim->tuner.cx24128.R = rvalue;
		break;
    }
    default:
    {
      HAMARO_DRIVER_SET_ERROR(p_nim,HAMARO_TUNERREF);
      return(False);
      break;
    }
  }  /* switch(... */

  return(True);
}  /* HAMARO_TUNER_CX24128_SetReferenceDivider() */

/*******************************************************************************************************
 * HAMARO_TUNER_CX24128_GetReferenceFreq() 
 * retrieves current reference frequency value from nim
 *******************************************************************************************************/
BOOL      
HAMARO_TUNER_CX24128_GetReferenceFreq(HAMARO_NIM       *p_nim,    /* pointer to nim */
                               HAMARO_RFREQVAL  *p_fvalue) /* pointer to HAMARO_RFREQVAL where value is returned to caller */
{
	HAMARO_TUNER_CX24128_VALIDATE(p_nim);
  
	*p_fvalue = p_nim->tuner.cx24128.rfreqval;

	return(True);
}  /* HAMARO_TUNER_CX24128_GetReferenceFreq() */


/*******************************************************************************************************
 * HAMARO_TUNER_CX24128_SetVcoDivider() 
 * sets the vco divider to nim structure 
 *******************************************************************************************************/
BOOL     
HAMARO_TUNER_CX24128_SetVcoDivider(HAMARO_NIM     *p_nim, /* pointer to nim */
                            HAMARO_VCODIV  vcodiv) /* vco divider value */
{
	HAMARO_TUNER_CX24128_VALIDATE(p_nim);

	p_nim->tuner.cx24128.vcodiv = vcodiv;

	return(True);
}  /* HAMARO_TUNER_CX24128_SetVcoDivider() */

/*******************************************************************************************************
 * HAMARO_TUNER_CX24128_GetParameters() 
 * returns current tuner parameter settings to the caller 
 *******************************************************************************************************/
BOOL        
HAMARO_TUNER_CX24128_GetParameters(HAMARO_NIM         *p_nim,        /* pointer to nim */
                            HAMARO_VIPERPARMS  *p_viperparms) /* pointer to HAMARO_VIPERPARMS, where copy will be written */
{
  unsigned long reg_value;

  HAMARO_TUNER_CX24128_VALIDATE(p_nim);

  if (p_viperparms == 0)  
  {
	  return(False);
  }

    /* copy tunerparms to caller storage */
    memcpy(p_viperparms, &p_nim->tuner.cx24128.viperparms, sizeof(HAMARO_VIPERPARMS));

    /* Those values may be updated by harware. */
    if (HAMARO_RegisterRead(p_nim, HAMARO_CX24128_VCO_BSH_SPI, &reg_value, p_nim->tuner.cx24128.io_method) != True)  
    {
	    return(False);
    }

    p_viperparms->Vcobs = (HAMARO_VCOBANDSHIFT)reg_value;

    /* set the vco band shift to the tuner */
    if (HAMARO_RegisterRead(p_nim, HAMARO_CX24128_VCO_SEL_SPI, &reg_value, p_nim->tuner.cx24128.io_method) != True)  
    {
	    return(False);
    }

    p_viperparms->VcobandSel = (HAMARO_VCOBANDSEL)reg_value;

    /* -- Mongoose RevB -- */
    if (reg_value == 0) /* could be VCO6 */
    {
        if (HAMARO_RegisterRead(p_nim, HAMARO_CX24128_VCO6_SEL_SPI, &reg_value, p_nim->tuner.cx24128.io_method) != True)  
	    {
		    return(False);
	    }
        if (reg_value != 0)
        {
            p_viperparms->VcobandSel = HAMARO_VCOBANDSEL_6;
        }
    }
	
	if (HAMARO_RegisterRead(p_nim, HAMARO_CX24128_BS_FREQ, &reg_value, p_nim->tuner.cx24128.io_method) != True)  
	{
		return(False);
	}
	p_viperparms->Bsfreqcnt = (unsigned short)reg_value;
	
	if (HAMARO_RegisterRead(p_nim, HAMARO_CX24128_BS_DIV_CNT, &reg_value, p_nim->tuner.cx24128.io_method) != True)  
	{
		return(False);
	}
	p_viperparms->Bsrdiv = (unsigned short)reg_value;

	return(True);
}  /* HAMARO_TUNER_CX24128_GetParameters() */

/*******************************************************************************************************
 * HAMARO_TUNER_CX24128_SetParameters() 
 * sets passed in parameters in nim and into tuner
 *******************************************************************************************************/
BOOL        
HAMARO_TUNER_CX24128_SetParameters(HAMARO_NIM         *p_nim,        /* pointer to nim */
                            HAMARO_VIPERPARMS  *p_viperparms) /* copy of HAMARO_VIPERPARMS to use as default */
{
	unsigned long    reg_value;

	HAMARO_TUNER_CX24128_VALIDATE(p_nim);

	if (p_viperparms == 0)  
	{
		return(False);
	}

	/* copy from user-buffer to tuner buffer */
	memcpy(&p_nim->tuner.cx24128.viperparms, p_viperparms, sizeof(HAMARO_VIPERPARMS));
  
	/* Set ICP settings to tuner. */
	/* ICP mode */
	reg_value = (unsigned long)p_viperparms->ICPmode;

	if (HAMARO_RegisterWrite(p_nim, (unsigned short)(HAMARO_CX24128_MOR), reg_value, p_nim->tuner.cx24128.io_method) != True)  
	{
		return(False);
	}
  
	/* ICP manual level. It's O.K if manual level is undefined.*/
	if (p_viperparms->ICPman != HAMARO_ICPMAN_UNDEF)
	{
		switch(p_viperparms->ICPman)
		{
			case HAMARO_ICPMAN_LEVEL1:
			case HAMARO_ICPMAN_LEVEL2:
			case HAMARO_ICPMAN_LEVEL3:
			case HAMARO_ICPMAN_LEVEL4:
				reg_value = (unsigned long)p_viperparms->ICPman;
				break;
			default:
			{
				/* Need define a new ERROR number. */
				//HAMARO_DRIVER_SET_ERROR(p_nim,HAMARO_TUNERREF);
				return(False);

⌨️ 快捷键说明

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