📄 hamaro_sts.c
字号:
/*****************************************************************************/
static BOOL
STS_CheckErrors()
{
unsigned short read_value;
if (STS_READ(STS_FIFO_ERR, &read_value) == False)
{
return (False);
}
#if STS_ENABLE_SENSE_CHANNEL_TRACE
STSDBG_WR_INT("Read FIFO_ERR = ", read_value);
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
if (read_value == 1)
{
STS_ErrorClear();
}
if (STS_READ(STS_FSM_ERR, &read_value) == False)
{
STSDBG_WR_INT_LN("<<< Read FSM_ERR >>> = ", read_value);
return (False);
}
#if STS_ENABLE_SENSE_CHANNEL_TRACE
STSDBG_WR_INT_LN(" | Read FSM_ERR = ", read_value);
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
if (read_value == 1)
{
STS_ErrorClear();
}
return (True);
}
/*****************************************************************************/
/* STS_ReadyClear() */
/*****************************************************************************/
static BOOL
STS_ReadyClear()
{
if (STS_WRITE(STS_READY_CLR, 1) == False)
{
return (False);
}
#if (HAMARO_WIN_DEBUG & STS_ENABLE_SENSE_CHANNEL_TRACE)
STSDBG_WR_STR("STS Ready Clear = 1", True);
#endif /* HAMARO_WIN_DEBUG */
return (True);
}
/*****************************************************************************/
/* STS_IsReady() */
/*****************************************************************************/
static BOOL
STS_IsReady()
{
unsigned short read_value;
if (STS_READ(STS_READY, &read_value) == False)
{
return (False);
}
if (read_value == 1)
{
return (True);
}
return (False);
}
/*****************************************************************************/
/* STS_WriteFreqCount() */
/*****************************************************************************/
static BOOL
STS_WriteFreqCount(unsigned short value)
{
#if STS_ENABLE_SENSE_CHANNEL_TRACE
STSDBG_WR_INT_LN("STS_FREQ_CNT = ", value);
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
if (STS_WRITE(STS_FREQ_CNT, value) == False)
{
return (False);
}
return (True);
}
/*****************************************************************************/
/* STS_SetObservationWindow() */
/*****************************************************************************/
static BOOL
STS_SetObservationWindow (unsigned short sts_len_sel)
{
#if STS_TEST_DO_REG_PROGRAMMING
#if STS_ENABLE_SENSE_CHANNEL_TRACE
unsigned short read_value;
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
if (STS_WRITE(STS_LEN_SEL, sts_len_sel) == False)
{
return (False);
}
#if STS_ENABLE_SENSE_CHANNEL_TRACE
if (STS_READ(STS_LEN, &read_value) == False)
{
return (False);
}
STSDBG_WR_INT("Read STS_LEN = ", read_value);
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
#if STS_ENABLE_SENSE_CHANNEL_TRACE
if (STS_READ(STS_LEN_SEL, &read_value) == False)
{
return (False);
}
STSDBG_WR_INT_LN(" | Read STS_LEN_SEL = ", read_value);
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
#endif /* STS_TEST_DO_REG_PROGRAMMING */
return (True);
}
/*****************************************************************************/
/* STS_EmptyFifo() */
/*****************************************************************************/
static BOOL
STS_EmptyFifo()
{
#if (HAMARO_WIN_DEBUG & STS_ENABLE_SENSE_CHANNEL_TRACE)
STSDBG_WR_STR("FIFO empty", True);
#endif /* HAMARO_WIN_DEBUG */
if (STS_WRITE(STS_CLR, 0) == False)
{
return (False);
}
return (True);
}
/*****************************************************************************/
/* STS_Enable() : True = Enable; False = Disable */
/*****************************************************************************/
BOOL
STS_Enable(BOOL enable)
{
unsigned short value = ((enable == True) ? 1 : 0);
if (STS_WRITE(STS_ENABLE, value) == False)
{
return (False);
}
value = 0;
if (STS_READ(STS_ENABLE, &value) == False)
{
return (False);
}
#if STS_ENABLE_SENSE_CHANNEL_TRACE
STSDBG_WR_INT_LN("Read STS_ENABLE = ", value);
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
STS_EmptyFifo();
STS_ErrorClear();
STS_CheckErrors();
return (True);
}
/*****************************************************************************/
/* STS_OpenBandwidth() */
/*****************************************************************************/
static BOOL
STS_OpenBandwidth(unsigned long roll_off, unsigned long symb_rate_ksps, long lnb_offset)
{
HAMARO_BCDNO bcd;
long lnboffset;
unsigned long bandwidth;
unsigned long bwAdjFactor;
long sigmadelta;
HAMARO_BCD_set (&bcd, roll_off); /* roll-off x 1000 */
HAMARO_BCD_mult(&bcd, symb_rate_ksps); /* max symbol rate in Ksps */
HAMARO_BCD_div (&bcd, 1000UL);
lnboffset = lnb_offset; /* LNB offset */
bwAdjFactor = HAMARO_BCD_out(&bcd);
bandwidth = (unsigned long)labs(lnboffset) + bwAdjFactor;
#if STS_ENABLE_SENSE_CHANNEL_TRACE
STSDBG_WR_INT_LN("Calculated bandwidth = ", bandwidth);
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
HAMARO_SetTunerBW(hamaro_nim_list.nim[0], bandwidth, &sigmadelta);
return (True);
}
/*****************************************************************************/
/* STS_ProgramPLLMult() */
/*****************************************************************************/
static BOOL
STS_ProgramPLLMult(unsigned long pll_mult)
{
#if STS_ENABLE_SENSE_CHANNEL_TRACE
STSDBG_WR_INT("DMD_addr0x01, PLLMult[5:0] = ", pll_mult);
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
if (HAMARO_RegisterWrite(hamaro_nim_list.nim[0], CX2430X_PLLMULT, pll_mult, HAMARO_DEMOD_I2C_IO) == False)
{
return (False);
}
#if STS_ENABLE_SENSE_CHANNEL_TRACE
{
unsigned long read_value_long;
if (HAMARO_RegisterRead(hamaro_nim_list.nim[0], CX2430X_PLLMULT, &read_value_long, HAMARO_DEMOD_I2C_IO) == False)
{
return (False);
}
STSDBG_WR_INT_LN(" | Read PLLMult[5:0] = ", read_value_long);
}
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
hamaro_nim_list.nim[0]->ucPLLMult_shadow = (unsigned char)pll_mult;
return(True);
}
/*****************************************************************************/
/* STS_SetSymbolRate() */
/*****************************************************************************/
//static long fsample = 99424833UL; /* Fsample = pll_mult*10.111/6=99.42 MHz */
static long fsample = 98333333UL; /* Fsample = pll_mult*10.000/6=99.42 MHz */
//static long fsample = 105000000UL; /* Fsample = 63*10.000/6=99.42 MHz */
static BOOL
STS_SetSymbolRate(unsigned long symbol_rate_ksps)
{
long temp_symbolrate;
unsigned long read_value_long;
STSDBG_WR_INT_LN("symbol_rate_ksps = ", symbol_rate_ksps);
#if STS_ENABLE_SENSE_CHANNEL_TRACE
STSDBG_WR_INT_LN("Calculated fsample = ", fsample);
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
temp_symbolrate = HAMARO_DRIVER_symbolrate_in(symbol_rate_ksps, fsample);
/* write computed value to demod */
if (HAMARO_RegisterWrite(hamaro_nim_list.nim[0], CX2430X_SYSSYMBOLRATE, (unsigned long)temp_symbolrate, HAMARO_DEMOD_I2C_IO) == False)
{
return(False);
}
#if STS_ENABLE_SENSE_CHANNEL_TRACE
STSDBG_WR_INT("Set symbolrate = ", symbol_rate_ksps);
STSDBG_WR_INT(" | Calculated symbolrate = ", temp_symbolrate);
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
if (HAMARO_RegisterRead(hamaro_nim_list.nim[0], CX2430X_SYSSYMBOLRATE, &read_value_long, HAMARO_DEMOD_I2C_IO) == False)
{
return(False);
}
#if STS_ENABLE_SENSE_CHANNEL_TRACE
STSDBG_WR_INT_LN(" | Read symbolrate = ", read_value_long);
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
return (True);
}
/*****************************************************************************/
/* STS_GetSymbolRate() */
/*****************************************************************************/
static BOOL
STS_GetSymbolRate(unsigned long* p_symbolrate)
{
unsigned long temp_symbolrate;
/* read the symbolrate teh demod is set to */
if (HAMARO_RegisterRead(hamaro_nim_list.nim[0], CX2430X_SYSSYMBOLRATE, p_symbolrate, HAMARO_DEMOD_I2C_IO) == False) return(False);
/* compute the symbolrate to be returned to the caller */
temp_symbolrate = (unsigned long)HAMARO_DRIVER_symbolrate_out(*p_symbolrate, fsample);
*p_symbolrate = temp_symbolrate;
#if STS_ENABLE_SENSE_CHANNEL_TRACE
STSDBG_WR_INT_LN("STS_GetSymbolRate = ", *p_symbolrate);
#endif /* STS_ENABLE_SENSE_CHANNEL_TRACE */
return (True);
} /* HAMARO_GetSymbolRate() */
/*****************************************************************************/
/*
Say -1000000 is the frequency.
Consider the magnitude and do the calculation.
fs=99.42 MHz
mag ctl value= (2^16*1/99.42)=659
actual ctl value= (2^16)-(mag ctl value)=64877
64877 binary rep=> 1111110101101101
*/
static BOOL
STS_WriteCenterFreq(signed long frequency_offset)
{
#if STS_TEST_DO_REG_PROGRAMMING
unsigned short read_value;
int neg = 1;
HAMARO_BCDNO bcd;
signed short center_freq_signed;
if (frequency_offset < 0L)
{
neg = -1;
frequency_offset = (frequency_offset * -1L);
}
HAMARO_BCD_set(&bcd,(unsigned long)frequency_offset);
HAMARO_BCD_mult(&bcd,(0x01<<16));
HAMARO_BCD_div(&bcd,fsample);
center_freq_signed = (short)HAMARO_BCD_out(&bcd);
center_freq_signed = (short)(center_freq_signed * neg);
#if STS_ENABLE_VERBOSE_LOG
STSDBG_WR_INT("\nCalculated central_frequency = ", center_freq_signed);
#endif /* STS_ENABLE_VERBOSE_LOG */
if (STS_WRITE(STS_CENTER_FREQ, center_freq_signed) == False)
{
return (False);
}
if (STS_READ(STS_CENTER_FREQ, &read_value) == False)
{
return (False);
}
#if STS_ENABLE_VERBOSE_LOG
STSDBG_WR_INT_LN("Read STS_CENTER_FREQ = ", (signed short)read_value);
#endif /* STS_ENABLE_VERBOSE_LOG */
#endif /* STS_TEST_DO_REG_PROGRAMMING */
return (True);
}
/*****************************************************************************/
/* STS_GetFreqStep() */
/*****************************************************************************/
static BOOL
STS_GetFreqStep(signed long frequency_step, signed short* p_value, unsigned long mfclk)
{
int neg = 1;
HAMARO_BCDNO bcd;
if (frequency_step < 0L)
{
neg = -1;
frequency_step = (frequency_step * -1L);
}
HAMARO_BCD_set(&bcd,(unsigned long)frequency_step);
HAMARO_BCD_mult(&bcd,(0x01<<12));
HAMARO_BCD_div(&bcd,mfclk);
*p_value = (short)HAMARO_BCD_out(&bcd);
*p_value = (short)(*p_value * neg);
*p_value = (signed short)HAMARO_DRIVER_convert_twos_saturate(*p_value, 16);
#if STS_ENABLE_VERBOSE_LOG
#if HAMARO_WIN_DEBUG
// WINDBG_FileWriteNewLine();
#endif /* HAMARO_WIN_DEBUG */
STSDBG_WR_INT("Calculated STS frequency = ", *p_value);
#endif /* STS_ENABLE_VERBOSE_LOG */
return (True);
}
/*****************************************************************************/
/* STS_SetTunerFrequency() */
/*****************************************************************************/
#define TUNER_FREQ_OFFSET 22000000UL /* 22 MHz */
static unsigned long start_freq = 981000000;
static BOOL
STS_SetTunerFrequency(unsigned long frequency, BOOL* p_pll_lock, unsigned long* p_actual_tuner_frequency)
{
if (HAMARO_SetTunerFrequency(hamaro_nim_list.nim[0], frequency) == False)
{
return(False);
}
#if STS_ENABLE_VERBOSE_LOG
STSDBG_WR_INT("Set tuner frequency = ", frequency);
#endif /* STS_ENABLE_VERBOSE_LOG */
if (p_pll_lock != 0)
{
if (HAMARO_TUNER_GetPLLLockStatus(hamaro_nim_list.nim[0], p_pll_lock) == False)
{
return (False);
}
#if STS_ENABLE_VERBOSE_LOG
STSDBG_WR_INT(" | PLL lock = ", *p_pll_lock);
#endif /* STS_ENABLE_VERBOSE_LOG */
}
if (p_actual_tuner_frequency != 0)
{
/* get the tuner pll settings, calculate the deviation */
if (HAMARO_TUNER_GetPLLFrequency(hamaro_nim_list.nim[0], p_actual_tuner_frequency) == False)
{
return(False);
}
#if STS_ENABLE_VERBOSE_LOG
STSDBG_WR_INT_LN(" | Actual tuner frequency = ", *p_actual_tuner_frequency);
#endif /* STS_ENABLE_VERBOSE_LOG */
}
return (True);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -