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

📄 hamaro_sts.c

📁 机顶盒Hamaro解调器驱动。包含自动搜台
💻 C
📖 第 1 页 / 共 5 页
字号:
/*****************************************************************************/
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 + -