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

📄 tmbsl10046.c

📁 TDA10046驱动源代码.TDA10046是PHILIPS的一款DVB-T TUNER
💻 C
📖 第 1 页 / 共 5 页
字号:
//-----------------------------------------------------------------------------
// $Header: 
// (C) Copyright 2001 Philips Semiconductors, All rights reserved
//
// This source code and any compilation or derivative thereof is the sole
// property of Philips Corporation and is provided pursuant to a Software
// License Agreement.  This code is the proprietary information of Philips
// Corporation and is confidential in nature.  Its use and dissemination by
// any party other than Philips Corporation is strictly limited by the
// confidential information provisions of the Agreement referenced above.
//-----------------------------------------------------------------------------
// FILE NAME:    tmbsl10046.c
//
// DESCRIPTION:  Function for the silicon demodulator TDA10046
//
// DOCUMENT REF: <References to specification or other documents related to
//               this module>
//
// NOTES:        1.11 03/29/02 12:37:09
//-----------------------------------------------------------------------------
//

//-----------------------------------------------------------------------------
// Standard include files:
//-----------------------------------------------------------------------------
//
#include "..\..\Include\tmbslDemodTer.h"
#include <math.h>   // for log10 in tmbsl10046GetSNR()

//-----------------------------------------------------------------------------
// Project include files:
//-----------------------------------------------------------------------------
//
#include "debug.h"
#include "tmbsl10046local.h"

//-----------------------------------------------------------------------------
// Types and defines:
//-----------------------------------------------------------------------------
//

//-----------------------------------------------------------------------------
// Global data:
//-----------------------------------------------------------------------------
//

//-----------------------------------------------------------------------------
// Internal Prototypes:
//-----------------------------------------------------------------------------
//
tmErrorCode_t tmbsl10046GetCBER (tmUnitSelect_t demodUnit,	UInt32 *puCBER);
tmErrorCode_t tmbsl10046GetIQ (tmUnitSelect_t demodUnit, UInt32 *puIQ);
tmErrorCode_t tmbsl10046GetFreqResp (tmUnitSelect_t demodUnit, UInt32 *puFreqResp);
tmErrorCode_t tmbsl10046GetImpulResp (tmUnitSelect_t demodUnit, UInt32 *puImpulResp);
tmErrorCode_t tmbsl10046GetConfidence (tmUnitSelect_t demodUnit, UInt32 *puConfidence);

tmErrorCode_t Tda10046WriteInit(tm10046object_t *psObject);
Bool Tda10046WriteRF (tm10046object_t *psObject, UInt32 uRF, tmhalFERfOffset_t eRFO);
Bool Tda10046WriteNextScan (tm10046object_t *psObject);
Bool Tda10046WriteNextOffset (tm10046object_t *psObject);
Bool Tda10046ResetAll (tm10046object_t *psObject);
Bool Tda10046UseTPSbit (tm10046object_t *psObject);
Bool Tda10046InitTick (tm10046object_t *psObject, UInt16 wTime);
Bool Tda10046WaitTick (tm10046object_t *psObject);

//-----------------------------------------------------------------------------
// Exported functions:
//-----------------------------------------------------------------------------
//

//-----------------------------------------------------------------------------
// Initialization functions:
//-----------------------------------------------------------------------------
//

//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl10046Init:
//
// DESCRIPTION: create an instance of a TDA10046 demodulator
//
// RETURN:      TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
//              TM_OK
//  
// NOTES:       
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10046Init(
    tmUnitSelect_t	demodUnit,				//  I: Demodulator unit number
    tmbslDtParam_t  sParam					//  I: setup parameters
    )
{
    //----------------------
    // test input parameters
    //----------------------
    // test the max number
    if (demodUnit > TDA10046_MAX_UNITS)
        return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;

	// return if already initialized
    if(g10046Instance[demodUnit].sApiFlags.iInit == True)
        return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;

    //----------------
    // init the object
    //----------------
    // initialize the object
    g10046Instance[demodUnit].sApiFlags.iInit = True;
    g10046Instance[demodUnit].uDemodHwAdd = sParam.uHwAddress;
    g10046Instance[demodUnit].systemFunc = sParam.systemFunc;
	g10046Instance[demodUnit].tunerFunc = sParam.tunerFunc;
    g10046Instance[demodUnit].eTunerUnit = sParam.eTunerUnit;
    
    // call init function here to prevent calling SetConfig if the default values are OK
	return Tda10046WriteInit(&g10046Instance[demodUnit]);
}


//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl10046DeInit:
//
// DESCRIPTION: destroy an instance of a TDA10046 tuner
//
// RETURN:      TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
//              TMBSL_ERR_DEMOD_NOT_INITIALIZED
//              TM_OK
//
// NOTES:       
//-----------------------------------------------------------------------------
//
tmErrorCode_t 
tmbsl10046DeInit (
    tmUnitSelect_t demodUnit     //  I: Demod unit number
    )
{
    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (demodUnit > TDA10046_MAX_UNITS)
        return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;

    // test the object
    if (g10046Instance[demodUnit].sApiFlags.iInit == False)
        return TMBSL_ERR_DEMOD_NOT_INITIALIZED;

    //-------------------------
    // De-initialize the object
    //-------------------------
    g10046Instance[demodUnit].sApiFlags.iInit = False;

    return TM_OK;
}


//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl10046GetSWVersion:
//
// DESCRIPTION: Return the version of this device
//
// RETURN:      TM_OK
//
// NOTES:       Values defined in the tm10046local.h file
//-----------------------------------------------------------------------------
//
tmErrorCode_t   
tmbsl10046GetSWVersion (
    ptmSWVersion_t     pSWVersion        //  I: Receives SW Version 
    )
{
    pSWVersion->compatibilityNr = TDA10046_BSL_COMP_NUM;
    pSWVersion->majorVersionNr  = TDA10046_BSL_MAJOR_VER;
    pSWVersion->minorVersionNr  = TDA10046_BSL_MINOR_VER;

    return TM_OK;
}

//-----------------------------------------------------------------------------
// Configuration functions:
//-----------------------------------------------------------------------------
//

//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl10046SetPowerState:
//
// DESCRIPTION: Set the power state of the 10046
//
// RETURN:		TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
//				TMBSL_ERR_DEMOD_NOT_INITIALIZED
//              TM_ERR_IIC_ERR   
//				TM_OK
//
// NOTES:       
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10046SetPowerState(
		tmUnitSelect_t		demodUnit,			//  I: demodUnit number
		tmPowerState_t		ePowerState			//  I: Power state of the device
		)
{
    UInt32 uByte;

	//----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (demodUnit > TDA10046_MAX_UNITS)
        return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;

    // test the object
    if (g10046Instance[demodUnit].sApiFlags.iInit == False)
        return TMBSL_ERR_DEMOD_NOT_INITIALIZED;

    //----------------------
    // Implementation
    //----------------------
	switch (ePowerState)
	{
		case tmPowerStandby:
			uByte = TDA10046_CONFC4_ICSTDBY_BIT;
			break;
		case tmPowerOn:
			uByte = 0;
			break;
	}
	
    // program the chip
	if (g10046Instance[demodUnit].systemFunc.SY_WriteBit(
		g10046Instance[demodUnit].uDemodHwAdd,
		TDA10046_CONF_C4_IND, TDA10046_CONFC4_ICSTDBY_BIT, 
		uByte) != 1)
		return TM_ERR_IIC_ERR;

    return TM_OK;
}

//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl10046GetPowerState:
//
// DESCRIPTION: Set the power state of the 10046
//
// RETURN:		TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
//				TMBSL_ERR_DEMOD_NOT_INITIALIZED
//              TM_ERR_IIC_ERR
//				TM_OK
//
// NOTES:       
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10046GetPowerState(
	tmUnitSelect_t		demodUnit,			//  I: demodUnit number
	ptmPowerState_t		pPowerState			//  O: Receives current power state
    )
{
    UInt32 uByte;
	
	//----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (demodUnit > TDA10046_MAX_UNITS)
        return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;

    // test the object
    if (g10046Instance[demodUnit].sApiFlags.iInit == False)
        return TMBSL_ERR_DEMOD_NOT_INITIALIZED;

    //----------------------
    // Implementation
    //----------------------
	if (g10046Instance[demodUnit].systemFunc.SY_Read(
		g10046Instance[demodUnit].uDemodHwAdd,
		TDA10046_CONF_C4_IND, 1,
		&uByte) != 1)
		return TM_ERR_IIC_ERR;

	if (uByte & TDA10046_CONFC4_ICSTDBY_BIT)	
		*pPowerState = tmPowerStandby;
	else
		*pPowerState = tmPowerOn;

    return TM_OK;
}

