saa7114.c

来自「台湾联咏NT68663 LCD MONITOR 控制程序(完整版)」· C语言 代码 · 共 349 行

C
349
字号
#include "IIC.H"
#include "stdio.h"
#include "SAA7114.H"
#include "RAM.H"
#include "MyDef.H"
#include "Scaler.H"
#include "MCU.H"
#include "ROM_MAP.H"
#include "USERADJ.H"

Byte code Init7114Table[]={	
//0x01~0x0f
	0x00,0x08,0xc5,0x10,0x90,0x90,0xeb,0xe0,
	0xb8,0x40,0x80,0x44,0x40,0x00,0x89,0x2a,
//	0x00,0x08,0xc0,0x10,0x90,0x90,0xeb,0xe0,
//	0xb8,0x40,0x80,0x44,0x40,0x00,0x89,0x2e,
//0x10~0x1f
	0x0e,0x00,0x00,0x00,0x00,0x11,0xfe,0x40, 
	0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
//0x20~0x2f					
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0x30~0x3f					
	0xbc,0xdf,0x02,0x00,0xcd,0xcc,0x3a,0x00,
	0x03,0x20,0x03,0x00,0x00,0x00,0x00,0x00,
//0x40~0x4f					
	0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
//0x50~0x5f					
	0xff,0xff,0xff,0xff,0x5f,0xff,0xff,0xff,
	0x00,0x47,0x06,0x83,0x00,0x3e,0x00,0x00,
//0x60~0x6f					
	0x00,0x05,0xa0,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0x70~0x7f					
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0x80~0x8f					
	0x12,0x00,0x00,0x01,0x01,0x04,0x45,0x01,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0x90~0x9f								
	0x00,0x08,0x09,0x40,0x10,0x00,0xd0,0x02,
	0x0a,0x00,0xf0,0x00,0xd0,0x02,0xf0,0x00,
//0xa0~0xaf					
	0x01,0x00,0x00,0x00,0x80,0x40,0x40,0x00,
	0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,
//0xb0~0xbf					
	0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0xc0~0xcf					
	0x00,0x08,0x10,0x81,0x10,0x00,0xd0,0x02,
	0x0a,0x00,0x20,0x01,0xd0,0x02,0x20,0x01,
//0xd0~0xdf					
	0x01,0x00,0x00,0x00,0x80,0x40,0x40,0x00,
	0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,
//0xe0~0xef					
	0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void CheckSaa7114()
{
	Byte Ack;
	SAA7114On();
	Sleep(10);
	IIC_Start();
	Ack = IIC_Tx(SAA7114);
	if(Ack == ACK)
		Saa7114En = 1;
	else
		Saa7114En = 0;
	IIC_Stop();
	SAA7114Off();
}

bit CheckAVExist()
{
	Word i;
	Byte value;
	SAA7114On();
	Sleep(50);
	for(i=0;i<256;i++)
		WriteIIC(SAA7114,i,Init7114Table[i]);
	WriteIIC(SAA7114,0x88,0xe0);		//release reset
	switch(FuncBuf[pVIDEOSOURCE])
		{
		case 0x03:
			WriteIIC(SAA7114,0x02,0xc5);	//SAA7114 AV In
			WriteIIC(SAA7114,0x14,0x22);	//aout=ad2
			break;
		case 0x04:
			WriteIIC(SAA7114,0x02,0xc7);	//SAA7114 Y/C In
			WriteIIC(SAA7114,0x14,0x12);	//aout=ad1
			break;
		}
	Sleep(500);
	value = ReadIIC(SAA7114,0x1f);	
	SAA7114Off();
	if(!(value & BIT_6))
		return 1;
	else
		return 0;
}

void SAA7114Init(void)
{
	Word i;
	SAA7114On();
	ForceToBackground(0,0,0);
	for(i=0;i<256;i++)
		WriteIIC(SAA7114,i,Init7114Table[i]);
	WriteIIC(SAA7114,0x88,0xe0);		//release reset & power down
	switch(FuncBuf[pVIDEOSOURCE])
		{
		case 0x03:
			WriteIIC(SAA7114,0x02,0xc5);	//SAA7114 AV In
			WriteIIC(SAA7114,0x14,0x22);	//aout=ad2
			break;
		case 0x04:
			WriteIIC(SAA7114,0x02,0xc7);	//SAA7114 Y/C In
			WriteIIC(SAA7114,0x14,0x12);	//aout=ad1
			break;
		}
	FuncBuf[pBRIGHTNESS] = 50;	//set scaler
	SetBrightness();
	FuncBuf[pCONTRAST] = 50;
//	FuncBuf[pRCOLOR] = 0x7f;
//	FuncBuf[pGCOLOR] = 0x7f;
//	FuncBuf[pBCOLOR] = 0x7f;
	#ifdef X15
	WriteIIC563(0x061,0x0d);
	WriteIIC563(0x063,0x80);
	WriteIIC563(0x061,0x0e);
	WriteIIC563(0x063,0x80);
	WriteIIC563(0x061,0x0f);
	WriteIIC563(0x063,0x80);
	#else
	WriteIIC563(0x061,0x0d);
	WriteIIC563(0x063,0x80);
	WriteIIC563(0x061,0x0e);
	WriteIIC563(0x063,0x80);
	WriteIIC563(0x061,0x0f);
	WriteIIC563(0x063,0x80);
	#endif	
	SetContrast();		//scaler
	FuncBuf[pBACKLIGHT] = 0x7f;
	SetInverter();
	//
	FuncBuf[pBRIGHTNESS] = Read24C16(ep_Video_Brightness);
	FuncBuf[pCONTRAST] = Read24C16(ep_Video_Contrast);
	FuncBuf[pSATURATION] = Read24C16(ep_Video_Saturation);
	FuncBuf[pSHARPNESS] = Read24C16(ep_Video_Shapness);
	FuncBuf[pTINT] = Read24C16(ep_Video_Tint);
	SetVideoBrightness();
	SetVideoContrast();
	SetVideoSaturation();
	SetVideoSharpness();
	SetVideoTint();
	VideoTimer = VIDEO_SEARCH_TIME;
	VideoFlag = 0xff;
	MonoVideo = 0;
	BlueScreen = 0;
}

void CheckVideo(void)
{
	Byte value;
	value = ReadIIC(SAA7114,0x1f);
	value &= 0xe1;
	if(value != VideoFlag)
		{
		VideoFlag = value;
		VideoTimer = VIDEO_SEARCH_TIME;
		PowerTimer = POWER_TIME-100;
		BlueScreen = 0;
		VideoOK = 0;
		Osd_Off();
		//FastMuteOn();
		BackLightOff();
		ForceToBackground(0,0,0);
		Sleep(10);
		#if PRINT_MESSAGE
		printf("No Video\n");
		#endif
		}
	if(VideoTimer < 100 && !VideoUnlock && !VideoOK)
		{
		VideoOK = 1;
		MonoVideo = 0;
		CheckColorSystem();
		SetVideoSharpness();
		SetScalerAV();
		}
	if(VideoTimer == 0 && VideoUnlock && !BlueScreen)
		{
		if(!MessageShow)
			{
			ShowMessage(MSG_NOSYNC);
			//FastMuteOff();
			BackLightOn();
			Sleep(1000);
			Osd_Off();
			//FastMuteOn();
			BackLightOff();
			MessageShow = 1;
			}
		BlueScreen = 1;
		FuncBuf[pVIDEOSOURCE]++;
		if(FuncBuf[pVIDEOSOURCE]>4)
			{
			MessageShow = 0;
			PowerTimer = POWER_TIME-200;
			FuncBuf[pVIDEOSOURCE]=0;
			ChangeMode = 1;
			}
		SetSource();
		}
}

void CheckColorSystem(void)
{
	Byte code tab1[]={0x81,0x91,0xa1,0xb1,0xc1,0xd0};
	Byte code tab2[]={0x2a,0x2a,0x2a,0x2a,0x2a,0x80};
	Byte code F60_CaptureTab[]={0xf0,0x00,0xf0,0x00};
	Byte code F50_CaptureTab[]={0x2a,0x01,0x2a,0x01};
	Byte code ColorSystemTab[][4]={
							{0x40,0x09,0x2a,0x0e},
							{0x40,0x11,0x2a,0x06},
							{0x40,0x29,0x2a,0x0e},
							{0x40,0x31,0x2a,0x06},
							{0x40,0x49,0x2a,0x0e},
							{0x00,0x59,0x80,0x06},
							};
	Byte i,value,loop,VideoColorStatus;
	if(MonoVideo)
		return;
	i = 0;
	WriteIIC(SAA7114,0x0e,tab1[i]);
	WriteIIC(SAA7114,0x0f,tab2[i]);
	for(loop=0;loop<3;loop++)
		{
		value = ReadIIC(SAA7114,0x1f);
		if((value & 0x41) != 0x01)
			{
			for(i=0; i<6; i++)
				{
				WriteIIC(SAA7114,0x0e,tab1[i]);
				WriteIIC(SAA7114,0x0f,tab2[i]);
				Sleep(100);
				value = ReadIIC(SAA7114,0x1f);
				if((value & 0x41) == 0x01)
					{
					VideoColorStatus = i;
					break;
					}
				}
			}
		}
	VideoFlag = value & 0xe1;
	if(i == 6)
		{
		i = VideoColorStatus;
		WriteIIC(SAA7114,0x0e,tab1[i]);
		WriteIIC(SAA7114,0x0f,tab2[i]);
		MonoVideo = 1;
		#if PRINT_MESSAGE
			printf("Color system = B/W\n");
		#endif
		}
	else
		{
		MonoVideo = 0;
		#if PRINT_MESSAGE
			printf("Color system = %x\n",(unsigned short)i);
		#endif
		}
	WriteIIC(SAA7114,0x0e,tab1[i] & 0x7f);
	WriteIIC(SAA7114,0x0e,tab1[i]);
	if(Video_60Hz)
		{
		WriteIIC(SAA7114,0x9a,F60_CaptureTab[0]);
		WriteIIC(SAA7114,0x9b,F60_CaptureTab[1]);
		WriteIIC(SAA7114,0x9e,F60_CaptureTab[2]);
		WriteIIC(SAA7114,0x9f,F60_CaptureTab[3]);
		}
	else
		{
		WriteIIC(SAA7114,0x9a,F50_CaptureTab[0]);
		WriteIIC(SAA7114,0x9b,F50_CaptureTab[1]);
		WriteIIC(SAA7114,0x9e,F50_CaptureTab[2]);
		WriteIIC(SAA7114,0x9f,F50_CaptureTab[3]);
		}
	value =  ColorSystemTab[i][0];
	if(FuncBuf[pVIDEOSOURCE] == 4)	//Svideo comb filter en
		value |= BIT_7;
	WriteIIC(SAA7114,0x09,value);
	WriteIIC(SAA7114,0x0e,ColorSystemTab[i][1]);
	WriteIIC(SAA7114,0x0f,ColorSystemTab[i][2]);
	WriteIIC(SAA7114,0x10,ColorSystemTab[i][3]);
	if(Video_60Hz)
		TvMode = i + 7;
	else
		TvMode = i;
}

void SetVideoBrightness(void)
{
	Byte value;
	value = FuncBuf[pBRIGHTNESS] * 2 + 28;
	WriteIIC(SAA7114,0x0a,value);
	#if PRINT_MESSAGE
		printf("Brightness of SAA7114 = %x\n",(unsigned short)value);
	#endif
}
void SetVideoContrast(void)
{
	Byte value;
	value = FuncBuf[pCONTRAST]*127/100 ;
	WriteIIC(SAA7114,0x0b,value);
	#if PRINT_MESSAGE
		printf("Contrast of SAA7114 = %x\n",(unsigned short)value);
	#endif
}
void SetVideoSaturation(void)
{
	Byte value;
	value = FuncBuf[pSATURATION]+14;
	WriteIIC(SAA7114,0x0c,value);
	#if PRINT_MESSAGE
		printf("Saturation of SAA7114 = %x\n",(unsigned short)value);
	#endif
}
void SetVideoTint(void)
{
	Byte value;
	value = FuncBuf[pTINT] * 255/ 100;	//50% = 0
	WriteIIC(SAA7114,0x0d,value);
	#if PRINT_MESSAGE
		printf("Tint of SAA7114 = %x\n",(unsigned short)value);
	#endif
}
void SetVideoSharpness(void)
{
code unsigned char SharpnessTab[]={
	0x0f,0x0e,0x0e,0x0d,0x0c,0x0c,0x0b,0x0a,0x0a,0x09,0x08,0x08,
	0x00,
	0x07,0x06,0x06,0x05,0x04,0x04,0x03,0x02,0x02,0x01,0x01,
//	0x47,0x46,0x46,0x45,0x44,0x44,0x43,0x42,0x42,0x41,0x41,
	//Edit By Travis 盢X╰

⌨️ 快捷键说明

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