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

📄 rf_tuner_atsc.c

📁 mstar 776 开发的车载dvd
💻 C
字号:
/******************************************************************************
 Copyright (c) 2006 MStar Semiconductor, Inc.
 All rights reserved.

 [Module Name]: Tuner_ATSC.c
 [Date]:        28-Aug-2006
 [Comment]:
   TV tuner header file.
 [Reversion History]:
*******************************************************************************/

#ifndef _TUNER_ATSC_C_
#define _TUNER_ATSC_C_


#include <math.h>
#include "datatype.h"
//#include "drviic.h"
#include "RF_Tuner_ATSC.h"
#include "msKeypad.h"
/*------------------------------------------------------//
// + Set_Tuner_Freq
//	 : Call the function for the tuner setup, which is implemented in Tuner.cpp
//
// + Input	: float - frequency to tune //Khz
// + Input	: EN_DEMOD_TYPE - modulation type
// + Return	: BOOLEAN
//------------------------------------------------------*/
BOOLEAN Set_Tuner_Freq(U16 u16Frequency, EN_DEMOD_TYPE enModulation)
{
	U32 freq;
	U16 step_num;
	U8 dataTune[6];
#if (FRONTEND_TUNER_TYPE == LG_TDVS_H703P_TUNER)
        static U8 prevBandSwitchByte;
	BOOLEAN IsBandSwitch;
#elif (FRONTEND_TUNER_TYPE == SAMSUNG_S205_TUNER)
	U32 u32Temp;
#endif

	freq=(U32)(u16Frequency)*FREQ_STEP;

#if (FRONTEND_TUNER_TYPE == THOMSON_DTT7630_TUNER)
	//F_osc = RF + IF
	step_num = IF_STEP+u16Frequency;	//PLL step size = 62.5Khz
	dataTune[0] = HIGHBYTE(step_num)&0x7f;					//DB1
	dataTune[1] = LOWBYTE(step_num);						//DB2
	dataTune[2] = 0x8E;
        if (enModulation!=DEMOD_TYPE_NTSC)//VSB, QAM
        {
            if(freq < 153000) 		dataTune[3] = 0x39;		 		//BB
            else if (freq < 423000) dataTune[3] = 0x3a;
            else 					dataTune[3] = 0x3c;
        }
        else    //NTSC
        {
            if(freq < 151250) 		dataTune[3] = 0x11; 			//BB
            else if (freq < 421250) dataTune[3] = 0x12;
            else 					dataTune[3] = 0x14;
        }

	//no need to send sub address
	if(MDrv_IIC_WriteBytes(TUA6030_devAddr, 0, NULL, 4, dataTune) == FALSE)
		return FALSE;

        dataTune[0] = 0x9E;			//CB
        dataTune[1] = 0xC0; 			//BB
	if(MDrv_IIC_WriteBytes(TUA6030_devAddr, 0, NULL, 2, dataTune) == FALSE)
		return FALSE;
/*
	dataTune[0] = 0x9E;
	dataTune[1] = 0xC0;
	if(MDrv_IIC_WriteBytes(TUA6030_devAddr, 0, NULL, 2, dataTune) == FALSE)
		return LGDT_ERR_I2C;
*/
#elif (FRONTEND_TUNER_TYPE == PHILIPS_FQD1236_TUNER)
	//F_osc = RF + IF
	step_num = IF_STEP+u16Frequency;	//PLL step size = 62.5Khz
	//step_num = (U16) ((freq+44000)/FREQ_STEP + 0.5);	//PLL step size = 62.5Khz
	dataTune[0] = HIGHBYTE(step_num)&0x7f;					//DB1
	dataTune[1] = LOWBYTE(step_num);						//DB2
	dataTune[2] = 0x86;		 								//CB
	if(freq < 160000) 		dataTune[3] = 0x01;		 		//BB
	else if (freq < 450000) dataTune[3] = 0x02;
	else 					dataTune[3] = 0x04;

	//no need to send sub address
	if(MDrv_IIC_WriteBytes(TUA6030_devAddr, 0, NULL, 4, dataTune) == FALSE)
	{
		return FALSE;
	}
/*
	dataTune[0] = 0xB6; //CB
	dataTune[1] = 0xA0; //AB
	if(MDrv_IIC_WriteBytes(TUA6030_devAddr, 0, NULL, 2, dataTune) == FALSE)
	{
		return LGDT_ERR_I2C;
	}
*/
#elif (FRONTEND_TUNER_TYPE == ALPS_TDQU4_TUNER)
	//F_osc = RF + IF
	step_num = IF_STEP+u16Frequency;	//PLL step size = 62.5Khz
	//step_num = (U16) ((freq+44000)/FREQ_STEP + 0.5);	//PLL step size = 62.5Khz
	dataTune[0] = HIGHBYTE(step_num)&0x7f;					//DB1
	dataTune[1] = LOWBYTE(step_num);						//DB2
	dataTune[2] = 0x8B;		 								//CONTROL1
	if(freq < 82000) 	dataTune[3] = 0x60;		 			//CONTROL2
	else if (freq < 88000)  dataTune[3] = 0x61;
	else if (freq < 162000) dataTune[3] = 0x60;
	else if (freq < 426000) dataTune[3] = 0x62;
	else if (freq < 782000) dataTune[3] = 0xAA;
	else 					dataTune[3] = 0x2A;
        if (enModulation!=DEMOD_TYPE_NTSC)
            	dataTune[4] = 0xC6;     //CONTROL3
    	else
        	dataTune[4] = 0xE6;     //CONTROL3

	//no need to send sub address
	if(MDrv_IIC_WriteBytes(ALPS_TDQU4_devAddr, 0, NULL, 5, dataTune) == FALSE)
	{
		return FALSE;
	}
#elif (FRONTEND_TUNER_TYPE == SAMSUNG_S205_TUNER)
	//F_osc = RF + IF
	step_num = IF_STEP+u16Frequency;	//PLL step size = 62.5Khz
	//step_num = (U16) ((freq+44000)/FREQ_STEP + 0.5);	//PLL step size = 62.5Khz
	dataTune[0] = HIGHBYTE(step_num)&0x7f;					//DB1
	dataTune[1] = LOWBYTE(step_num);						//DB2
	dataTune[2] = 0xC3;
	dataTune[3] = DRV_TDA6651_GetChargePumpData(freq);
        if (enModulation!=DEMOD_TYPE_NTSC)//VSB, QAM
            dataTune[4] = 0x82;
        else
            dataTune[4] = 0x83;
	u32Temp = (((U32)dataTune[0])<<24) | (((U32)dataTune[1])<<16) | (((U32)dataTune[2])<<8) | ((U32)dataTune[3]);
	if(MDrv_IIC_Write4Bytes(SAMSUNG_TUNER_I2C_ADDR, u32Temp, dataTune[4])==FALSE)
	{
		return FALSE;
	}
#elif (FRONTEND_TUNER_TYPE == NXP_TD1636ALMK2_TUNER) 
{
    //F_osc = RF + IF
    step_num = IF_STEP+u16Frequency;    //PLL step size = 50Khz
    //step_num = (U16) ((freq+44000)/FREQ_STEP + 0.5);  //PLL step size = 50Khz
    dataTune[0] = HIGHBYTE(step_num)&0x7f;                  //DB1
    dataTune[1] = LOWBYTE(step_num);                        //DB2
    dataTune[2] = 0xC0; // CB

    // Set AGC according demod type
    dataTune[3] = 0x04;	// BB
    switch(enModulation)
    {
    	case DEMOD_TYPE_NTSC:
         	dataTune[3] |= (BIT4 | BIT3);
			break;
        case DEMOD_TYPE_8VSB:
         	dataTune[3] |= BIT4 ;
            break;
        case DEMOD_TYPE_64QAM:
        case DEMOD_TYPE_256QAM:
         	dataTune[3] |= BIT3;
            break;
    }
    
	// Set Band Select bit
	dataTune[3] &= 0xFC;
    if(u16Frequency < (164000/FREQ_STEP)) // Low band < 164MHz
    	dataTune[3] |= BIT0;
    else if(u16Frequency < (458000/FREQ_STEP)) // Mid band < 458MHz
    	dataTune[3] |= BIT1;
    else // Hi Band
    	dataTune[3] |= 0x00;
    
	if(MDrv_IIC_WriteBytes(NXP_TUNER_I2C_ADDR, 0, NULL, 4, dataTune) == FALSE)
	{
		return FALSE;
	}
}
#elif (FRONTEND_TUNER_TYPE == SHARP_VA1Y2UR2201_TUNER)
    //F_osc = RF + IF
    step_num = IF_STEP+u16Frequency;	//PLL step size = 62.5Khz
    //step_num = (U16) ((freq+44000)/FREQ_STEP + 0.5);	//PLL step size = 62.5Khz
    dataTune[0] = HIGHBYTE(step_num)&0x7f;
    dataTune[1] = LOWBYTE(step_num);

    if(freq < 150000) //Khz
    {
        dataTune[2] =0x85;
        if (enModulation == DEMOD_TYPE_NTSC)
        {
            dataTune[3] = 0x33;
            dataTune[4] = 0x43;
        }
        else
        {
            dataTune[3] =0x32;
            dataTune[4] =0x53;
        }
    }
    else if (freq < 162000)
    {
        dataTune[2] =0xA5;
        if (enModulation == DEMOD_TYPE_NTSC)
        {
            dataTune[3] = 0x33;
            dataTune[4] = 0x43;
        }
        else
        {
            dataTune[3] =0x32;
            dataTune[4] =0x53;
        }
    }
    else if (freq < 342000)
    {
        dataTune[2] =0x85;
        if (enModulation == DEMOD_TYPE_NTSC)
        {
            dataTune[3] = 0x75;
            dataTune[4] = 0x43;
        }
        else
        {
            dataTune[3] =0x74;
            dataTune[4] =0x53;
        }
    }
    else if (freq < 402000)
    {
        dataTune[2] =0xA5;
        if (enModulation == DEMOD_TYPE_NTSC)
        {
            dataTune[3] = 0x75;
            dataTune[4] = 0x43;
        }
        else
        {
            dataTune[3] =0x74;
            dataTune[4] =0x53;
        }
    }
    else if (freq < 414000)
    {
        dataTune[2] =0xC5;
        if (enModulation == DEMOD_TYPE_NTSC)
        {
            dataTune[3] = 0x75;
            dataTune[4] = 0x43;
        }
        else
        {
            dataTune[3] =0x74;
            dataTune[4] =0x53;
        }
    }
    else if (freq < 426000)
    {
        dataTune[2] =0xE5;
        if (enModulation == DEMOD_TYPE_NTSC)
        {
            dataTune[3] = 0x75;
            dataTune[4] = 0x43;
        }
        else
        {
            dataTune[3] =0x74;
            dataTune[4] =0x53;
        }
    }
    else if (freq < 672000)
    {
        dataTune[2] =0xA5;
        if (enModulation == DEMOD_TYPE_NTSC)
        {
            dataTune[3] =0xB9;
            dataTune[4] =0x43;
        }
        else
        {
            dataTune[3] =0xB8;
            dataTune[4] =0x53;
        }
    }
    else if (freq < 852000)
    {
        dataTune[2] =0xC5;
        if (enModulation == DEMOD_TYPE_NTSC)
        {
            dataTune[3] =0xB9;
            dataTune[4] =0xC3;
        }
        else
        {
            dataTune[3] =0xB8;
            dataTune[4] =0xD3;
        }
    }
    else
    {
        dataTune[2] =0xE5;
        if (enModulation == DEMOD_TYPE_NTSC)
        {
            dataTune[3] =0xB9;
            dataTune[4] =0xC3;
        }
        else
        {
            dataTune[3] =0xB8;
            dataTune[4] =0xD3;
        }
    }

    dataTune[5] = (enModulation == DEMOD_TYPE_NTSC) ? 0x30 : 0x80;

    /* 1st Tuner Control - Band Control */
    if(MDrv_IIC_WriteBytes(SHARP_TUNER_I2C_ADDR, 0, NULL, 6, dataTune) == FALSE)
    {
        return FALSE;
    }

    //MDrv_Timer_Delayms(20);

    /* 2nd Tuner Control - AGC Control */
    dataTune[4] |= 0x20;
    if(MDrv_IIC_WriteBytes(SHARP_TUNER_I2C_ADDR, 0, NULL, 6, dataTune) == FALSE)
    {
        return FALSE;
    }
#elif (FRONTEND_TUNER_TYPE == LG_TDVS_H703P_TUNER)

    enModulation=enModulation;
    step_num = IF_STEP+u16Frequency;	//PLL step size = 62.5Khz
    //step_num = (U16) ((freq+44000)/FREQ_STEP + 0.5);	//PLL step size = 62.5Khz
    dataTune[0] = HIGHBYTE(step_num)&0x7f;
    dataTune[1] = LOWBYTE(step_num);

    dataTune[2] = 0xCE;		 								//CB

    if((freq) < 165000) 		dataTune[3] = 0x01; 			//BB
    else if ((freq) < 450000) dataTune[3] = 0x02;
    else 					dataTune[3] = 0x04;

	if(prevBandSwitchByte != dataTune[3])
		IsBandSwitch = TRUE;
	else
		IsBandSwitch = FALSE;

	prevBandSwitchByte = dataTune[3];

    //no need to send sub address
    if(MDrv_IIC_WriteBytes(LG_TUNER_I2C_ADDR, 0, NULL, 4, dataTune) == FALSE)
        return FALSE;

    dataTune[0] = 0xDE;			//CB

	if (enModulation==DEMOD_TYPE_256QAM || enModulation==DEMOD_TYPE_64QAM)
		dataTune[1] = 0x20; 			//AB
	else
		dataTune[1] = 0x50; 			//AB

    if(MDrv_IIC_WriteBytes(LG_TUNER_I2C_ADDR, 0, NULL, 2, dataTune) == FALSE)
        return FALSE;

	if(IsBandSwitch == TRUE) MDrv_Timer_Delayms(100);
#endif

	return TRUE;
}

