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

📄 hamaro_api.c

📁 机顶盒Hamaro解调器驱动。包含自动搜台
💻 C
📖 第 1 页 / 共 5 页
字号:
/* HAMARO_api.c test */

/*+++ *******************************************************************\
*
*   Copyright and Disclaimer:
*
*       ---------------------------------------------------------------
*       ALL SOFTWARE, APPLICATIONS, DOCUMENTATION, OR MATERIALS        
*       FURNISHED HEREIN IS PROVIDED *AS IS*.  CONEXANT DOES NOT MAKE  
*       ANY WARRANTIES, EITHER EXPRESS OR IMPLIED, AND HEREBY EXPRESSLY
*       DISCLAIMS ANY AND ALL SUCH WARRANTIES TO THE EXTENT PERMITTED  
*       BY LAW, INCLUDING, SPECIFICALLY, ANY IMPLIED WARRANTY ARISING  
*       BY STATUTE OR OTHERWISE IN LAW OR FROM A COURSE OF DEALING OR  
*       USAGE OF TRADE.  CONEXANT DOES NOT MAKE ANY WARRANTIES, EITHER 
*       EXPRESS OR IMPLIED, AND HEREBY EXPRESSLY DISCLAIMS ANY AND ALL 
*       SUCH WARRANTIES WITH RESPECT TO ALL SOFTWARE, APPLICATIONS,    
*       DOCUMENTATION, AND MATERIALS INCLUDING ALL IMPLIED WARRANTIES  
*       OF MERCHANTABILITY, OR OF MERCHANTABLE QUALITY, OR OF FITNESS  
*       FOR ANY PURPOSE, PARTICULAR, SPECIFIC OR OTHERWISE, OR OF      
*       NONINFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OF OTHERS,     
*       RELATING TO THE SOFTWARE, APPLICATIONS, OPERATION,             
*       DOCUMENTATION, DATA OR RESULTS GENERATED BY THE OPERATION OR   
*       USE THEREOF, AND MATERIALS PROVIDED HEREIN.  THE ENTIRE RISK AS
*       TO THE SUBSTANCE, QUALITY AND PERFORMANCE OF SOFTWARE,         
*       APPLICATIONS, AND DOCUMENTATION DESCRIBING SUCH SOFTWARE       
*       REMAINS WITH THE BUYER.                                        
*                                                                      
*       REGARDLESS OF WHETHER ANY REMEDY SET FORTH HEREIN FAILS OF ITS 
*       ESSENTIAL PURPOSE OR OTHERWISE, CONEXANT SHALL NOT BE LIABLE   
*       FOR ANY EXEMPLARY, SPECIAL, PUNITIVE, SPECULATIVE, INDIRECT,   
*       CONSEQUENTIAL OR INCIDENTAL DAMAGES OF ANY KIND (INCLUDING     
*       WITHOUT LIMITATION LOST PROFITS, LOSS OF INCOME, LOSS OF       
*       GOODWILL, OR OTHER TANGIBLE OR INTANGIBLE BUSINESS LOSS)       
*       ARISING OUT OF OR IN CONNECTION WITH, DIRECTLY OR INDIRECTLY,  
*       SOFTWARE, APPLICATIONS, DOCUMENTATION, OR ANY SERVICES OR      
*       MATERIALS PROVIDED HEREUNDER, OR USE OR INABILITY TO USE THE   
*       SOFTWARE, EVEN IF CONEXANT HAS BEEN ADVISED OF THE POSSIBILITY 
*       OF SUCH DAMAGES.                                               
*
*       Copyright (c) 2001 Conexant Systems, Inc.
*       All Rights Reserved.
*       ---------------------------------------------------------------
*
*   Module Revision Id:
*
*       $Header: hamaro_api.c, 24, 2007-8-17 15:36:12, Tim Lu$
*
*   Abstract:
*
*       Hamaro API functions
*
\******************************************************************* ---*/

#include <time.h>                      /* ANSI Standard */
#include <stdlib.h>                    /* ANSI Standard */
#include <ctype.h>                     /* ANSI Standard */
#include <string.h>                    /* ANSI Standard */

#include "hamaro.h"                     /* Hamaro include files: ordered */
#include "hamaro_regs.h"                /* Hamaro Internal */

