📄 hamaro_api.c
字号:
/* 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 + -