#if( (FRONTEND_TUNER_TYPE==THOMSON_DTT7630_TUNER)||(FRONTEND_TUNER_TYPE==PHILIPS_FQD1236_TUNER)||(FRONTEND_TUNER_TYPE==LG_TDVS_H703P_TUNER))
BOOLEAN TDA9885_Init(void)
{
	U8 addr;
	U8 reg[3];

	addr = 0x00;
	reg[0] = 0xD5;//0x16//0x17
	reg[1] = 0x30;//0x30//0x12
	reg[2] = 0x04;//0x44//0x45

	return MDrv_IIC_WriteBytes(TDA9885_devAddr, 1, &addr, 3, reg);
}
#endif

#if(FRONTEND_TUNER_TYPE == SAMSUNG_S205_TUNER)
U8 DRV_TDA6651_GetChargePumpData(U32 u32freq)
{
    float freq;
    U8 pChargePumpValue;

    freq = (float)u32freq / 1000;

    if ((freq>36.0) && (freq<=170.0))
	{
		if ((freq>36.0) && (freq<=48.0))
			pChargePumpValue = 1;
		else if ((freq>48.0) && (freq<=100.0))
			pChargePumpValue = 2;
		else if ((freq>100.0) && (freq<=112.0))
			pChargePumpValue = 3;
		else if ((freq>112.0) && (freq<=132.0))
			pChargePumpValue = 4;
		else if ((freq>132.0) && (freq<=140.0))
			pChargePumpValue = 5;
		else if ((freq>140.0) && (freq<=170.0))
			pChargePumpValue = 6;

		pChargePumpValue = (pChargePumpValue << 5) | 0x01;
	}
	else if ((freq>170.0) && (freq<=469.0))
	{
		if ((freq>169.0) && (freq<=180.0))
			pChargePumpValue = 1;
		else if ((freq>180.0) && (freq<=252.0))
			pChargePumpValue = 2;
		else if ((freq>252.0) && (freq<=360.0))
			pChargePumpValue = 3;
		else if ((freq>360.0) && (freq<=404.0))
			pChargePumpValue = 4;
		else if ((freq>404.0) && (freq<=428.0))
			pChargePumpValue = 5;
		else if ((freq>428.0) && (freq<=440.0))
			pChargePumpValue = 6;
		else if ((freq>440.0) && (freq<=469.0))
			pChargePumpValue = 7;

		pChargePumpValue = (pChargePumpValue << 5) | 0x02;

	}
	else if ((freq>469.0) && (freq<=864.0))
	{
		if ((freq>469.0) && (freq<=560.0))
			pChargePumpValue = 3;
		else if ((freq>560.0) && (freq<=632.0))
			pChargePumpValue = 4;
		else if ((freq>632.0) && (freq<=708.0))
			pChargePumpValue = 5;
		else if ((freq>708.0) && (freq<=824.0))
			pChargePumpValue = 6;
		else if ((freq>824.0) && (freq<=864.0))
			pChargePumpValue = 7;

		pChargePumpValue = (pChargePumpValue << 5) | 0x08;
	}
	else
	{
		pChargePumpValue = 1;
	}
    return pChargePumpValue;
}
#endif