#include "hamaro_sts.h"

#if HAMARO_INCLUDE_ROSIE
extern BOOL HAMARO_TUNER_CX24108_SetVCOEdges(HAMARO_NIM *nim,HAMARO_VCO_EDGE *vcoedge);
#endif /* HAMARO_INCLUDE_ROSIE */

/*******************************************************************************************************/
/* static arrays visible to this file only */
/*******************************************************************************************************/
static BOOL HAMARO_SetTunerBWAndGain(HAMARO_NIM *nim, HAMARO_SYMBRATE  symbolrate);
static BOOL HAMARO_AddNim(HAMARO_NIM* p_nim);
/*******************************************************************************************************/
/* HAMARO_InitEnvironment() */
/* function to initialize a HAMARO_NIM* passed by application */
/*******************************************************************************************************/
BOOL           
HAMARO_InitEnvironment(HAMARO_NIM      *nim,                              /* nim pointer used by all API functions */
					  unsigned long    demodhandle,                       /* demod handle to be associated with this HAMARO_NIM (user-specific) */
					  HAMARO_WRITE_SB  SBwrite,                           /* pointer to user-supplied low-level read I/O function */
					  HAMARO_READ_SB   SBread,                            /* pointer to user-supplied low-level read I/O function */	
					  BOOL (*HAMARO_TUNER_install)(HAMARO_NIM *nim),      /* function that will install a specific tuner  */
					  unsigned long    crystalfreq,                       /* crystal (,freq of) attached to HAMARO_NIM card */
					  HAMARO_VCOINIT   vcoinit,                           /* TRUE if VCO edges are to be detected for tuner attached to present HAMARO_NIM */
					  HAMARO_MPEG_OUT  *mpeg,                       /* default MPEG settings */
					  HAMARO_LNBMODE   *lnbmode,                    /* pointer to struct that will set initial settings for LNB (if NULL, defaults are used) */
					  BOOL (*waitfunct)(HAMARO_NIM *nim,int mscount))    /* pointer to user-defined wait function (if null, default function is used) */
{
    unsigned long  ulRegVal;
	unsigned char bytData;

    /* perform a couple of stupidity tests... */
    if (nim == (HAMARO_NIM*)NULL)
    {
        HAMARO_DRIVER_SET_ERROR(nim,HAMARO_INVALID_NIM);
        return(False);
    }

    if (HAMARO_DRIVER_ValidNim(nim) == True)
    {
        /* invalid nim or already allocated */
        HAMARO_DRIVER_SET_ERROR(nim,HAMARO_NIM_OPENED);
        return(False);
    }

    /* clear the entire nim struct */
    memset(nim,CNULL,sizeof(HAMARO_NIM));

    /* un-install any previously installed wait function (The correct calling pattern */
    /* --> for two-nim sys:  Init(1),HAMARO_SetWait(1); Init(2), HAMARO_SetWait(2) ) */
    if (HAMARO_SetDriverWait(nim,waitfunct) == False)  
    {
        return(False);
    }

    /* reset various nim fields */
    nim->berbusy = -1;
    nim->bytebusy = -1;
    nim->blockbusy = -1;
    nim->pnberbusy = -1;
    nim->pnberpolarity = 0x01L;
    nim->CLKSMDIV_flag = HAMARO_CLKSMOOTHDIV_UPDATE;
    nim->CLKSMDIV_CR = HAMARO_CODERATE_NONE;

    /* clear the esno fields */
    memset(nim->esno.esno_taps,CNULL,sizeof(nim->esno.esno_taps));
    nim->esno.esno = 0;
    nim->esno.last_esno = -1L;
    nim->esno.taps_idx = 0;
    nim->esno.table = NULL;

#if HAMARO_INCLUDE_DEBUG
    /* indicate no present error */
    nim->__errno = HAMARO_NOERR;
#endif /* HAMARO_INCLUDE_DEBUG */

    /* No tuner selection */
    if (HAMARO_TUNER_install == 0)
    {
		HAMARO_DRIVER_SET_ERROR(nim, HAMARO_INIT_TUNER);
        return(False);
    }

    nim->pll_frequency = HAMARO_NIM_DEFAULT_FREQ;
    nim->lnboffset = HAMARO_NIM_DEFAULT_LNB;
    nim->symbol_rate_ideal = HAMARO_NIM_DEFAULT_SYMB;
    nim->symbol_rate = HAMARO_NIM_DEFAULT_SYMB;
    nim->prevstate = HAMARO_ACQ_OFF;

    nim->tuner_offset = 0UL;             /* (CR 6243) */
    nim->actual_tuner_offset = 0L;       /* (CR 6243) */
    nim->swa_count = 0;                  /* (CR 6243) */

    /* place the new nim into the hamaro_nim_list */
	HAMARO_AddNim(nim);

	/* Verify register map */
	HAMARO_REGMAP_TEST(nim);

    /* save the demod handle, i/o function pointers */
    nim->demod_handle = demodhandle;
    nim->SBWrite = SBwrite;
    nim->SBRead = SBread;

    /* Initialize read/write functions for STS module */
    STS_Init(SBread, SBwrite);

    /* flag bad sbread/sbwrite functions as errors */
    if (nim->SBWrite == NULL || nim->SBRead == NULL)
    {
        HAMARO_DRIVER_SET_ERROR(nim,HAMARO_SBIO_NULL);
        return(False);
    }

    /* grab chip version */
    HAMARO_RegisterRead(nim,CX2430X_SYSVERSION,&nim->version, HAMARO_DEMOD_I2C_IO);

    /* test for valid crystal */
    if (crystalfreq < (unsigned long)(HAMARO_FREQ_XTAL_LOW*HAMARO_MM) || crystalfreq > (unsigned long)(HAMARO_FREQ_XTAL_HIGH*HAMARO_MM))
    {
        /* xtal presented at init...() is out-of-bounds */
        HAMARO_DRIVER_SET_ERROR(nim,HAMARO_INIT_XTAL);
        return(False);
    }

    nim->xtal = crystalfreq;
	
    /* Viper uses 40Mhz crystal and 10Mhz, in the case of 40Mhz, demod
        * uses half the frequency. Since Mustang/Rosie always uses <= 20Mhz,
        * the below calculations should be O.K. with Rosie. */
	// Overide - Using dual xtals for Virgo board.
	nim->xtal				= 10000000;
    nim->crystal_freq		= 10000000;
    nim->tuner_crystal_freq = 10111000;

	/* When XTAL freq < 20MHz */
	nim->sample_freq_less_than_4msps = (HAMARO_SAMPLE_FREQ_LT_4MSPS_PLL_MULT * nim->crystal_freq) / 6;
	nim->sample_freq_nom_val         = (HAMARO_SAMPLE_FREQ_NOM_VAL_PLL_MULT  * nim->crystal_freq) / 6;
  
    /* determine the type of demod */
    if (HAMARO_DRIVER_CxType(nim,&nim->demod_type,NULL) != True)  
    {
        return(False);
    }

	nim->register_offset = 0;

    /* place the demod into a known state (if demod is unknon, record a warning) */
    if (HAMARO_DRIVER_Preset(nim) != True)  
    {
        HAMARO_DRIVER_SET_ERROR(nim,HAMARO_CXTYPE);
    }
    if (HAMARO_DRIVER_Reset(nim) != True)  
    {
        return(False);
    }

	/* workaround to try to keep Hamaro powered up and clocked*/
	bytData = 0x39;
	if (HAMARO_WriteReg(nim,0xff,&bytData) == False)  
	{
		return(False);
	}

	bytData = 0x00;
	if (HAMARO_WriteReg(nim,0xef,&bytData) == False)  
	{
		return(False);
	}
	//bytData = 0x80;
	//if (HAMARO_WriteReg(nim,0x67,&bytData) == False)  
	//{
	//	return(False);
	//}

    /* initialize PLLMult shadow with default value */
    nim->ucPLLMult_shadow = (unsigned char)hamaro_demod_register_map[CX2430X_PLLMULT].default_value;

	/* initialize the pdmfout register gain setting with the default power on value */	
	ulRegVal = 0UL;
	if(HAMARO_RegisterRead(nim, CX2430X_DMDSAMPLEGAIN, &ulRegVal, HAMARO_DEMOD_I2C_IO) == FALSE) return(FALSE);
	nim->pdmfout = ulRegVal;

    /* Install the tuner specified by the user */
    if ((*HAMARO_TUNER_install)(nim) == False)
    {
        HAMARO_DRIVER_SET_ERROR(nim,HAMARO_INIT_TUNER);
        return(False);
    }

#if HAMARO_INCLUDE_ROSIE
	nim->TUNER_io_method = HAMARO_TUNERIO_UNDEF;

	if (nim->tuner_type == HAMARO_CX24108)
	{
		nim->TUNER_io_method = HAMARO_TUNER_BURST; /* default tuner i/o method */
	}
#endif /* HAMARO_INCLUDE_ROSIE */

    /* test that a valid tuner (i.e. function pointer!=NULL) was installed */
    if (HAMARO_TUNER_Initialize == NULL)
    {
        HAMARO_DRIVER_SET_ERROR(nim,HAMARO_INIT_TUNER);
        return(False);
    }

    /* initialize the tuner specified by the caller in HAMARO_TUNER_install passed into this function */
    if ((*HAMARO_TUNER_Initialize)(nim) == False)
    {
        HAMARO_DRIVER_SET_ERROR(nim,HAMARO_INIT_TUNER);
        return(False);
    }
	
#if HAMARO_INCLUDE_ROSIE
    if (vcoinit == True && nim->tuner_type == HAMARO_CX24108)
    {
        /* find tuner VCO edges */
        if (HAMARO_FindVCOEdges(nim, HAMARO_DEFAULT_RDIVVAL) == False)  
        {
            return(False);
        }
    }
#else
	vcoinit = False;
#endif

    /* initiate MPEG system */
    nim->temp_SyncPunctMode = -1;
    if (mpeg == NULL)
    {
        HAMARO_DRIVER_SET_ERROR(nim,HAMARO_INIT_MPEG);
        return(False);
    }

    if (HAMARO_SetOutputOptions(nim,mpeg) == False)  
    {
        return(False);
    }

    /* set the LNB mode parameters */
    if (HAMARO_SetLNBMode(nim,lnbmode) == False)  
    {
        return(False);
    }

#if HAMARO_INCLUDE_BANDWIDTHADJ
	nim->tuner_bw_adjust = False;
#endif

    nim->shadowed_tuner_freq = 0;
    nim->shadowed_tuner_lnboffset = 0;
    nim->shadowed_tuner_symbrate = 0;

    if (HAMARO_RegisterWrite(nim, CX2430X_AGCTHRESH, hamaro_demod_register_map[CX2430X_AGCTHRESH].default_value, HAMARO_DEMOD_I2C_IO) == False)
    {
        return (False);
    }
    return(True);
}  /* HAMARO_InitEnvironment() */


/*******************************************************************************************************/
/* HAMARO_ChangeChannel() */
/* High-level function to perform channel-change operation */
/*******************************************************************************************************/
BOOL     
HAMARO_ChangeChannel(HAMARO_NIM      *nim,                      /* nim pointer */
                  HAMARO_CHANOBJ  *chanobj)
				  
{
  long      acqoffset;
  long      tuneroffset;
  long      freqoffset;
#if HAMARO_INCLUDE_RATTLER
  long      div_cnt_val = 0;
  long      freq_val = 0;
#endif  
  unsigned char byte_data;

  unsigned int  vrates;        /* temp viterbi search rates */

	/* if chanobj is bad, bail immediately */
	if (chanobj == NULL)
	{
		HAMARO_DRIVER_SET_ERROR(nim,HAMARO_BAD_PARM);
		return(False);
	} 
	
	HAMARO_DRIVER_VALIDATE_NIM(nim);

	byte_data = 0x40; /* Clear auto acq.(toggle bit 6) */
  	if (HAMARO_WriteReg(nim,0xee,&byte_data) == False)  
	{
		return(False);
	}
	byte_data = 0x00;
  	if (HAMARO_WriteReg(nim,0xee,&byte_data) == False)  
	{
		return(False);
	}

  /* set the transport spec */
	if (nim->tspec != chanobj->transpec)
	{
		if (HAMARO_SetTransportSpec(nim,chanobj->transpec) == False)  
		{
			return(False);

⌨️ 快捷键说明

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