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

📄 samsungdtvs205.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 2 页
字号:
#define _SAMSUNGDTVS205_C_

/* ------------------------------------
    Header Files
   ------------------------------------ */
#include <stdio.h>
#include <string.h>
#include "SamsungDTVS205.h"

#define SAMSUNG_S5H1409_I2C_ADDR        0xF2
#define INIT_1409_TABLE_NUMS 43//42
#define QAM_CHECK_LOCK_TIME_SLICE   100
#define QAM_WAIT_LOCK_TOTAL_TIME   400
#define QAM_CHECK_LOCK_COUNTER  QAM_WAIT_LOCK_TOTAL_TIME/QAM_CHECK_LOCK_TIME_SLICE
#define QAM_WAIT_AGC_LOCK_TOTAL_TIME   300
#define QAM_CHECK_AGC_LOCK_TIME_SLICE       50
#define QAM_CHECK_AGC_LOCK_COUNTER          QAM_WAIT_AGC_LOCK_TOTAL_TIME/QAM_CHECK_AGC_LOCK_TIME_SLICE

SamsungChipInit_t tDTVS5H1409_Tbl[INIT_1409_TABLE_NUMS] =
{
    {0xFA, 0x0000},
    {0x1C, 0x001D},
    {0x1F, 0x002D},
    {0x20, 0x001D},
    {0x22, 0x0022},
    {0x23, 0x0020},
    {0x28, 0x1010},
    {0x29, 0x110F},
    {0x2A, 0x10B4},
    {0x2B, 0x10AE},
    {0x2C, 0x0031},
    {0x31, 0x010D},
    {0x32, 0x0100},
    {0x44, 0x0510},
    {0x54, 0x0104},
    {0x5D, 0x0370},
    {0x5E, 0x0296},
    {0x58, 0x2222},
    {0x59, 0x1162},
    {0x5A, 0x3211},
    {0x61, 0x0010}, // bubbling channel tuning_Init 1.4
    {0x63, 0x4A00},
    {0x65, 0x0800},
    {0x71, 0x0003},
    {0x72, 0x0470},
    {0x96, 0x000C}, // QAM PTL on mode  for 1.2
    {0x99, 0x0101},
    {0x9C, 0x2E37}, // QAM PTL on mode  for 1.2
    {0x9D, 0x2C37}, // QAM PTL on mode  for 1.2
    {0x9E, 0x2E37}, // QAM PTL on mode  for 1.2
    {0x81, 0x0003}, //
    {0x82, 0x0600},
    {0x86, 0x0002},
    {0x8A, 0x2C38},
    {0x8B, 0x2A37},
    {0x92, 0x302F},
    {0x93, 0x3332},
    {0xAC, 0x1003},
    {0xAD, 0x103F},
    {0xB1, 0x000E},
    {0xE2, 0x0100},
    {0xF5, 0x0000},
    {0xF5, 0x0001},
};

BOOLEAN SamsungS5H1409_Init(void)
{
    U8 i;
    BOOLEAN Result;

    for(i = 0 ; i < INIT_1409_TABLE_NUMS ; i++)
    {
        Result = MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, tDTVS5H1409_Tbl[i].Reg, tDTVS5H1409_Tbl[i].Value);
    }

    return Result;
}

SamsungReturn_t SamsungS5H1409AlterMpegMode(SamsungMpegMode_t mode)
{
    SamsungReturn_t Result;
    if(mode != Samsung_PARAL && mode != Samsung_SERIAL)
        return (SamsungReturn_t)(Samsung_ERR_PARAM|Samsung_ERR_ALTER_FUNC);

    if(mode == Samsung_PARAL)
	    Result = MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xAB, 0x1001);
    else
        Result = MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xAB, 0x1101);

	return Result;
}

/**************************************************************************
* S5H1409 Set the Mpeg Output Timing
*	Conditions:
*	Description : Inverting output clk.(Default)
*	After this function is called,TS timing could be changed.
*	Addr : 0xac
*	Value: 0x0330
/**************************************************************************/
BOOLEAN SamsungS5H1409_MpegClk_InvertedSet(void)
{
	return MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xAC,0x0330);
}

/**************************************************************************
* S5H1409 Set the Mpeg Output Timing
*	Conditions:
*	Description : Non-inverting output clk.
*	After this function is called,TS timing could be changed.
*	Addr : 0xac
*	Value: 0x1330
/**************************************************************************/
BOOLEAN SamsungS5H1409_MpegClk_Non_InvertedSet(void)
{
	return MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xAC,0x1330);
}

BOOLEAN SamsungS5H1409xRepeaterEnable(void)
{
	return MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xF3, 0x0001);
}
BOOLEAN SamsungS5H1409xRepeaterDisable(void)
{
	return MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xF3, 0x0000);
}

BOOLEAN SamsungS5H1409xSleepOn(void)
{
	return MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xF2, 0x0001);
}

BOOLEAN SamsungS5H1409xSleepOff(void)
{
    BOOLEAN result;
    result = MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xF2, 0x0000);
    if(result!=FALSE)
        result=SamsungS5H1409_SoftReset();
    return result;
}

BOOLEAN SamsungS5H1409xCheckIsSleep(void)
{
    if(MDrv_IIC_Read2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x00F2)==0x0001)
        return TRUE;
    else
        return FALSE;
}

BOOLEAN SamsungS5H1409_SoftReset(void)
{
    BOOLEAN result;
    result=MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xF5, 0x0000);
    MDrv_Timer_Delayms(5);
    result=MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xF5, 0x0001);
    return result;
}

#if 0
BOOLEAN SamsungS5H1409_SoftResetOn(void)
{
	return MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xF5, 0x0000);
}

BOOLEAN SamsungS5H1409_SoftResetOff(void)
{
	return MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xF5, 0x0001);
}
#endif
BOOLEAN SamsungS5H1409VsbMode(void)
{
	BOOLEAN result;
	result = MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xF4, 0x0000);
	return result;
}

BOOLEAN SamsungS5H1409x64QamMode(void)
{
	BOOLEAN result;
	result = MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xF4,0x0001);
	result = MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x85,0x0100);
	return result;
}

BOOLEAN SamsungS5H1409x256QamMode(void)
{
	BOOLEAN result;
	result = MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xF4,0x0001);
	result = MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x85,0x0101);
	return result;
}

/*********************************************************************************************************
* S5H1409 QAM Interleave mode set driver
* Conditions: Only in qam mode
* Description: In the TOV state at low SNR, this driver can improve the performance.
* Addr: 0xab
* Value: 0x1000 -> manually write the interleaver mode.
* There are two interleave mode set drivers depending on the TS type.
**********************************************************************************************************/
void SamsungS5H1409_Interleave_Parallel_ModeSet()
{
    static U16 temp,temp1,temp2=0;
    static U16 qam_up = 0;

    temp = MDrv_IIC_Read2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x00F1);
    temp1= MDrv_IIC_Read2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x00B2);
    temp2= MDrv_IIC_Read2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x00AD);

    if((temp>>15)&0x1) //  if (master lock)
    {
        if(qam_up!=2)
        {
            qam_up = 2;
            MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x96,0x0020);
            MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xAD,(((temp1&0xF000)>>4)|( temp2&0xF0FF )) );
            MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xAB,0x1000);
        }
    }
    else		   //  if (unlock)
    {
    	if(qam_up!=1)
    	{
            qam_up = 1;
            MDrv_IIC_Write2Bytes (SAMSUNG_S5H1409_I2C_ADDR, 0x96, 0x0008);
            MDrv_IIC_Write2Bytes (SAMSUNG_S5H1409_I2C_ADDR, 0xAB, 0x1001);
    	}
    }
}

void SamsungS5H1409_Interleave_Serial_ModeSet()
{
    static U16 temp,temp1,temp2=0;
    static U16 qam_up = 0;

    temp = MDrv_IIC_Read2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x00F1);
    temp1= MDrv_IIC_Read2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x00B2);
    temp2= MDrv_IIC_Read2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x00AD);

    if((temp>>15)&0x1) //  if (master lock)
    {
        if(qam_up!=2)
        {
            qam_up = 2;
            MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x96,0x0020);
            MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xAD,(((temp1&0xF000)>>4)|( temp2&0xF0FF )) );
            MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xAB,0x1100);
        }
    }
    else		   //  if (unlock)
    {
    	if(qam_up!=1)
    	{
            qam_up = 1;
            MDrv_IIC_Write2Bytes (SAMSUNG_S5H1409_I2C_ADDR, 0x96, 0x0008);
            MDrv_IIC_Write2Bytes (SAMSUNG_S5H1409_I2C_ADDR, 0xAB, 0x1101);
    	}
    }
}

