#ifndef __DEMOD_RTL2830_H
#define __DEMOD_RTL2830_H


#include "dvbt_demod_base.h"





// Definitions

// Page register address
#define RTL2830_PAGE_REG_ADDR		0x00


// Definitions for initializing
#define RTL2830_INIT_TABLE_LEN						26
#define RTL2830_INIT_TABLE_LEN_WITH_MODE			6
#define RTL2830_SPEC_INIT_0_COMPARISON_TIMES		30

// Registers for initializing
// - page no, start address, and length
#define RTL2830_MGD_THDX_PAGE		1
#define RTL2830_MGD_THDX_ADDR		0x95
#define RTL2830_MGD_THDX_LEN		8


// Definitions for bandwidth setting

// Registers for bandwidth programming
// - page no, start address, and length
#define RTL2830_H_LPF_X_PAGE		1
#define RTL2830_H_LPF_X_ADDR		0x1c
#define RTL2830_H_LPF_X_LEN			34
#define RTL2830_RATIO_PAGE			1
#define RTL2830_RATIO_ADDR			0x9d
#define RTL2830_RATIO_LEN			6


// Definitions for Function 2
#define RTL2830_SELECT_INDEX_NUM		8
#define RTL2830_UPDATE_REG_1_PAGE		2


// Definitions for Function 3
#define RTL2830_FUNC3_STATE_NUM			6
#define RTL2830_ASSIGNED_P3VALUE		3
#define RTL2830_ASSIGNED_D3VALUE		0


// Definitions for Function 4
#define RTL2830_FUNC4_DELAY_MS			2000
#define RTL2830_FUNC4_VALUE_AVG_NUM		4
#define RTL2830_FUNC4_PARAM_PAGE		2
#define RTL2830_FUNC4_PARAM_ADDR		0x86
#define RTL2830_FUNC4_PARAM_LEN			77


// Definitions for BER and SNR
#define RTL2830_EST_EVM_MAX_VALUE		65535
#define RTL2830_SNR_NUM_MAX_VALUE		1000
#define RTL2830_SNR_DEN_VALUE			10
#define RTL2830_RSD_BER_EST_MAX_VALUE	19616
#define RTL2830_BER_DEN_VALUE			1000000


// Definitions for AGC
#define RTL2830_RF_AGC_REG_BIT_NUM		14
#define RTL2830_IF_AGC_REG_BIT_NUM		14



// Demod application modes
enum
{
	RTL2830_APPLICATION_DONGLE,
	RTL2830_APPLICATION_STB,
};
#define RTL2830_APPLICATION_MODE_NUM			2



// Register table length
#define RTL2830_REG_TABLE_LEN		113

// Register table initializing
void rtl2830_InitRegTable(DVBT_REG_ENTRY *pRegTable);





// Demod module constructor and destructor
void
BuildRtl2830Module(
	DVBT_DEMOD_MODULE **ppDemod,
	DVBT_DEMOD_MODULE *pDvbtDemodModuleMemory,
	BASE_INTERFACE_MODULE *pBaseInterfaceModuleMemory,
	I2C_BRIDGE_MODULE *pI2cBridgeModuleMemory,
	unsigned char DeviceAddr,
	unsigned long Func4PeriodMs
	);





// Demod I2C functions
int
rtl2830_SetRegBytes(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char PageNo,
	unsigned char RegStartAddr,
	const unsigned char *pWritingBytes,
	unsigned char ByteNum
	);

int
rtl2830_GetRegBytes(
	DVBT_DEMOD_MODULE *pDemod,
	unsigned char PageNo,
	unsigned char RegStartAddr,
	unsigned char *pReadingBytes,
	unsigned char ByteNum
	);

int
rtl2830_SetRegBits(
	DVBT_DEMOD_MODULE *pDemod,
	int RegBitName,
	unsigned long WritingValue
	);

int
rtl2830_GetRegBits(
	DVBT_DEMOD_MODULE *pDemod,
	int RegBitName,
	unsigned long *pReadingValue
	);





// Demod operating functions

// Demod I2C test
int rtl2830_TestI2c(DVBT_DEMOD_MODULE *pDemod, unsigned char *pI2cConnectionStatus);

// Demod software reset
int rtl2830_SoftwareReset(DVBT_DEMOD_MODULE *pDemod);

// Demod tuner-I2C forwarding
int rtl2830_ForwardTunerI2C(DVBT_DEMOD_MODULE *pDemod);

// Demod initializing
int
rtl2830_Initialize(
	DVBT_DEMOD_MODULE *pDemod,
	int InitMode,
	unsigned long IfFreqHz,
	int SpectrumMode,
	unsigned char Vtop,
	unsigned char Krf
	);

// Demod bandwidth mode setting
int rtl2830_SetBandwidthMode(DVBT_DEMOD_MODULE *pDemod, int BandwidthMode);

// Demod parameter setting 
int rtl2830_SetIfFreqHz(DVBT_DEMOD_MODULE *pDemod, unsigned long IfFreqHz);
int rtl2830_SetSpectrumMode(DVBT_DEMOD_MODULE *pDemod, int SpectrumMode);
int rtl2830_SetVtop(DVBT_DEMOD_MODULE *pDemod, unsigned char Vtop);
int rtl2830_SetKrf(DVBT_DEMOD_MODULE *pDemod, unsigned char Krf);

// Demod TPS and signal lock test
int rtl2830_TestTpsLock(DVBT_DEMOD_MODULE *pDemod, unsigned char *pTpsLockStatus);
int rtl2830_TestSignalLock(DVBT_DEMOD_MODULE *pDemod, unsigned char *pSignalLockStatus);

// Demod FSM stage getting
int rtl2830_GetFsmStage(DVBT_DEMOD_MODULE *pDemod, unsigned char *pFsmStage);

// Demod signal strength and signal quality getting
int rtl2830_GetSignalStrength(DVBT_DEMOD_MODULE *pDemod, unsigned char *pSignalStrength);
int rtl2830_GetSignalQuality(DVBT_DEMOD_MODULE *pDemod, unsigned char *pSignalQuality);

// Demod SNR and BER getting
int rtl2830_GetSnrDb(DVBT_DEMOD_MODULE *pDemod, long *pSnrDbNum, long *pSnrDbDen);
int rtl2830_GetBer(DVBT_DEMOD_MODULE *pDemod, unsigned long *pBerNum, unsigned long *pBerDen);
int rtl2830_GetEstEvm(DVBT_DEMOD_MODULE *pDemod, unsigned int *pEstEvm);
int rtl2830_GetRsdBerEst(DVBT_DEMOD_MODULE *pDemod, unsigned int *pRsdBerEst);

// Demod AGC getting
int rtl2830_GetRfAgc(DVBT_DEMOD_MODULE *pDemod, int *pRfAgc);
int rtl2830_GetIfAgc(DVBT_DEMOD_MODULE *pDemod, int *pIfAgc);
int rtl2830_GetDiAgc(DVBT_DEMOD_MODULE *pDemod, unsigned char *pDiAgc);

// Demod TPS information getting
int rtl2830_GetConstellation(DVBT_DEMOD_MODULE *pDemod, unsigned char *pConstellation);
int rtl2830_GetHierarchy(DVBT_DEMOD_MODULE *pDemod, unsigned char *pHierarchy);
int rtl2830_GetCodeRateLp(DVBT_DEMOD_MODULE *pDemod, unsigned char *pCodeRateLp);
int rtl2830_GetCodeRateHp(DVBT_DEMOD_MODULE *pDemod, unsigned char *pCodeRateHp);
int rtl2830_GetGuardInterval(DVBT_DEMOD_MODULE *pDemod, unsigned char *pGuardInterval);
int rtl2830_GetFftMode(DVBT_DEMOD_MODULE *pDemod, unsigned char *pFftMode);

// Demod register updating for performance
int rtl2830_UpdateFunction2(DVBT_DEMOD_MODULE *pDemod);
int rtl2830_UpdateFunction3(DVBT_DEMOD_MODULE *pDemod);
int rtl2830_ResetFunction4(DVBT_DEMOD_MODULE *pDemod);
int rtl2830_UpdateFunction4(DVBT_DEMOD_MODULE *pDemod);
int rtl2830_ResetFunction5(DVBT_DEMOD_MODULE *pDemod);
int rtl2830_UpdateFunction5(DVBT_DEMOD_MODULE *pDemod);





// I2C command forwarding functions
int
rtl2830_ForwardI2cReadingCmd(
	I2C_BRIDGE_MODULE *pI2cBridge,
	unsigned char *pReadingBytes,
	unsigned char ByteNum
	);

int
rtl2830_ForwardI2cWritingCmd(
	I2C_BRIDGE_MODULE *pI2cBridge,
	const unsigned char *pWritingBytes,
	unsigned char ByteNum
	);





// Demod tools
// I2C birdge module demod argument setting
void
rtl2830_SetI2cBridgeModuleDemodArg(
	DVBT_DEMOD_MODULE *pDemod
	);

int rtl2830_GetFunc4RegValueAvg(DVBT_DEMOD_MODULE *pDemod, unsigned long *pRegValueAvg);


// Log10 approximation
long rtl2830_Log10Apx(unsigned long Value);















#endif
