#ifndef __DVBT_DEMOD_BASE_H
#define __DVBT_DEMOD_BASE_H

/**

@file

@brief   OOB demod base module definition

OOB demod base module definitions contains demod module structure, demod funciton pointers, and demod definitions.

*/


#include "foundation.h"





// Definitions

// Bandwidth modes
#define DVBT_BANDWIDTH_NONE			-1
enum
{
	DVBT_BANDWIDTH_6MHZ,
	DVBT_BANDWIDTH_7MHZ,
	DVBT_BANDWIDTH_8MHZ,
};
#define DVBT_BANDWIDTH_MODE_NUM		3


// Constellation
enum
{
	DVBT_CONSTELLATION_QPSK,
	DVBT_CONSTELLATION_16QAM,
	DVBT_CONSTELLATION_64QAM,
};
#define DVBT_CONSTELLATION_NUM		3


// Hierarchy
enum
{
	DVBT_HIERARCHY_NONE,
	DVBT_HIERARCHY_ALPHA_1,
	DVBT_HIERARCHY_ALPHA_2,
	DVBT_HIERARCHY_ALPHA_4,
};
#define DVBT_HIERARCHY_NUM			4


// Code rate
enum
{
	DVBT_CODE_RATE_1_OVER_2,
	DVBT_CODE_RATE_2_OVER_3,
	DVBT_CODE_RATE_3_OVER_4,
	DVBT_CODE_RATE_5_OVER_6,
	DVBT_CODE_RATE_7_OVER_8,
};
#define DVBT_CODE_RATE_NUM			5


// Guard interval
enum
{
	DVBT_GUARD_INTERVAL_1_OVER_32,
	DVBT_GUARD_INTERVAL_1_OVER_16,
	DVBT_GUARD_INTERVAL_1_OVER_8,
	DVBT_GUARD_INTERVAL_1_OVER_4,
};
#define DVBT_GUARD_INTERVAL_NUM		4


// FFT mode
enum
{
	DVBT_FFT_MODE_2K,
	DVBT_FFT_MODE_8K,
};
#define DVBT_FFT_MODE_NUM			2





// Function 4 dependence
#define DVBT_FUNC4_REG_VALUE_NUM			5





// Register entry definitions

// Register entry
typedef struct
{
	unsigned char PageNo;
	unsigned char RegStartAddr;
	unsigned char ByteNum;
	unsigned long Mask;
	unsigned char Shift;
}
DVBT_REG_ENTRY;



// Primary register entry
typedef struct
{
	int RegBitName;
	unsigned char PageNo;
	unsigned char RegStartAddr;
	unsigned char ByteNum;
	unsigned char Msb;
	unsigned char Lsb;
}
DVBT_PRIMARY_REG_ENTRY;





// Register table dependence

// Demod register bit names
enum DVBT_REG_BIT_NAME
{
	// Software reset register
	DVBT_SOFT_RST,

	// Tuner I2C forwording register
	DVBT_IIC_REPEAT,

	// Registers for initializing
	DVBT_REG_PFREQ_1_0,
	DVBT_PD_DA8,
	DVBT_LOCK_TH,
	DVBT_BER_PASS_SCAL,
	DVBT_TR_WAIT_MIN_8K,
	DVBT_RSD_BER_FAIL_VAL,
	DVBT_CE_FFSM_BYPASS,
	DVBT_ALPHAIIR_N,
	DVBT_ALPHAIIR_DIF,
	DVBT_EN_TRK_SPAN,
	DVBT_EN_BK_TRK,
	DVBT_DAGC_TRG_VAL,
	DVBT_AGC_TARG_VAL,
	DVBT_REG_PI,
	DVBT_LOCK_TH_LEN,
	DVBT_CCI_THRE,
	DVBT_CCI_MON_SCAL,
	DVBT_CCI_M0,
	DVBT_CCI_M1,
	DVBT_CCI_M2,
	DVBT_CCI_M3,
	DVBT_SPEC_INIT_0,
	DVBT_SPEC_INIT_1,
	DVBT_SPEC_INIT_2,

	// Registers for initializing according to mode
	DVBT_TRK_KS_P2,
	DVBT_TRK_KS_I2,
	DVBT_TR_THD_SET2,
	DVBT_TRK_KC_P2,
	DVBT_TRK_KC_I2,
	DVBT_CR_THD_SET2,

	// Registers for initializing according to tuner type
	DVBT_PSET_IFFREQ,
	DVBT_SPEC_INV,
	DVBT_VTOP,
	DVBT_KRF,

	// Registers for bandwidth programming
	DVBT_BW_INDEX,

	// FSM stage register
	DVBT_FSM_STAGE,

	// TPS content registers
	DVBT_RX_CONSTEL,
	DVBT_RX_HIER,
	DVBT_RX_C_RATE_LP,
	DVBT_RX_C_RATE_HP,
	DVBT_GI_IDX,
	DVBT_FFT_MODE_IDX,
	
	// Performance measurement registers
	DVBT_RSD_BER_EST,
	DVBT_EST_EVM,

	// AGC registers
	DVBT_RF_AGC_VAL,
	DVBT_IF_AGC_VAL,
	DVBT_DAGC_VAL,

	// AGC relative registers
	DVBT_POLAR_RF_AGC,
	DVBT_POLAR_IF_AGC,
	DVBT_LOOP_GAIN_3_0,
	DVBT_LOOP_GAIN_4,
	DVBT_AAGC_HOLD,
	DVBT_EN_RF_AGC,
	DVBT_EN_IF_AGC,
	DVBT_IF_AGC_MIN,
	DVBT_IF_AGC_MAX,
	DVBT_RF_AGC_MIN,
	DVBT_RF_AGC_MAX,
	DVBT_IF_AGC_MAN,
	DVBT_IF_AGC_MAN_VAL,
	DVBT_RF_AGC_MAN,
	DVBT_RF_AGC_MAN_VAL,

	// TS interface registers
	DVBT_CK_OUT_PAR,
	DVBT_CK_OUT_PWR,
	DVBT_SYNC_DUR,
	DVBT_ERR_DUR,
	DVBT_SYNC_LVL,
	DVBT_ERR_LVL,
	DVBT_VAL_LVL,
	DVBT_SERIAL,
	DVBT_SER_LSB,
	DVBT_CDIV_PH0,
	DVBT_CDIV_PH1,

	// FSM state-holding register
	DVBT_SM_BYPASS,

	// Registers for function 2
	DVBT_UPDATE_REG_2,

	// Registers for function 3
	DVBT_BTHD_P3,
	DVBT_BTHD_D3,

	// Registers for function 4
	DVBT_FUNC4_REG0,
	DVBT_FUNC4_REG1,
	DVBT_FUNC4_REG2,
	DVBT_FUNC4_REG3,
	DVBT_FUNC4_REG4,
	DVBT_FUNC4_REG5,
	DVBT_FUNC4_REG6,
	DVBT_FUNC4_REG7,
	DVBT_FUNC4_REG8,
	DVBT_FUNC4_REG9,
	DVBT_FUNC4_REG10,

	// Registers for functin 5
	DVBT_FUNC5_REG0,
	DVBT_FUNC5_REG1,
	DVBT_FUNC5_REG2,
	DVBT_FUNC5_REG3,
	DVBT_FUNC5_REG4,
	DVBT_FUNC5_REG5,
	DVBT_FUNC5_REG6,
	DVBT_FUNC5_REG7,
	DVBT_FUNC5_REG8,
	DVBT_FUNC5_REG9,
	DVBT_FUNC5_REG10,
	DVBT_FUNC5_REG11,
	DVBT_FUNC5_REG12,
	DVBT_FUNC5_REG13,
	DVBT_FUNC5_REG14,
	DVBT_FUNC5_REG15,
	DVBT_FUNC5_REG16,
	DVBT_FUNC5_REG17,
	DVBT_FUNC5_REG18,

	// Test registers for test only
	DVBT_TEST_REG_1,
	DVBT_TEST_REG_2,
	DVBT_TEST_REG_3,
	DVBT_TEST_REG_4,

	// Item terminator
	DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
};



// Register table length definitions
#define DVBT_REG_TABLE_LEN_MAX			DVBT_REG_BIT_NAME_ITEM_TERMINATOR





// DVB-T demod module pre-definition
typedef struct DVBT_DEMOD_MODULE_TAG DVBT_DEMOD_MODULE;





// Demod I2C function pointers
typedef int
(*DVBT_DEMOD_FP_SET_REG_BYTES)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char PageNo,
	unsigned char RegStartAddr,
	const unsigned char *pWritingBytes,
	unsigned char ByteNum
	);



typedef int
(*DVBT_DEMOD_FP_GET_REG_BYTES)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char PageNo,
	unsigned char RegStartAddr,
	unsigned char *pReadingBytes,
	unsigned char ByteNum
	);



typedef int
(*DVBT_DEMOD_FP_SET_REG_BITS)(
	DVBT_DEMOD_MODULE *pDemod,
	int RegBitName,
	unsigned long WritingValue
	);



typedef int
(*DVBT_DEMOD_FP_GET_REG_BITS)(
	DVBT_DEMOD_MODULE *pDemod,
	int RegBitName,
	unsigned long *pReadingValue
	);



// Demod operating function pointers
typedef int
(*DVBT_DEMOD_FP_TEST_I2C)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char *pI2cConnectionStatus
	);



typedef int
(*DVBT_DEMOD_FP_SOFTWARE_RESET)(
	DVBT_DEMOD_MODULE *pDemod
	);



typedef int
(*DVBT_DEMOD_FP_INITIALIZE)(
	DVBT_DEMOD_MODULE *pDemod,
	int InitMode,
	unsigned long IfFreqHz,
	int SpectrumMode,
	unsigned char Vtop,
	unsigned char Krf
	);



typedef int
(*DVBT_DEMOD_FP_SET_BANDWIDTH_MODE)(
	DVBT_DEMOD_MODULE *pDemod,
	int BandwidthMode
	);



typedef int
(*DVBT_DEMOD_FP_SET_IF_FREQ_HZ)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned long IfFreqHz
	);



typedef int
(*DVBT_DEMOD_FP_SET_SPECTRUM_MODE)(
	DVBT_DEMOD_MODULE *pDemod,
	int SpectrumMode
	);



typedef int
(*DVBT_DEMOD_FP_SET_VTOP)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char Vtop
	);



typedef int
(*DVBT_DEMOD_FP_SET_KRF)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char Krf
	);



typedef int
(*DVBT_DEMOD_FP_TEST_TPS_LOCK)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char *pTpsLockStatus
	);



typedef int
(*DVBT_DEMOD_FP_TEST_SIGNAL_LOCK)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char *pSignalLockStatus
	);



typedef int
(*DVBT_DEMOD_FP_GET_FSM_STAGE)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char *pFsmStage
	);



typedef int
(*DVBT_DEMOD_FP_GET_SIGNAL_STRENGTH)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char *pSignalStrength
	);



typedef int
(*DVBT_DEMOD_FP_GET_SIGNAL_QUALITY)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char *pSignalQuality
	);



typedef int
(*DVBT_DEMOD_FP_GET_SNR_DB)(
	DVBT_DEMOD_MODULE *pDemod,
	long *pSnrDbNum,
	long *pSnrDbDen
	);



typedef int
(*DVBT_DEMOD_FP_GET_BER)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned long *pBerNum,
	unsigned long *pBerDen
	);



typedef int
(*DVBT_DEMOD_FP_GET_EST_EVM)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned int *pEstEvm
	);



typedef int
(*DVBT_DEMOD_FP_GET_RSD_BER_EST)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned int *pRsdBerEst
	);



typedef int
(*DVBT_DEMOD_FP_GET_RF_AGC)(
	DVBT_DEMOD_MODULE *pDemod,
	int *pRfAgc
	);



typedef int
(*DVBT_DEMOD_FP_GET_IF_AGC)(
	DVBT_DEMOD_MODULE *pDemod,
	int *pIfAgc
	);



typedef int
(*DVBT_DEMOD_FP_GET_DI_AGC)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char *pDiAgc
	);



typedef int
(*DVBT_DEMOD_FP_GET_CONSTELLATION)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char *pConstellation
	);



typedef int
(*DVBT_DEMOD_FP_GET_HIERARCHY)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char *pHierarchy
	);



typedef int
(*DVBT_DEMOD_FP_GET_CODE_RATE_LP)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char *pCodeRateLp
	);



typedef int
(*DVBT_DEMOD_FP_GET_CODE_RATE_HP)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char *pCodeRateHp
	);



typedef int
(*DVBT_DEMOD_FP_GET_GUARD_INTERVAL)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char *pGuardInterval
	);



typedef int
(*DVBT_DEMOD_FP_GET_FFT_MODE)(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char *pFftMode
	);



typedef int
(*DVBT_DEMOD_FP_UPDATE_FUNCTION_2)(
	DVBT_DEMOD_MODULE *pDemod
	);



typedef int
(*DVBT_DEMOD_FP_UPDATE_FUNCTION_3)(
	DVBT_DEMOD_MODULE *pDemod
	);



typedef int
(*DVBT_DEMOD_FP_RESET_FUNCTION_4)(
	DVBT_DEMOD_MODULE *pDemod
	);



typedef int
(*DVBT_DEMOD_FP_UPDATE_FUNCTION_4)(
	DVBT_DEMOD_MODULE *pDemod
	);



typedef int
(*DVBT_DEMOD_FP_RESET_FUNCTION_5)(
	DVBT_DEMOD_MODULE *pDemod
	);



typedef int
(*DVBT_DEMOD_FP_UPDATE_FUNCTION_5)(
	DVBT_DEMOD_MODULE *pDemod
	);





// DVB-T demod module structure
struct DVBT_DEMOD_MODULE_TAG
{
	// Demod type
	int DemodType;

	// Demod I2C device address
	unsigned char DeviceAddr;


	void *pExtra;												///<   Demod extra module used by driving module
	BASE_INTERFACE_MODULE *pBaseInterface;						///<   Base interface module
	I2C_BRIDGE_MODULE *pI2cBridge;								///<   I2C bridge module


	// Demod register table
	DVBT_REG_ENTRY RegTable[DVBT_REG_TABLE_LEN_MAX];

	// Demod update procedure variables
	unsigned char Func2Executing;
	unsigned char Func3State;
	unsigned char Func3Executing;
	unsigned char Func4State;
	unsigned long Func4DelayCnt;
	unsigned long Func4DelayCntMax;
	unsigned char Func4ParamSetting;
	unsigned long Func4RegValue[DVBT_FUNC4_REG_VALUE_NUM];
	unsigned char Func5State;
	unsigned char Func5QamBak;
	unsigned char Func5HierBak;
	unsigned char Func5LpCrBak;
	unsigned char Func5HpCrBak;
	unsigned char Func5GiBak;
	unsigned char Func5FftBak;


	// Demod I2C function pointers
	DVBT_DEMOD_FP_SET_REG_BYTES   SetRegBytes;
	DVBT_DEMOD_FP_GET_REG_BYTES   GetRegBytes;
	DVBT_DEMOD_FP_SET_REG_BITS    SetRegBits;
	DVBT_DEMOD_FP_GET_REG_BITS    GetRegBits;

	// Demod operating function pointers
	DVBT_DEMOD_FP_TEST_I2C              TestI2c;
	DVBT_DEMOD_FP_SOFTWARE_RESET        SoftwareReset;
	DVBT_DEMOD_FP_INITIALIZE            Initialize;
	DVBT_DEMOD_FP_SET_BANDWIDTH_MODE    SetBandwidthMode;
	DVBT_DEMOD_FP_SET_IF_FREQ_HZ        SetIfFreqHz;
	DVBT_DEMOD_FP_SET_SPECTRUM_MODE     SetSpectrumMode;
	DVBT_DEMOD_FP_SET_VTOP              SetVtop;
	DVBT_DEMOD_FP_SET_KRF               SetKrf;
	DVBT_DEMOD_FP_TEST_TPS_LOCK         TestTpsLock;
	DVBT_DEMOD_FP_TEST_SIGNAL_LOCK      TestSignalLock;
	DVBT_DEMOD_FP_GET_FSM_STAGE         GetFsmStage;
	DVBT_DEMOD_FP_GET_SIGNAL_STRENGTH   GetSignalStrength;
	DVBT_DEMOD_FP_GET_SIGNAL_QUALITY    GetSignalQuality;
	DVBT_DEMOD_FP_GET_SNR_DB            GetSnrDb;
	DVBT_DEMOD_FP_GET_BER               GetBer;
	DVBT_DEMOD_FP_GET_EST_EVM           GetEstEvm;
	DVBT_DEMOD_FP_GET_RSD_BER_EST       GetRsdBerEst;
	DVBT_DEMOD_FP_GET_RF_AGC            GetRfAgc;
	DVBT_DEMOD_FP_GET_IF_AGC            GetIfAgc;
	DVBT_DEMOD_FP_GET_DI_AGC            GetDiAgc;
	DVBT_DEMOD_FP_GET_CONSTELLATION     GetConstellation;
	DVBT_DEMOD_FP_GET_HIERARCHY         GetHierarchy;
	DVBT_DEMOD_FP_GET_CODE_RATE_LP      GetCodeRateLp;
	DVBT_DEMOD_FP_GET_CODE_RATE_HP      GetCodeRateHp;
	DVBT_DEMOD_FP_GET_GUARD_INTERVAL    GetGuardInterval;
	DVBT_DEMOD_FP_GET_FFT_MODE          GetFftMode;
	DVBT_DEMOD_FP_UPDATE_FUNCTION_2     UpdateFunction2;
	DVBT_DEMOD_FP_UPDATE_FUNCTION_3     UpdateFunction3;
	DVBT_DEMOD_FP_RESET_FUNCTION_4      ResetFunction4;
	DVBT_DEMOD_FP_UPDATE_FUNCTION_4     UpdateFunction4;
	DVBT_DEMOD_FP_RESET_FUNCTION_5      ResetFunction5;
	DVBT_DEMOD_FP_UPDATE_FUNCTION_5     UpdateFunction5;
};






#endif