/*******************************************************************************************************************************
* S5H1409 QAM AM HUM set driver
* Conditions: Only in QAM mode
* Description: This function set the equalizer step size automatically while monitoring the equalizer output values.
* The AM_HUM performance gets better through this function. This function should be always set and work in
* 64/256QAM mode.
* Addr: 0x93, 0x9e
* Value: 0x93: 0x3332 (in normal condition), 0x3130(in the TOV state)
*        0x9e: 0x2c37 (in normal condition), 0x2836(in the TOV state)
*******************************************************************************************************************************/
void SamsungS5H1409AMHUM_SetDriver()
{
    U16 temp;

    temp = MDrv_IIC_Read2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x00F0);
    if((temp>>13)&0x1) //EQ lock
    {
        MDrv_IIC_Write2Bytes (SAMSUNG_S5H1409_I2C_ADDR, 0x96, 0x000C);
        if((temp&0xff)<0x38 || ((temp&0xff)>0x68))
        {
            MDrv_IIC_Write2Bytes (SAMSUNG_S5H1409_I2C_ADDR, 0x93, 0x3332);
        }
        else if( ((temp&0xff)>0x40) && ((temp&0xff)<0x68) )
        {
            MDrv_IIC_Write2Bytes (SAMSUNG_S5H1409_I2C_ADDR, 0x93, 0x3130);
        }

        if((temp&0xff)<0x38 || ((temp&0xff)>0x68))
        {
            MDrv_IIC_Write2Bytes (SAMSUNG_S5H1409_I2C_ADDR, 0x9E, 0x2E37);
        }
        else if( ((temp&0xff)>0x40) && ((temp&0xff)<0x68) )
        {
            MDrv_IIC_Write2Bytes (SAMSUNG_S5H1409_I2C_ADDR, 0x9E, 0x2836);
        }
    }
    else//EQ unlock
    {
        MDrv_IIC_Write2Bytes (SAMSUNG_S5H1409_I2C_ADDR, 0x96, 0x0008);
        MDrv_IIC_Write2Bytes (SAMSUNG_S5H1409_I2C_ADDR, 0x93, 0x3332);
        MDrv_IIC_Write2Bytes (SAMSUNG_S5H1409_I2C_ADDR, 0x9E, 0x2E37);
    }
}

BOOLEAN SamsungS5H1409xVSBScanInit(void)
{
	BOOLEAN result;
	result = MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x3B,0x1000);
	result = MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x44,0x0500);
	return result;
}

BOOLEAN SamsungS5H1409xVSBScanEnd(void)
{
	BOOLEAN result;
	result = MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x3B,0x1010);
	result = MDrv_IIC_Write2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x44,0x0510);
	return result;
}

/**************************************************************************
* S5H1409 VSB/QAM Master Lock Check Driver
*	Conditions:
*	Description :
*	This function is used to check whether the channel chip is lock
*	or not in VSB mode.
*	Addr : 0x40
*	Value:
*	0bit -> 1:Lock , 0:Unlock
***************************************************************************/
BOOLEAN SamsungS5H1409xVsb_Sync_Lock(void)
{
	U16 value;
	BOOLEAN result;

	value = MDrv_IIC_Read2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0x40);
	result = (BOOLEAN)(((U16)value) & 0x01);   // 1 -->Sync lock

	return (result);
}

BOOLEAN SamsungS5H1409xQAM_IsAGC_Lock(void)
{
    U16 value;
    value = MDrv_IIC_Read2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xA0);
    //if((value>0xF870)&&(value<0xFB00))
    if(value>0xF870)
        return FALSE;       //AGC Unlock
    else
        return TRUE;
}

/**************************************************************************
* S5H1409 VSB/QAM Master Lock Check Driver
*	Conditions:
*	Description :
*	This function is used to check whether the channel chip is lock
*	or not in VSB mode.
*	Addr : 0xf1
*	Value:
*	15bit -> 1:Lock , 0:Unlock
***************************************************************************/
BOOLEAN SamsungS5H1409xVsb_QAM_Master_Lock(void)
{
	U16 value;
	BOOLEAN result;

	value = MDrv_IIC_Read2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xF1);
	result = (BOOLEAN)(((U16)value >> 15) & 0x01);   // 1 -->Master lock
	return (result);
}

/**************************************************************************
* S5H1409 VSB FEC Lock Check Driver
*	Conditions:
*	Description :
*	This function is used to check whether the channel
*	chip is lock or not in VSB mode.
*	Addr : 0xf1
*	Value:
*	12bit -> 0:Lock , 1:Unlock
***************************************************************************/
BOOLEAN SamsungS5H1409xVsb_FEC_Lock(void)
{
	U16 value;
	BOOLEAN result;

	value = MDrv_IIC_Read2Bytes(SAMSUNG_S5H1409_I2C_ADDR, 0xF1);
	result = (BOOLEAN)(((U16)value >> 12) & 0x01);           // 1 --> FEC LOCK

	return (result);
}

void SamsungS5H1409xCheckSignalCondition(SamsungSignalCondition_t* pstatus)
{
	U16 value,value1,value2;
	double SnrValue = 0;


	value = MDrv_IIC_Read2Bytes( SAMSUNG_S5H1409_I2C_ADDR, 0xf4 ); //mode check
	if(value==0)//VSB mode
	{
		SnrValue=SamsungS5H1409xVsbSnrResultCheck();
        if(!SamsungS5H1409xVsb_FEC_Lock())
            SnrValue=0;
		if(SnrValue==0)
			*pstatus=Samsung_SIGNAL_NO;
		else if(SnrValue<18.4)
			*pstatus=Samsung_SIGNAL_WEAK;
		else if(SnrValue<21.8)
			*pstatus=Samsung_SIGNAL_MODERATE;
		else if(SnrValue<26.9)
			*pstatus=Samsung_SIGNAL_STRONG;
		else
			*pstatus=Samsung_SIGNAL_VERY_STRONG;
	}
	else//qam MODE
	{
        if(SamsungS5H1409xVsb_QAM_Master_Lock()==0)
        {
            *pstatus=Samsung_SIGNAL_NO;
            return;
        }
		SnrValue=SamsungS5H1409xQamSnrResultCheck();
		value1 = MDrv_IIC_Read2Bytes( SAMSUNG_S5H1409_I2C_ADDR, 0x85 );
		value2 = MDrv_IIC_Read2Bytes( SAMSUNG_S5H1409_I2C_ADDR, 0xf0 );
		value2 = ( ( unsigned int ) value2 >> 8 & 0x01 );

		if (( value1 == 0x110 && value2 == 1)||( value1 == 0x101 ))
		{
			if(SnrValue==0)
				*pstatus=Samsung_SIGNAL_NO;
			else if(SnrValue<31.2)
				*pstatus=Samsung_SIGNAL_WEAK;
			else if(SnrValue<32.4)
				*pstatus=Samsung_SIGNAL_MODERATE;
			else if(SnrValue<34.2)
				*pstatus=Samsung_SIGNAL_STRONG;
			else
				*pstatus=Samsung_SIGNAL_VERY_STRONG;
		}
		else if ( (value1 == 0x110 && value2 == 0 )||( value1 == 0x100 ))
		{
			if(SnrValue==0)
				*pstatus=Samsung_SIGNAL_NO;
			else if(SnrValue<25.4)
				*pstatus=Samsung_SIGNAL_WEAK;
			else if(SnrValue<27.8)
				*pstatus=Samsung_SIGNAL_MODERATE;
			else if(SnrValue<31.4)
				*pstatus=Samsung_SIGNAL_STRONG;
			else
				*pstatus=Samsung_SIGNAL_VERY_STRONG;
		}
		else
		{
			*pstatus=Samsung_SIGNAL_NO;
		}
	}
}

/**************************************************************************
* S5H1409 VSB SNR value(Signal Strength) Check Driver
*	Conditions:
*	Description :
*	This function lets the user's application software read a value
*	that is related to the SNR through the SNR Look Up Table in VSB mode.
*	Addr : 0xf1
*	Value: [9:0]
/**************************************************************************/

