📄 dcf_drv.c
字号:
unsigned char u8RegData;
bool bRetVal;
/* sanity check */
if(pNim == NULL)
return(False);
/* read ST0_RID_BERT_1 / low byte */
bRetVal = DCF_RegRead(pNim, gDemReg[ST0_RID_BERT_1].addr, 1, &u8RegData, DCF_DEMOD_I2C);
if(bRetVal == False)
return(False);
pNim->ber.dividen = (signed long)u8RegData;
/* read ST0_RID_BERT_2 / high byte */
bRetVal = DCF_RegRead(pNim, gDemReg[ST0_RID_BERT_2].addr, 1, &u8RegData, DCF_DEMOD_I2C);
if(bRetVal == False)
return(False);
pNim->ber.dividen = pNim->ber.dividen + (signed long)(u8RegData << 8);
return (True);
}
/*****************************************************************************/
/* FUNCTION: DCF_DRIVER_Convert_To_Signed */
/* */
/* PARAMETERS: u32Numeric - raw number read from demod. */
/* n32Bitslen - count of lsb's to perform conversion on */
/* */
/* DESCRIPTION: This function converts unsigned number read from demod */
/* into long */
/* */
/* RETURNS: True if successful, False if unsuccessful. */
/* */
/* CONTEXT: Must be called from a non-interrupt context. */
/* */
/*****************************************************************************/
long DCF_DRIVER_Convert_To_Signed(unsigned long u32Numeric, int n32Bitslen)
{
long n32Tmp;
/* test MSB for 1, indicating a negative number */
n32Tmp = (0x01L<<(n32Bitslen-1));
if(((unsigned long)n32Tmp&u32Numeric) != 0x00UL)
{
/* gen a reverse mask, or into numeric */
n32Tmp = ~(n32Tmp-1L);
return((long)(u32Numeric |= (unsigned long)n32Tmp));
}
return((long)u32Numeric);
}
/*****************************************************************************/
/* FUNCTION: DCF_DRIVER_WBAGC_Get_Agc2Sd */
/* */
/* PARAMETERS: pNim - pointer to DCF_NIM struct. */
/* pn32Data - the pointer to the return data. */
/* */
/* DESCRIPTION: The function gets the 10-bit WBAGC agc2sd value */
/* by reading the WBAGC_1 and WBAGC_2 register. */
/* */
/* RETURNS: True if successful, False if unsuccessful. */
/* */
/* CONTEXT: Must be called from a non-interrupt context. */
/* */
/*****************************************************************************/
bool DCF_DRIVER_WBAGC_Get_Agc2Sd (DCF_NIM *pNim, int *pn32Data)
{
unsigned char u8RegData;
int n32Temp;
bool bRetVal;
/* sanity check */
if((pNim == NULL) || (pn32Data == NULL))
return(False);
/* read WBAGC_1 */
/* 0x41[7:0] */
bRetVal = DCF_RegRead(pNim, gDemReg[ST0_RID_WBAGC_1].addr, 1, &u8RegData, DCF_DEMOD_I2C);
if(bRetVal == False)
return(False);
gDemReg[ST0_RID_WBAGC_1].value = u8RegData;
n32Temp = u8RegData;
/* read WBAGC_2 */
/* 0x42[1:0] */
bRetVal = DCF_RegRead(pNim, gDemReg[ST0_RID_WBAGC_2].addr, 1, &u8RegData, DCF_DEMOD_I2C);
if(bRetVal == False)
return(False);
gDemReg[ST0_RID_WBAGC_2].value = u8RegData;
n32Temp = n32Temp + ((u8RegData & 0x0003) << 8);
*pn32Data = n32Temp;
return (True);
}
/*****************************************************************************/
/* FUNCTION: DCF_DRIVER_Get_Init_Demod */
/* */
/* PARAMETERS: pNim - pointer to DCF_NIM struct. */
/* */
/* DESCRIPTION: The function gets the init demod status. */
/* */
/* RETURNS: True if successful, False if unsuccessful. */
/* */
/* CONTEXT: Must be called from a non-interrupt context. */
/* */
/*****************************************************************************/
bool DCF_DRIVER_Get_Init_Demod(DCF_NIM *pNim)
{
unsigned char u8RegData;
bool bRetVal;
/* sanity check */
if(pNim == NULL)
return(False);
/* get 0x25[7] */
bRetVal = DCF_RegRead(pNim, gDemReg[ST0_RID_INITDEM_5].addr, 1, &u8RegData, DCF_DEMOD_I2C);
if(bRetVal == False)
return(False);
/* set init demod flag */
if(u8RegData & 0x80)
return(True);
else
return(False);
}
/*****************************************************************************/
/* FUNCTION: DCF_DRIVER_EQU_SW_Reset */
/* */
/* PARAMETERS: i2cAddr - the i2c address for accessing STV0297 registers. */
/* */
/* DESCRIPTION: This function resets equalizer of STV0297 QAM demodulator */
/* by programming the RESET_EQL bit of CTRL_4 register. The */
/* registers EQU_0 - EQU_4 are also reinitialized. */
/* */
/* RETURNS: True if successful, False if unsuccessful. */
/* */
/* CONTEXT: Must be called from a non-interrupt context. */
/* */
/*****************************************************************************/
bool DCF_DRIVER_EQU_SW_Reset(DCF_NIM *pNim)
{
unsigned char u8RegData;
bool bRetVal;
/* sanity check */
if(pNim == NULL)
return(False);
gDemReg[ST0_RID_CTRL_4].value = gDemReg[ST0_RID_CTRL_4].value | 0x01;
u8RegData = gDemReg[ST0_RID_CTRL_4].value;
bRetVal= DCF_RegWrite(pNim, gDemReg[ST0_RID_CTRL_4].addr, 1, &u8RegData, DCF_DEMOD_I2C);
if(bRetVal == False)
return(False);
gDemReg[ST0_RID_CTRL_4].value = gDemReg[ST0_RID_CTRL_4].value & 0xFE;
u8RegData = gDemReg[ST0_RID_CTRL_4].value;
bRetVal= DCF_RegWrite(pNim, gDemReg[ST0_RID_CTRL_4].addr, 1, &u8RegData, DCF_DEMOD_I2C);
return(bRetVal);
}
/*****************************************************************************/
/* FUNCTION: DCF_DRIVER_SW_Reset */
/* */
/* PARAMETERS: pNim - pointer to DCF_NIM struct. */
/* */
/* DESCRIPTION: This function resets most of STV0297 QAM demodulator */
/* by programming the SOFT_RESET bit of CTRL_0 register. */
/* However, blocks that can be individually reset under */
/* software control are not affected, such as EQ, RS, DI. */
/* The S/W reset is same as grounding pin NRESET of STV0297. */
/* */
/* RETURNS: True if successful, False if unsuccessful. */
/* */
/* CONTEXT: Must be called from a non-interrupt context. */
/* */
/*****************************************************************************/
bool DCF_DRIVER_SW_Reset(DCF_NIM *pNim)
{
unsigned char u8RegData;
bool bRetVal;
/* sanity check */
if(pNim == NULL)
return(False);
/* forces most of the chip to reset by setting SOFT_RESET bit. */
gDemReg[ST0_RID_CTRL_0].value = gDemReg[ST0_RID_CTRL_0].value | 0x01;
u8RegData = gDemReg[ST0_RID_CTRL_0].value;
bRetVal= DCF_RegWrite(pNim, gDemReg[ST0_RID_CTRL_0].addr, 1, &u8RegData, DCF_DEMOD_I2C);
if(bRetVal == False)
return(False);
/* goes out of reset by clearing SOFT_RESET bit. */
gDemReg[ST0_RID_CTRL_0].value = gDemReg[ST0_RID_CTRL_0].value & 0xFE;
u8RegData = gDemReg[ST0_RID_CTRL_0].value;
bRetVal= DCF_RegWrite(pNim, gDemReg[ST0_RID_CTRL_0].addr, 1, &u8RegData, DCF_DEMOD_I2C);
return(bRetVal);
}
/*****************************************************************************/
/* FUNCTION: DCF_DRIVER_DI_SW_Reset */
/* */
/* PARAMETERS: pNim - pointer to DCF_NIM struct. */
/* */
/* DESCRIPTION: The function reset deinterleaver, descrambler sync detector */
/* and deinterleaver sync detector of STV0297 QAM demodulator */
/* by programming the RESET_DI bit of CTRL_1 register. */
/* */
/* RETURNS: True if successful, False if unsuccessful. */
/* */
/* CONTEXT: Must be called from a non-interrupt context. */
/* */
/*****************************************************************************/
bool DCF_DRIVER_DI_SW_Reset(DCF_NIM *pNim)
{
unsigned char u8RegData;
bool bRetVal;
/* sanity check */
if(pNim == NULL)
return(False);
gDemReg[ST0_RID_CTRL_1].value = gDemReg[ST0_RID_CTRL_1].value | 0x01;
u8RegData = gDemReg[ST0_RID_CTRL_1].value;
bRetVal= DCF_RegWrite(pNim, gDemReg[ST0_RID_CTRL_1].addr, 1, &u8RegData, DCF_DEMOD_I2C);
if(bRetVal == False)
return(False);
gDemReg[ST0_RID_CTRL_1].value = gDemReg[ST0_RID_CTRL_1].value & 0xFE;
u8RegData = gDemReg[ST0_RID_CTRL_1].value;
bRetVal= DCF_RegWrite(pNim, gDemReg[ST0_RID_CTRL_1].addr, 1, &u8RegData, DCF_DEMOD_I2C);
return(bRetVal);
}
/*****************************************************************************/
/* FUNCTION: DCF_DRIVER_RS_SW_Reset */
/* */
/* PARAMETERS: pNim - pointer to DCF_NIM struct. */
/* */
/* DESCRIPTION: This function resets R-S block of STV0297 QAM demodulator */
/* by programming the RESET_RS bit of CTRL_3 register. */
/* */
/* RETURNS: True if successful, False if unsuccessful. */
/* */
/* CONTEXT: Must be called from a non-interrupt context. */
/* */
/*****************************************************************************/
bool DCF_DRIVER_RS_SW_Reset(DCF_NIM *pNim)
{
unsigned char u8RegData;
bool bRetVal;
/* sanity check */
if(pNim == NULL)
return(False);
gDemReg[ST0_RID_CTRL_3].value = gDemReg[ST0_RID_CTRL_3].value | 0x10;
u8RegData = gDemReg[ST0_RID_CTRL_3].value;
bRetVal= DCF_RegWrite(pNim, gDemReg[ST0_RID_CTRL_3].addr, 1, &u8RegData, DCF_DEMOD_I2C);
if(bRetVal == False)
return(False);
gDemReg[ST0_RID_CTRL_3].value = gDemReg[ST0_RID_CTRL_3].value & 0xEF;
u8RegData = gDemReg[ST0_RID_CTRL_3].value;
bRetVal= DCF_RegWrite(pNim, gDemReg[ST0_RID_CTRL_3].addr, 1, &u8RegData, DCF_DEMOD_I2C);
return(bRetVal);
}
/*****************************************************************************/
/* FUNCTION: DCF_DRIVER_Start_CT */
/* */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -