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

📄 dcf_drv.c

📁 机顶盒解调芯片DCF8722驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
   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 + -