BOOLEAN NTSC_IF_ReadStatus(U8 * AFT_Status)
{

#if ((FRONTEND_TUNER_TYPE == THOMSON_DTT7630_TUNER)||(FRONTEND_TUNER_TYPE == PHILIPS_FQD1236_TUNER)||(FRONTEND_TUNER_TYPE == LG_TDVS_H703P_TUNER))
	U8 I2C_RESULT;

        I2C_RESULT=MDrv_IIC_ReadBytes(TDA9885_devAddr, 0, NULL, 1, AFT_Status);

        if(TRUE==I2C_RESULT)
            return TRUE;
        else
            return FALSE;

	#if 0
	LG3303_DEBUG(printf("\nstatus = 0x%02bx\n", status));
    LG3303_DEBUG(printf("after power on : %bu\n", status&0x01 ));
    LG3303_DEBUG(printf("afc offset     : %bu\n", (status>>1)&0x0f ));
    LG3303_DEBUG(printf("fm det         : %bu\n", (status & 0x20)>>5 ));
    LG3303_DEBUG(printf("vif level      : %bu\n", (status & 0x40)>>6 ));
    LG3303_DEBUG(printf("afc window     : %bu\n", (status & 0x80)>>7 ));
    #endif

#elif (FRONTEND_TUNER_TYPE == SHARP_VA1Y2UR2201_TUNER)
	if(MDrv_IIC_ReadBytes(SHARP_TUNER_I2C_ADDR, 0, NULL, 1, AFT_Status) == FALSE)
		return FALSE;
        else
		return TRUE;
#else
        *AFT_Status=*AFT_Status;
#endif

    return FALSE;
}//IF_ReadStatus

#endif


⌨️ 快捷键说明

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