double SnrLookUpTable ( int SnrRead )
{
	double SnrLookUP;
	if ( SnrRead == 1023 )
	{
		SnrLookUP = 77 ;
	}  // Something Wrong
	else if ( SnrRead > 923 )
	{
		SnrLookUP = 30 ;
	}
	else if ( SnrRead > 918 )
	{
		SnrLookUP = 29.5 ;
	}
	else if ( SnrRead > 915 )
	{
		SnrLookUP = 28.5 ;
	}
	else if ( SnrRead > 911 )
	{
		SnrLookUP = 28.5 ;
	}
	else if ( SnrRead > 906 )
	{
		SnrLookUP = 28.0 ;
	}
	else if ( SnrRead > 901 )
	{
		SnrLookUP = 27.5 ;
	}
	else if ( SnrRead > 896 )
	{
		SnrLookUP = 27.0 ;
	}
	else if ( SnrRead > 891 )
	{
		SnrLookUP = 26.5 ;
	}
	else if ( SnrRead > 885 )
	{
		SnrLookUP = 26.0 ;
	}
	else if ( SnrRead > 879 )
	{
		SnrLookUP = 25.5 ;
	}
	else if ( SnrRead > 873 )
	{
		SnrLookUP = 25.0 ;
	}
	else if ( SnrRead > 864 )
	{
		SnrLookUP = 24.5 ;
	}
	else if ( SnrRead > 858 )
	{
		SnrLookUP = 24.0 ;
	}
	else if ( SnrRead > 850 )
	{
		SnrLookUP = 23.5 ;
	}
	else if ( SnrRead > 841 )
	{
		SnrLookUP = 23.0 ;
	}
	else if ( SnrRead > 832 )
	{
		SnrLookUP = 22.5 ;
	}
	else if ( SnrRead > 823 )
	{
		SnrLookUP = 22.0 ;
	}
	else if ( SnrRead > 812 )
	{
		SnrLookUP = 21.5 ;
	}
	else if ( SnrRead > 802 )
	{
		SnrLookUP = 21.0 ;
	}
	else if ( SnrRead > 788 )
	{
		SnrLookUP = 20.5 ;
	}
	else if ( SnrRead > 778 )
	{
		SnrLookUP = 20.0 ;
	}
	else if ( SnrRead > 767 )
	{
		SnrLookUP = 19.5 ;
	}
	else if ( SnrRead > 753 )
	{
		SnrLookUP = 19.0 ;
	}
	else if ( SnrRead > 740 )
	{
		SnrLookUP = 18.5 ;
	}
	else if ( SnrRead > 725 )
	{
		SnrLookUP = 18.0 ;
	}
	else if ( SnrRead > 707 )
	{
		SnrLookUP = 17.5 ;
	}
	else if ( SnrRead > 689 )
	{
		SnrLookUP = 17.0 ;
	}
	else if ( SnrRead > 671 )
	{
		SnrLookUP = 16.5 ;
	}
	else if ( SnrRead > 656 )
	{
		SnrLookUP = 16.0 ;
	}
	else if ( SnrRead > 637 )
	{
		SnrLookUP = 15.5 ;
	}
	else if ( SnrRead > 616 )
	{
		SnrLookUP = 15.0 ;
	}
	else if ( SnrRead > 542 )
	{
		SnrLookUP = 14.5 ;
	}
	else if ( SnrRead > 519 )
	{
		SnrLookUP = 14.0 ;
	}
	else if ( SnrRead > 507 )
	{
		SnrLookUP = 13.5 ;
	}
	else if ( SnrRead > 497 )
	{
		SnrLookUP = 13.0 ;
	}
	else if ( SnrRead > 492 )
	{
		SnrLookUP = 12.5 ;
	}
	else if ( SnrRead > 474 )
	{
		SnrLookUP = 12.0 ;
	}
	else if ( SnrRead > 300 )
	{
		SnrLookUP = 1.11 ;
	}
	else
	{
		SnrLookUP = 0;
	}
	return SnrLookUP;
}


double SamsungS5H1409xVsbSnrResultCheck ( void )
{
	U16 value;
	double SnrValue;
	value = MDrv_IIC_Read2Bytes( SAMSUNG_S5H1409_I2C_ADDR, 0xf1 );
	value = ( value & 0x3ff );
	SnrValue = SnrLookUpTable( value );
	return SnrValue;

⌨️ 快捷键说明

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