//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl10046SetConfig:
//
// DESCRIPTION: Set the config of the 10046
//
// RETURN:		TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
//				TMBSL_ERR_DEMOD_NOT_INITIALIZED
//              TM_ERR_BAD_PARAMETER
//				TM_OK
//
// NOTES:       This function can be removed if needed
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10046SetConfig(
    tmUnitSelect_t     demodUnit,		//  I: demodUnit number
    UInt32             uItemId,			//  I: Identifier of the item to modify
    UInt32             uValue			//  I: Value to set for the config item
    )
{
    UInt32 puByteBuffer[2];

    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (demodUnit > TDA10046_MAX_UNITS)
        return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;

    // test the object
    if (g10046Instance[demodUnit].sApiFlags.iInit == False)
        return TMBSL_ERR_DEMOD_NOT_INITIALIZED;

    //--------------
    // set the value
    //--------------
    switch((tm10046cfgIndex_t)uItemId)
    {
		case BOARD:
			// default hardware config
			g10046Instance[demodUnit].sConfig.uXtall			= OM57XX_XTALL_DEF;
			g10046Instance[demodUnit].sConfig.bPLL_MFactor		= OM57XX_PLLMFACTOR_DEF;
			g10046Instance[demodUnit].sConfig.bPLL_NFactor		= OM57XX_PLLPFACTOR_DEF;
			g10046Instance[demodUnit].sConfig.bPLL_PFactor		= OM57XX_PLLPFACTOR_DEF;
			g10046Instance[demodUnit].sConfig.bBerDepth			= OM57XX_BERDEPTH_DEF;
			g10046Instance[demodUnit].sConfig.bIQ_Swapped		= OM57XX_IQSWAPPED_DEF;
            g10046Instance[demodUnit].sConfig.bExtOffset        = OM57XX_EXTOFFSET_DEF;
            g10046Instance[demodUnit].sConfig.bOffset125k       = OM57XX_OFFSET125K_DEF;
            g10046Instance[demodUnit].sConfig.uIF   		    = OM57XX_IF_DEF;
            g10046Instance[demodUnit].sConfig.bWatchdog		    = OM57XX_WATCHDOG_DEF;
            g10046Instance[demodUnit].sConfig.bNbRetry		    = OM57XX_NBRETRY_DEF;
            g10046Instance[demodUnit].sConfig.bPulseKiller		= OM57XX_PULSEKILLER_DEF;
            g10046Instance[demodUnit].sConfig.bXtall100ppm	    = OM57XX_XTALL100PPM_DEF;
            g10046Instance[demodUnit].sConfig.bAgcTun		    = OM57XX_AGCTUN_DEF;
            g10046Instance[demodUnit].sConfig.bAgcPolaTun		= OM57XX_AGCPOLATUN_DEF;
            g10046Instance[demodUnit].sConfig.bAgcPolaIf		= OM57XX_AGCPOLAIF_DEF;
            g10046Instance[demodUnit].sConfig.bAgcTunMax		= OM57XX_AGCTUNMAX_DEF;
            g10046Instance[demodUnit].sConfig.bAgcTunMin		= OM57XX_AGCTUNMIN_DEF;
            g10046Instance[demodUnit].sConfig.bAgcIfMax		    = OM57XX_AGCIFMAX_DEF;
            g10046Instance[demodUnit].sConfig.bAgcIfMin		    = OM57XX_AGCIFMIN_DEF;
	        g10046Instance[demodUnit].sConfig.bOUT_Poclk		= OM57XX_OUTPOCLK_DEF;
	        g10046Instance[demodUnit].sConfig.bOUT_ParaSer		= OM57XX_OUTPARASER_DEF;
	        g10046Instance[demodUnit].sConfig.bOUT_MsbLsb		= OM57XX_OUTMSBLSB_DEF;
	        g10046Instance[demodUnit].sConfig.bOUT_ModeAB		= OM57XX_OUTMODEAB_DEF;
	        g10046Instance[demodUnit].sConfig.bOUT_ParaDiv		= OM57XX_OUTPARADIV_DEF;

			// specific soft config
			switch (uValue & 0x000000ff)
			{
			case 0x00:
				g10046Instance[demodUnit].sConfig.bOffset125k = 0;
				break;
			case 0x01:
				g10046Instance[demodUnit].sConfig.bOffset125k = 1;
				break;
			default:
				return TM_ERR_NOT_SUPPORTED;
			}

			// specific board config
			switch (uValue & 0xffff0000)
			{
			case OM5748_BOARD_DEF:
                // sub-board
                switch(uValue & 0xff00)
                {
                case 0x0000:
                    g10046Instance[demodUnit].sConfig.uIF = 36166666;
                    g10046Instance[demodUnit].sConfig.bAgcTun = 0;
                    g10046Instance[demodUnit].sConfig.bAgcIfMax = 0xff;
                    break;
                case 0x0100:
                    g10046Instance[demodUnit].sConfig.uIF = 36000000;
                    g10046Instance[demodUnit].sConfig.bAgcTun = 0;
                    g10046Instance[demodUnit].sConfig.bAgcIfMax = 0xff;
                    break;
                case 0x0200:
                case 0x0300:
                    g10046Instance[demodUnit].sConfig.uIF = 36166666;
                    g10046Instance[demodUnit].sConfig.bAgcTun = 1;
                    g10046Instance[demodUnit].sConfig.bAgcIfMax = 0x75;
                    break;
                case 0x0400:
                    g10046Instance[demodUnit].sConfig.uIF = 36125000;
                    g10046Instance[demodUnit].sConfig.bAgcTun = 1;
                    g10046Instance[demodUnit].sConfig.bAgcIfMax = 0x80;
                    break;
                case 0x0500:
                    g10046Instance[demodUnit].sConfig.uIF = 36166666;
                    g10046Instance[demodUnit].sConfig.bAgcTun = 0;
                    g10046Instance[demodUnit].sConfig.bAgcIfMax = 0xff;
                    break;
                case 0x0600:
                    g10046Instance[demodUnit].sConfig.uIF = 36130000;
                    g10046Instance[demodUnit].sConfig.bAgcTun = 0;
                    g10046Instance[demodUnit].sConfig.bAgcIfMax = 0xff;
                    break;
                case 0x0700:
                    g10046Instance[demodUnit].sConfig.uIF = 36166666;
                    g10046Instance[demodUnit].sConfig.bAgcTun = 1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -