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

📄 cu1216.c

📁 Cu1216 解调器驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "Z_os_api.h"
#include "dem_def.h"

/*Platform */
#include <stdio.h>
#include "opentvx.h"
#include "globals.h"
#include "gpio.h"	
#include "i2c.h"
#include "i68dbg.h"
#include "utility.h"

/*Especially for cu1216*/
#include "tmTypes.h"
#include "tmhalFEtypes.h"
#include "dvp.h"

#include "SystemFunc.h"
#include "tmbslTuner.h"
#include "tmbslTunerext.h"
#include "tmbslDemodCab.h"
#include "tmbsl10023.h"
#include "tmbsl10023local.h"
#include "cu1216.h"


/*Other*/
#include "demod.h"	

/*===========================================================
		--- Macro defination ---
===========================================================*/
#define DISPLAY_ERR(x,y) if(TM_OK != x) { \
                            dbprintf(("\n%s returns %u\n", y, x)); \
                            }

#define DEMOD_I2C_ADDRESSS   0x18
#define TUNER_I2C_ADDRESSS   0xC0

#define	CHANTABLE_CHINA	0
#define	CHANTABLE_EUROPE	1

/*===========================================================
		--- Static Parametres defination ---
===========================================================*/
static o_demodulator_scan_request gRequest;
static UINT8 gScanProgress = 0;
static DTV_BOOL	g_isScanning = DTV_FALSE;

/*===========================================================
		--- Fuction declaration ---
===========================================================*/

extern void (*pDemodCallback)(long lDemodulator, int iReason);


/*===========================================================
		--- Function Context ---
===========================================================*/

// //////////////////////////////////////////////////////////////////////////
// Function Name: 
//   Cu1216_Init
//
// Input Parameters:
//   int iIndex - the index withing all demodulators list
//
// Return Value:
//   None
//
// Description: 
//   Initial the DEMOD driver, This function need to call once at the power-
//      up stage.
// //////////////////////////////////////////////////////////////////////////
void Cu1216_Init(DEMOD_HANDLE handle, int iIndex) 
{
	tmErrorCode_t eErrorCode;
    	I2C_Conf_T sI2CConf;
    	tmhalFEBslSystemFunc_t myDemodSystemFunc;
    	tmhalFEBslSystemFunc_t myTunerSystemFunc;
    	tmbslTuConfig_t myTunerFunc;
    	tmbslTuParam_t MyTunerParam;
    	tmbslDcParam_t MyDemodParam;
    	tmhalFEManagerStatus_t eStatus;
	DEMOD_CABLE_DATA *sDemodData = (DEMOD_CABLE_DATA*)handle;

	sDemodData->Cu1216_Index = iIndex;
    
    	//---------
    	// INIT COM
    	//---------
    	// open
    	SY_OpenCom();
    
    	// set the config - LPT1 at 100khz
    	sI2CConf.iLptPort = 1;
    	sI2CConf.iI2cSpeed = 100000;
    	sI2CConf.bAutoInc = 1;
    	sI2CConf.bDebugTrace = 0;
    	SY_SetComConfig(sI2CConf);

    	//---------
    	// INIT BSL
    	//---------
    	// initialize system func for demod 
    	myDemodSystemFunc.SY_GetTickTime    = SY_GetTickTime;
    	myDemodSystemFunc.SY_GetTickPeriod  = SY_GetTickPeriod;
    	myDemodSystemFunc.SY_GetCommErrors  = SY_GetComError; 
    	myDemodSystemFunc.SY_Write          = SY_WriteDemod; 
    	myDemodSystemFunc.SY_WriteBit       = SY_WriteBitDemod; 
    	myDemodSystemFunc.SY_Read           = SY_ReadDemod;    
    
    	// initialize system func for tuner 
    	myTunerSystemFunc.SY_GetTickTime    = SY_GetTickTime; 
    	myTunerSystemFunc.SY_GetTickPeriod  = SY_GetTickPeriod;
    	myTunerSystemFunc.SY_GetCommErrors  = SY_GetComError; 
    	myTunerSystemFunc.SY_Write          = SY_WriteTuner; 
    	myTunerSystemFunc.SY_WriteBit       = SY_WriteBitTuner; 
    	myTunerSystemFunc.SY_Read           = SY_ReadTuner;
    
    	// initialize tuner address for the demod
    	myTunerFunc.initFunc                = tmbslTunerInit; 
    	myTunerFunc.deinitFunc              = tmbslTunerDeInit; 
    	myTunerFunc.getSWVersionFunc        = tmbslTunerGetSWVersion; 
    	myTunerFunc.setPowerStateFunc       = tmbslTunerSetPowerState; 
    	myTunerFunc.getPowerStateFunc       = tmbslTunerGetPowerState; 
    	myTunerFunc.setCfgFunc              = tmbslTunerSetConfig; 
    	myTunerFunc.getCfgFunc              = tmbslTunerGetConfig; 
    	myTunerFunc.writeFunc               = tmbslTunerWrite; 
    	myTunerFunc.writeBitFunc            = tmbslTunerWriteBit; 
    	myTunerFunc.readFunc                = tmbslTunerRead;
    	myTunerFunc.setRfFunc               = tmbslTunerSetRf; 
    	myTunerFunc.getRfFunc               = tmbslTunerGetRf;
       printf("here0\n");
   	 // initialize tuner unit 0
    	MyTunerParam.uHwAddress     = TUNER_I2C_ADDRESSS; 
    	MyTunerParam.systemFunc     = myTunerSystemFunc;       
    	eErrorCode = tmbslTunerInit ((tmUnitSelect_t)0, MyTunerParam);
       printf("here1\n");
    	// initialize demod unit 0
    	MyDemodParam.uHwAddress     = DEMOD_I2C_ADDRESSS; 
    	MyDemodParam.systemFunc     = myDemodSystemFunc;
    	MyDemodParam.tunerFunc      = myTunerFunc;
    	MyDemodParam.eTunerUnit     = (tmUnitSelect_t)0;
    	eErrorCode = tmbsl10023Init ((tmUnitSelect_t)0, MyDemodParam);
    	printf("here2\n");
    	// set the tuner and demod config for CU1216 board
    	eErrorCode = tmbslTunerSetConfig ((tmUnitSelect_t)0, tmhalFEBoard, 0x12160000);//0x57550000);     	
    	eErrorCode = tmbsl10023SetConfig((tmUnitSelect_t)0, tmhalFEBoard, 0x12160000);//0x57550000);    	
       printf("here3\n");
    	// Initialize TDA10023 registers
    	eErrorCode = tmbsl10023SetConfig((tmUnitSelect_t)0, tmhalFEInit, 0);    	

#if 0
    	//------------------
    	// PROGRAM FRONT-END
    	//------------------
    	eErrorCode = tmbsl10023SetRF ((tmUnitSelect_t)0, 259000000);
    	//DISPLAY_ERR (eErrorCode, "tmbsl10023SetRF");
    	eErrorCode = tmbsl10023SetSR ((tmUnitSelect_t)0, 6875000); 
    	//DISPLAY_ERR (eErrorCode, "tmbsl10023SetSR");
    	eErrorCode = tmbsl10023SetSI ((tmUnitSelect_t)0, tmhalFESpectrumNormal); 
    	//DISPLAY_ERR (eErrorCode, "tmbsl10023SetSI");
    	eErrorCode = tmbsl10023SetMod ((tmUnitSelect_t)0, tmhalFEModulationQam64); 
    	//DISPLAY_ERR (eErrorCode, "tmbsl10023SetMod");
    
    	// perform algo
    	do {
        	eErrorCode = tmbsl10023Manager((tmUnitSelect_t)0, &eStatus);
        	DISPLAY_ERR (eErrorCode, "tmbsl10023Manager");
    	} while (tmhalFEManagerStatusNotCompleted == eStatus);

        if (tmhalFEManagerStatusCarrierOk == eStatus){
        	dbprintf(("\n Carrier detected...\n"));
	 	
    	}
    	else{
        	dbprintf(("\n No carrier detected !\n"));
        	
    	}
#endif
}


#include "tsi_api.h"
int Cu1216_Connect_DBG(DEMOD_HANDLE handle,  unsigned long uNewFreq, UINT32 uSymRate )
{
	
	static SIGNAL Signal;
	tmhalFEManagerStatus_t eStatus;
	tmErrorCode_t eErrorCode;

	/*
	  Init the appropriate TS
	*/
	TSI_Set_InConfig_and_run( TSI_TS1, TSI_FE2 ); 

	Signal.Frequency =  uNewFreq*1000;  /*In kHz*/
    	Signal.QAMSize   = 64 ;
    	Signal.SymbolRate = uSymRate*1000;  /* in Baud/s */
#if 0
	
	Driv0297CarrierSearch(DEMOD_HANDLE handle, SIGNAL * _pSignal, _FLAG _SpectrumInversion, int _SweepRate, int _CarrierOffset)(handle, &Signal, 0,6,-20);
#else
	//To search the appointed channel;
	eErrorCode = tmbsl10023SetRF ((tmUnitSelect_t)0, Signal.Frequency*1000);
    	DISPLAY_ERR (eErrorCode, "tmbsl10023SetRF");
    	eErrorCode = tmbsl10023SetSR ((tmUnitSelect_t)0, Signal.SymbolRate); 
    	DISPLAY_ERR (eErrorCode, "tmbsl10023SetSR");
    	eErrorCode = tmbsl10023SetSI ((tmUnitSelect_t)0, tmhalFESpectrumNormal); 
    	DISPLAY_ERR (eErrorCode, "tmbsl10023SetSI");
    	eErrorCode = tmbsl10023SetMod ((tmUnitSelect_t)0, tmhalFEModulationAuto); 
    	DISPLAY_ERR (eErrorCode, "tmbsl10023SetMod");
    
    	// perform algo
    	do {
        	eErrorCode = tmbsl10023Manager((tmUnitSelect_t)0, &eStatus);
        	DISPLAY_ERR (eErrorCode, "tmbsl10023Manager");
    	} while (tmhalFEManagerStatusNotCompleted == eStatus);

    	//---------------
    	// DISPLAY RESULT
    	//---------------
    	if (tmhalFEManagerStatusCarrierOk == eStatus){
        	dbprintf(("\n Carrier detected...\n"));
	 	return 1;
    	}
    	else{
        	dbprintf(("\n No carrier detected !\n"));
        	return 0;
    	}
		
#endif
	
	return 1;
}



int Cu1216_Connect( DEMOD_HANDLE handle, o_dvb_delivery *tuning_info )
{

	static SIGNAL Signal;
	tmhalFEManagerStatus_t eStatus;
	tmErrorCode_t eErrorCode;

	Signal.Frequency =  tuning_info->delivery.cable.frequency;//convert_BCD_to_decimal(tuning_info->delivery.cable.frequency)*10; //In kHz
    	Signal.QAMSize   = DVBModulationToDriverQamSize(tuning_info->delivery.cable.modulation); ;
    	Signal.SymbolRate = tuning_info->delivery.cable.symbol_rate;//convert_BCD_to_decimal(tuning_info->delivery.cable.symbol_rate) * 10;  //6875000;  // in Baud/s
        dbprintf(("Cu1216_Connect(): signal Frequency is %d,SymbolRate is %d\n ", Signal.Frequency,Signal.SymbolRate ));
	eErrorCode = tmbsl10023SetRF ((tmUnitSelect_t)0, Signal.Frequency*1000);
    	if (eErrorCode != TM_OK)	return 0;		
    	eErrorCode = tmbsl10023SetSR ((tmUnitSelect_t)0, Signal.SymbolRate); 
    	if (eErrorCode != TM_OK)	return 0;
    	eErrorCode = tmbsl10023SetSI ((tmUnitSelect_t)0, tmhalFESpectrumAuto); 
    	if (eErrorCode != TM_OK)	return 0;
		
	switch(Signal.QAMSize)
	{
		case 16:
			eErrorCode = tmbsl10023SetMod ((tmUnitSelect_t)0, tmhalFEModulationQam16); 
			break;
		case 32:
			eErrorCode = tmbsl10023SetMod ((tmUnitSelect_t)0, tmhalFEModulationQam32); 
			break;
		case 64:
			eErrorCode = tmbsl10023SetMod ((tmUnitSelect_t)0, tmhalFEModulationQam64); 
			break;
		case 128:
			eErrorCode = tmbsl10023SetMod ((tmUnitSelect_t)0, tmhalFEModulationQam128); 
			break;
		case 256:
			eErrorCode = tmbsl10023SetMod ((tmUnitSelect_t)0, tmhalFEModulationQam256); 
			break;
		default:
			return 0;
	}    	
    	if (eErrorCode != TM_OK)	return 0;
	    
    	// perform algo
    	do {
        	eErrorCode = tmbsl10023Manager((tmUnitSelect_t)0, &eStatus);        	
    	} while (tmhalFEManagerStatusNotCompleted == eStatus);

    	//---------------
    	// DISPLAY RESULT
    	//---------------
    	if (tmhalFEManagerStatusCarrierOk == eStatus){
        	dbprintf(("\n Carrier detected...\n"));
	 	return 1;
    	}
    	else{
        	dbprintf(("\n No carrier detected !\n"));
        	return 0;
    	}

	
}
 

int Cu1216_SetLnb(DEMOD_HANDLE handle, o_demodulator_lnb *pLnb)
{
	dbprintf(("Dcf8710_SetLnb()\n"));
	return 0;
}

// //////////////////////////////////////////////////////////////////////////
// Function Name: 
//   Cu1216_GetSignalData
//
// Input Parameters:
//   pSignal - o_demodulator_signal defined by OpenTV
//
// Return Value:
//  Dcf8710_GetSignalData is always considered valid, whether the demodulator 
//  is locked or not, and irrespective of whether the demodulator is being 
//  used for scanning (through the requests above) or is connected using the 
//  normal demodulator functions. A FAILURE response is expected only if the 
//  demodulator control driver does not provide the capability. A set request 
//  is always invalid and should result in an immediate FAILURE response.
//
// Description: 
//  Gets information on the quality of the signal being received by the 
//  tuner and demodulation hardware.
// //////////////////////////////////////////////////////////////////////////
int Cu1216_GetSignalData(DEMOD_HANDLE handle, o_demodulator_signal *pSignal)
{	
	static UINT16	signal_quality = 0xFF;
	UINT8	i = 0,agc = 0;
    UINT32   puBytes[4];
	
	#if 1
	tmbsl10023Read(0, TDA10023_STATUS_IND, 1, puBytes);
	pSignal->signal_lock = (puBytes[0] & TDA10023_STATUS_FSYNC_BIT)/TDA10023_STATUS_FSYNC_BIT;
//	dbprintf(( "\nSync Byte add 0x%02x : 0x%02x", TDA10023_STATUS_IND, puBytes[0] ));	   
//       dbprintf(( " --> FEL=%x \n", pSignal->signal_lock));

	if(0 == pSignal->signal_lock)
	{
		pSignal->signal_strength = 0;
		pSignal->signal_quality = 255;
		return 0;
	}

	//pSignal->signal_strength = 80;
	//pSignal->signal_quality = 85;
	switch(puBytes[0]&0x30)
		{
		       case 0x00:pSignal->signal_quality = 0;
			                 break;
			case 0x10:pSignal->signal_quality = 255*10/100;
				          break;
			case 0x20:pSignal->signal_quality = 255*40/100;
			                 break;
			case 0x30:pSignal->signal_quality = 255*80/100;
				          break;
		}
	tmbsl10023GetSNR((tmUnitSelect_t)0,&(pSignal->signal_strength));
	//d_prinft( "-%d- \n",pSignal->signal_strength);
	
	return 0;
		
	#else
	pSignal->signal_lock = RegGetField0297(handle, SYNCSTATE); // 1 - locked 0 - unlocked

	if(0 == pSignal->signal_lock)
	{
		pSignal->signal_strength = 0;
		pSignal->signal_quality = 255;
		return 0;
	}

⌨️ 快捷键说明

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