cx24116.c
来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 936 行 · 第 1/2 页
C
936 行
#include "CS_I2c.h"
#include "phantom.h"
#include "cs_frnpublic.h"
#include "cs_qpsk.h"
#include "CSHDI_typedef.h"
#include "cs_typedef.h"
#include "CS_assert.h"
#ifdef LSI_PLATFORM
#include "osp.h"
#define LOAD_LENGTH 63
#else
#define LOAD_LENGTH 255
#endif
PHANTOM_NIM nim1;
PHANTOM_TUNER_REF_CLOCKOUT_DIV tuner_ref_clkout_div ;
PHANTOM_CHANOBJ myChanObj ;
PHANTOM_MPEG_OUT m_Mpeg;
ULONG demodHandle;
ULONG m_CrystalFreq;
ULONG m_Pll_multiplier;
CSHDITunerIndex g_TunerIndex;
static HCSHANDLE hCX24116I2C[MAX_TUNER_NUM];
#ifdef SOFT_LIGHT_CONTROL
int LockStatus = FALSE ;
#endif
void SBWrite( ULONG demod_handle, BYTE reg_addr, BYTE data, PULONG status );
void SBMultiWrite(ULONG demod_handle, ULONG data_length, BYTE reg_addr, PBYTE p_data, PULONG status );
BYTE SBRead( ULONG demod_handle, BYTE reg_addr, PULONG status );
CSQPSK_Error_t PHANTOMGetSignalBER( CSHDITunerIndex bTunerIndex, DWORD *pdwBer );
PHANTOM_RX_OPER_MODE Get_rx_operation_mode(BYTE ucStandard, BYTE ucFEC_Rate, BYTE ucModulation);
void SBWrite( ULONG demod_handle, BYTE reg_addr, BYTE data, PULONG status )
{
BYTE ucValue[2];
ULONG ulSerialBusAddr;
ucValue[0] = reg_addr;
ucValue[1] = data;
/* get serial bus address from demod handle: */
#ifdef LSI_PLATFORM
ulSerialBusAddr = (ULONG)(hCX24116I2C[g_TunerIndex] & 0x000000FF);
#else
ulSerialBusAddr=(ULONG)hCX24116I2C[g_TunerIndex];
#endif
if ( CSI2CRequestBus_inner(g_TunerIndex, CSHDI_TIMEOUT_INFINITY) == CSQPSK_SUCCESS )
{
/* perform the write: set *status = 0 if there is NO ERROR */
*status = CSI2CWriteWithStop ( ulSerialBusAddr, ucValue, 2) ;
//CSTRACE( ERROR_LEVEL,"status=%d\r\n",*status);
CSI2CReleaseBus_inner(g_TunerIndex);
}
else
*status=-1;
}
void SBMultiWrite(ULONG demod_handle, ULONG data_length, BYTE reg_addr, PBYTE p_data, PULONG status )
{
DWORD ii;
BYTE ucValue[LOAD_LENGTH+1];
ULONG ulSerialBusAddr;
ULONG ulLength=0;
ULONG ulCount;
#if 0
bValue[0] = reg_addr;
if( data_length>63)
count=64;
else
count=data_length+1;
for ( ii = 1; ii < count; ii++ )
bValue[ii] = *p_data++;
/* get serial bus address from demod handle: */
#ifdef LSI_PLATFORM
serial_bus_addr =(ULONG)(demod_handle & 0x000000FF);
#else
serial_bus_addr=demod_handle;
#endif
if ( CSI2CRequestBus_inner(Tuner_0, CSHDI_TIMEOUT_INFINITY) == CSQPSK_SUCCESS )
{
/* perform the write: set *status = 0 if there is NO ERROR */
*status= CSI2CWriteWithStop ( serial_bus_addr, bValue,count) ;
CSI2CReleaseBus_inner(Tuner_0);
}
else
{
*status =-1;
return;
}
if(data_length>63)
{
length=63;
while(length<data_length)
{
if(length+64<=data_length)
{
count = 64;
}
else
{
count = data_length-length;
}
for ( ii = 0; ii < count; ii++ )
bValue[ii] = *p_data++;
if ( CSI2CRequestBus_inner(Tuner_0, CSHDI_TIMEOUT_INFINITY) == CSQPSK_SUCCESS )
{
/* perform the write: set *status = 0 if there is NO ERROR */
*status= CSI2CWriteWithStop ( serial_bus_addr, bValue,count) ;
CSI2CReleaseBus_inner(Tuner_0);
}
else
{
*status =-1;
return;
}
length=length+count;
}
}
#endif
/* get serial bus address from demod handle: */
#ifdef LSI_PLATFORM
ulSerialBusAddr =(ULONG)(hCX24116I2C[g_TunerIndex] & 0x000000FF);
#else
ulSerialBusAddr=(ULONG)hCX24116I2C[g_TunerIndex];
#endif
ulLength=0;
while(ulLength<data_length)
{
if( (ulLength+LOAD_LENGTH<data_length))
ulCount=LOAD_LENGTH+1;
else
ulCount=data_length+1-ulLength;
ucValue[0] = reg_addr;
for ( ii = 1; ii < ulCount; ii++ )
ucValue[ii] = *p_data++;
if ( CSI2CRequestBus_inner(g_TunerIndex, CSHDI_TIMEOUT_INFINITY) == CSQPSK_SUCCESS )
{
/* perform the write: set *status = 0 if there is NO ERROR */
*status= CSI2CWriteWithStop ( ulSerialBusAddr, ucValue,ulCount) ;
CSI2CReleaseBus_inner(g_TunerIndex);
}
else
{
*status =-1;
return;
}
ulLength=ulLength+ulCount-1;
}
}
BYTE SBRead( ULONG demod_handle, BYTE reg_addr, PULONG status )
{
BYTE ucValue;
BYTE ucRegValue = 0;
ULONG ulSerialBusAddr ;
#ifdef LSI_PLATFORM
ulSerialBusAddr =(ULONG)(hCX24116I2C[g_TunerIndex] & 0x000000FF);
#else
ulSerialBusAddr=(ULONG)hCX24116I2C[g_TunerIndex];
#endif
if ( CSI2CRequestBus_inner(g_TunerIndex, CSHDI_TIMEOUT_INFINITY) == CSQPSK_SUCCESS )
{
ucValue = reg_addr;
*status= CSI2CWriteWithoutStop ( ulSerialBusAddr, &ucValue, 1 ) ;
//CSSleep(2000);
*status+=CSI2CReadWithStop (ulSerialBusAddr, &ucRegValue, 1 ) ;
CSI2CReleaseBus_inner(g_TunerIndex);
}
else
*status =-1;
return ucRegValue;
}
/*******************************************************************************************************
* PHANTOM_CheckChipID()
* function to read the chipID
*******************************************************************************************************/
CSQPSK_Error_t PHANTOM_CheckChipID(CSHDITunerIndex bTunerIndex )
{
BYTE ucRegAddr = 0xFF; // reg 0xFF
ULONG status;
BYTE ucChipID;
int ii=10;
CSI2COpen(bTunerIndex,0x0000000a,&hCX24116I2C[bTunerIndex]);
/*software reset*/
SBWrite(hCX24116I2C[bTunerIndex], 0xf0, 0x03, &status);
do
{
ucChipID = SBRead(hCX24116I2C[bTunerIndex], ucRegAddr, &status);
CSTRACE( ERROR_LEVEL, "Demod chipID=0x%2.2X status=%d\r\n", ucChipID, status);
if(status==0&&ucChipID==0x05)
{
return CSQPSK_SUCCESS;
}
else
{
CSQPSKReset(bTunerIndex);
SBWrite(hCX24116I2C[bTunerIndex], 0xf0, 0x03, &status);
}
ii--;
}while(ii>0);
return CSQPSK_FAILURE;
}
/*******************************************************************************************************
* PHANTOM__Init()
* function to initialize the NIM
*******************************************************************************************************/
CSQPSK_Error_t PHANTOM_Init(CSHDITunerIndex bTunerIndex,CSHDITsMode TSOutMode)
{
BOOL bResult = FALSE;
g_TunerIndex = bTunerIndex;
m_CrystalFreq = 40444000; // 40.444MHz for CX24116/CX24118 design
m_Pll_multiplier = PHANTOM_DEFAULT_VIPER_PLL_MULT;
demodHandle = 0x0000000a;//(ULONG)hCX24116I2C[bTunerIndex];
tuner_ref_clkout_div = PHANTOM_TUNER_REF_CLKOUT_DIV1;
m_Mpeg.output_mode = PHANTOM_PARALLEL_OUT;
m_Mpeg.clk_parity_mode = PHANTOM_CLK_CONTINUOUS;
m_Mpeg.insert_sync_byte = PHANTOM_SYNC_BYTE_INSERT;
m_Mpeg.tei_bit = PHANTOM_TEI_BIT_SET;
m_Mpeg.invert_clk = PHANTOM_CHANGING_ON_FALLING;
m_Mpeg.null_data_mode = PHANTOM_FIXED_NULL_DATA_DISABLED;
m_Mpeg.null_data_value = PHANTOM_FIXED_NULL_DATA_LOW;
m_Mpeg.start_signal_polarity = PHANTOM_ACTIVE_HIGH;//change polarity
m_Mpeg.start_signal_width = PHANTOM_BYTE_WIDE;//change mode according to CI specification
m_Mpeg.valid_signal_polarity = PHANTOM_ACTIVE_HIGH;
m_Mpeg.valid_signal_active_mode = PHANTOM_ENTIRE_PACKET;
m_Mpeg.fail_signal_polarity = PHANTOM_ACTIVE_LOW;
m_Mpeg.fail_signal_active_mode = PHANTOM_FIRST_BYTE;
m_Mpeg.clk_out_edge = PHANTOM_CLKOUT_EDGE;
m_Mpeg.tristate_config = PHANTOM_TSTATE_MPEG_OFF;
m_Mpeg.extra_clocks_between_packets = 0;
if(TSOutMode==TS_SERIAL)
{
m_Mpeg.output_mode = PHANTOM_SERIAL_OUT_DATA0;
}
#ifdef QPSK_DEBUG
CSTRACE( ERROR_LEVEL,"demodHandle=0x%x",demodHandle);
CSTRACE( ERROR_LEVEL,"m_Mpeg.output_mode=%d",m_Mpeg.output_mode);
CSTRACE( ERROR_LEVEL,"begintime=%d\r\n",CSGetTickCount());
#endif
bResult = PHANTOM_InitEnvironment(&nim1, demodHandle, SBMultiWrite, SBWrite, SBRead, m_CrystalFreq, tuner_ref_clkout_div, m_Pll_multiplier, &m_Mpeg);
if (bResult == TRUE)
{
#ifdef QPSK_DEBUG
CSTRACE( ERROR_LEVEL,"endtime=%d\r\n",CSGetTickCount());
CSTRACE( ERROR_LEVEL,"[PHANTOM_InitEnvironment]succed!\r\n");
#endif
}
else
{
#ifdef QPSK_DEBUG
CSTRACE( ERROR_LEVEL,"[PHANTOM_InitEnvironment]failed!\r\n");
#endif
return (CSQPSK_FAILURE);
}
if( PHANTOM_BERControl(&nim1,PHANTOM_BER_WINDOW_TWO_POWER_8,PHANTOM_BER_WINDOW_TWO_POWER_8)!=True)
{
#ifdef QPSK_DEBUG
CSTRACE( ERROR_LEVEL,"PHANTOM_BERControl failed!\r\n");
#endif
return(CSQPSK_FAILURE);
}
return CSQPSK_SUCCESS;
}
CSQPSK_Error_t PHANTOMGetLockStatus ( CSHDITunerIndex bTunerIndex, int *pnLockStatus )
{
PHANTOM_ACQ_STATE acqState;
PHANTOM_LOCKIND lockInd;
BOOL bResult;
bResult=PHANTOM_Monitor(&nim1, &acqState, &lockInd);
#ifdef QPSK_DEBUG
CSTRACE( ERROR_LEVEL,"[PHANTOM_Monitor]acqState=%d,lockInd=%d,%d,%d,%d\r\n",acqState,lockInd.pll,lockInd.demod_sync,lockInd.ldpc,lockInd.bch);
#endif
if(bResult==True)
{
if (acqState == PHANTOM_ACQ_LOCKED_AND_TRACKING)
{
#ifdef QPSK_DEBUG
CSTRACE( ERROR_LEVEL,"PHANTOM_ACQ_LOCKED_AND_TRACKING\r\n");
#endif
*pnLockStatus = TRUE;
#ifdef SOFT_LIGHT_CONTROL
if( LockStatus!= *pnLockStatus)
{
m_Mpeg.fail_signal_polarity = PHANTOM_ACTIVE_LOW;//green
PHANTOM_SetOutputOptions(&nim1,&m_Mpeg);
LockStatus=TRUE;
}
#endif
}
else
{
#ifdef QPSK_DEBUG
CSTRACE( ERROR_LEVEL,"NOLOCKING!\r\n");
#endif
*pnLockStatus = FALSE;
#ifdef SOFT_LIGHT_CONTROL
if( LockStatus!= *pnLockStatus)
{
m_Mpeg.fail_signal_polarity = PHANTOM_ACTIVE_HIGH;//red
PHANTOM_SetOutputOptions(&nim1,&m_Mpeg);
LockStatus=FALSE;
}
#endif
}
return CSQPSK_SUCCESS;
}
else
return CSQPSK_FAILURE;
}
/*******************************************************************************************************
* OnChangeChannelNim1(ULONG newFrequency)
* function to search signal
*******************************************************************************************************/
CSQPSK_Error_t PHANTOMSearchingSignal( CSHDITunerIndex bTunerIndex,CSQPSKCHANNEL *pCSCHANNEL )
{
BOOL bResult;
int ii=10;
int nLockStatus = FALSE;
int nLoopCnt = 1;
int Mode;
myChanObj.specinv = PHANTOM_SPEC_INV_ON_BOTH;
myChanObj.lnbdc = PHANTOM_LNBDC_HIGH;
myChanObj.lnbtone = PHANTOM_LNBTONE_OFF;
myChanObj.rolloff = PHANTOM_ROLLOFF_02;
myChanObj.requested_search_range = 5000; /* kHz */
myChanObj.viterbicoderates = 0;
myChanObj.frequency = pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency;
myChanObj.symbrate=pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate;
myChanObj.pilot=pCSCHANNEL->m_ucPilot;
myChanObj.rx_operation_mode=/*Get_rx_operation_mode(DVBS_STANDARD,FEC3_4,CS_QPSK);*/Get_rx_operation_mode(pCSCHANNEL->m_ucstandard,pCSCHANNEL->m_bFECRates,pCSCHANNEL->m_ucModulation);
myChanObj.acqmode = PHANTOM_ACQ_MODE_BLIND;
myChanObj.lnb_offset = 0;
if (PHANTOM_MODE_DVB_UNDEF == myChanObj.rx_operation_mode)/*add by th on 070514for FEC auto option*/
{
CSTRACE(1, "s mode undefine!!\r\n");
nLoopCnt = 5;
Mode = (int)PHANTOM_MODE_DVB_1_2;//46;
myChanObj.rx_operation_mode = (PHANTOM_RX_OPER_MODE) Mode;
}
else if (PHANTOM_S2_QPSK_MODE_UNDEF == myChanObj.rx_operation_mode)
{
CSTRACE(1, "s2 mode QPSK undefine!!\r\n");
nLoopCnt = 8;
Mode = (int)PHANTOM_MODE_3;//4//4;
myChanObj.rx_operation_mode = (PHANTOM_RX_OPER_MODE) Mode;
}
else if (PHANTOM_S2_8PSK_MODE_UNDEF == myChanObj.rx_operation_mode)
{
CSTRACE(1, "s2 mode 8PSK undefine!!\r\n");
nLoopCnt = 6;
Mode = (int)PHANTOM_MODE_11;//12;
myChanObj.rx_operation_mode = (PHANTOM_RX_OPER_MODE) Mode;
}
do
{
CSTRACE(1, "mode ==== %d\r\n", myChanObj.rx_operation_mode);
bResult= PHANTOM_ChangeChannel(&nim1, &myChanObj);
//#ifdef QPSK_DEBUG
CSTRACE( ERROR_LEVEL,"[[PHANTOMSearchingSignal]m_ucstandard=%d,m_bFECRates=%d,m_ucModulation=%d\r\n",pCSCHANNEL->m_ucstandard,pCSCHANNEL->m_bFECRates,pCSCHANNEL->m_ucModulation);
CSTRACE( ERROR_LEVEL,"[PHANTOMSearchingSignal]%d,%d,%d,%d\r\n",myChanObj.frequency, myChanObj.symbrate, myChanObj.pilot,myChanObj.rx_operation_mode);
//#endif
if (bResult == FALSE)
{
//#ifdef QPSK_DEBUG
CSTRACE( ERROR_LEVEL,"[PHANTOMSearchingSignal]failed!\r\n");
//#endif
//return CSQPSK_FAILURE;
//break;
}
else
{
//#ifdef QPSK_DEBUG
//CSTRACE( ERROR_LEVEL,"[PHANTOMSearchingSignal]succed!\r\n");
//#endif
while( ii>0)
{
PHANTOMGetLockStatus(bTunerIndex,&nLockStatus);
if(nLockStatus==TRUE)
{
break;
}
ii--;
CSQPSKSleep(bTunerIndex, 20);
}
PHANTOMGetLockStatus(bTunerIndex,&nLockStatus);
if(nLockStatus == TRUE)
{
long LNBOffset ;
PHANTOM_GetLNBOffset(&nim1,&LNBOffset);
pCSCHANNEL->m_nFrequencyOffset = LNBOffset;
//CSTRACE(ERROR_LEVEL,"LNBOffset=%d,pCSCHANNEL->m_nFrequencyOffset=%d\r\n",LNBOffset,pCSCHANNEL->m_nFrequencyOffset);
//return CSQPSK_SUCCESS;
break;
}
else
{
ii = 10;/*锁定尝试次数复位*/
Mode ++;
myChanObj.rx_operation_mode = (PHANTOM_RX_OPER_MODE) Mode;
//CSSleep(2000);
}
}
} while (--nLoopCnt);
if (TRUE == nLockStatus)
{
return CSQPSK_SUCCESS;
}
else if (FALSE == nLockStatus)
{
return CSQPSK_FAILURE;
}
}
CSQPSK_Error_t PHANTOMGetSignalBER( CSHDITunerIndex bTunerIndex, DWORD *pdwBer )
{
ULONG ulCorrBitErrRate;
WORD wUncorrFrameErrRate;
WORD WBerWindowAdjustment;
PHANTOM_MSTATUS mstatus;
DWORD dwCorrectedBitErrorRate;
int ii;
int nLockStatus;
int nErrorCode;
BYTE ucaRxMode[ ]={ 41, 44, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 40, 46, 47, 48, 49, 50};
WORD waBitsPerFrame[ ]={1168,1168,32400,38880,43200,48600,51840,54000,57600,58320,38880,43200,48600,54000,57600,58320,1168,1632,1632,1632,1632,1632};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?