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

📄 osd.c

📁 tw9910的驱动源码,来自techwell的FAE
💻 C
字号:
#include "Config.h"
#include "reg.h"
#include "typedefs.h"
#include "main.h"
#include "tw99.h"
#include "i2c.h"
#include "printf.h"
#include "osd.h"

#define RED		0x08
#define GREEN	0x02
#define BLUE	0x04

static DATA BYTE HEIGHT=0, WIDTH=0;
extern DATA BYTE OneMenuIndex;
extern DATA BYTE TwoMenuIndex;
extern DATA BYTE OldOSDData;
extern DATA BYTE ChipID;

void OSDCmd1(BYTE cmd)
{
	WriteI2Cn_(OSDI2CAddress, &cmd, 1);
}

void OSDCmd2(BYTE cmd1, BYTE cmd2)
{
	BYTE cmd[2];
	
	cmd[0] = cmd1;
	cmd[1] = cmd2;

	WriteI2Cn_(OSDI2CAddress, cmd, 2);
}

void OSDPuts( CODE_P char *str )
{
	BYTE cmd;

	cmd = WIDTH? 0xa5 : 0xa3;

	while( *str )
		OSDCmd2( cmd, *str++ );
}

void OSDgotoxy(BYTE x, BYTE y)
{
	if( HEIGHT ) y |= 0x20;

	OSDCmd2( 0xa0, y );		// Row = 2
	OSDCmd2( 0xa2, x );		// Col = 5
}

#ifdef KEILC
void OSDPutHex(BYTE HexValue)
{


	BYTE i, j, k;

	i = HexValue>>4;
	j = i > 9 ? i + 'A' - 10 : i + '0';
	
	i = HexValue & 0x0f;
	k = i > 9 ? i + 'A' - 10 : i + '0';

//	Printf("\r\n Value i = %2x,  k = %2x", (WORD)i, (WORD)k);

	OSDCmd2( 0xa3, (WORD)j );
	OSDCmd2( 0xa3, (WORD)k );

}
#elif defined TASKINGC	

void OSDPutHex(BYTE HexValue)
{


	BYTE *i, *j, *k;

	*i = HexValue>>4;
	*j = *i > 9 ? *i + 'A' - 10 : *i + '0';
	*k = *j;
	

	*i = HexValue & 0x0f;
	*(k+1) = *i > 9 ? *i + 'A' - 10: *i + '0';

	OSDCmd2( 0xa3, *k );
	OSDCmd2( 0xa3, *(k+1) );

}

#endif	// TASKINGC	

void OSDMemoryErase(void)
{
//	OSDCmd1(0x37);
	OSDCmd1( 0x33 );			//
	delay(10);
}

void OsdTextInit(void)
{

	WriteTW99( 0x02, ReadTW99(0x02)|0x01 );
	if(ChipID == TW9908CID){
		WriteTW99( 0x36, 0x01 );
		WriteTW99( 0x3c, 0xc0 );
		WriteTW99( 0x3d, 0x40 );
	}else{
	WriteTW99( 0x3c, 0x01 );
	WriteTW99( 0x42, 0xc0 );
	WriteTW99( 0x43, 0x40 );
	}
}


void OSDInitial(void)
{
	OsdTextInit();
	OSDCmd1( 0x33 );			//
	delay(10);
}

void MenuTableInitial(void)
{


//	MD0 = 1;
	MD1 = 1;
	MD2 = 1;
	MD3 = 1;
	MD4 = 1;
	MD5 = 1;
//	MD6 = 1;
	MD7 = 1;

}

void OSDColor(BYTE color)
{
	OSDCmd2( 0xa3, color );
}

void OSDFlip(void)
{
	OSDCmd1( 0x36 );
}


void OSDClear(void)
{
	OSDCmd1( 0x36 );
}


void OSDLogo(void)
{
	OSDInitial();

	HEIGHT = WIDTH = 1;
	OSDgotoxy(4, 4);

	OSDColor( RED );	OSDPuts(">>");
	OSDColor( GREEN );	OSDPuts("TW9908");
	OSDColor( BLUE );	OSDPuts("<<");

	
	HEIGHT = WIDTH = 0;
	OSDgotoxy(9, 11);

	OSDColor( RED | GREEN | BLUE );
	OSDPuts("Techwell,Inc.");

	OSDFlip();

}

void MenuTable(BYTE MI)
{
	BYTE	Color0,Color1,Color2,Color3,Color4,Color5,Color6;

//	OSDCmd1( 0x33 );			//
//	delay(10);
//	OSDInitial();

	HEIGHT = WIDTH = 0;
	Color0 = Color1 = Color2 = Color3 = Color4 = Color5 = Color6 = (GREEN | BLUE);

	switch(MI){
		case 0:	Color0 = 0x00;	break;
		case 1: Color1 = 0x00;	break;
		case 2:	Color2 = 0x00;	break;
		case 3: Color3 = 0x00;	break;
		case 4:	Color4 = 0x00;	break;
		case 5: Color5 = 0x00;	break;
		case 6: Color6 = 0x00;	break;
		default:	break;
	}

	OSDgotoxy(4, 3); OSDColor( GREEN ); OSDPuts("MENU");
	OSDgotoxy(4, 4); OSDColor( RED | Color0 ); OSDPuts(" Video In/Out...");



	OSDgotoxy(4, 5); OSDColor( RED | Color1 ); OSDPuts(" Register Set...");
	OSDgotoxy(4, 6); OSDColor( RED | Color2 ); OSDPuts(" Scaling...");
	OSDgotoxy(4, 7); OSDColor( RED | Color3 ); OSDPuts(" Caption...");
	OSDgotoxy(4, 8); OSDColor( RED | Color4 ); OSDPuts(" Reset...");
	OSDgotoxy(4, 9); OSDColor( RED | Color5 ); OSDPuts(" Help...");
	OSDgotoxy(4, 10); OSDColor( RED | Color6 ); OSDPuts(" Escape");


	OSDFlip();

}

void InputTable(BYTE ITMI)
{
	BYTE	Color0,Color1,Color2,Color3,Color4;
//	OSDInitial();

	HEIGHT = WIDTH = 0;
	Color0 = Color1 = Color2 = Color3 = Color4 = (GREEN | BLUE);

	switch(ITMI){
		case 0:	Color0 = 0x00;	break;
		case 1: Color1 = 0x00;	break;
		case 2:	Color2 = 0x00;	break;
		case 3: Color3 = 0x00;	break;
		case 4: Color4 = 0x00;	break;
		default:	break;
	}

	OSDgotoxy(4, 3); OSDColor( GREEN );			OSDPuts("Video I/O Type");
	OSDgotoxy(4, 4); OSDColor( RED | Color0 );	OSDPuts(" Composite In");
	OSDgotoxy(4, 5); OSDColor( RED | Color1 );	OSDPuts(" Super In");
	OSDgotoxy(4, 6); OSDColor( RED | Color2 );	OSDPuts(" Component In");
	OSDgotoxy(4, 7); OSDColor( RED | Color3 );	OSDPuts(" SCART In");
	OSDgotoxy(4, 8); OSDColor( RED | Color4 );	OSDPuts(" Super Out...");

	OSDFlip();

}

void RegSetTable(BYTE Value, BYTE DecData)
{

//	OSDInitial();
	HEIGHT = WIDTH = 0;
	OSDgotoxy(4, 3); OSDColor( GREEN );					OSDPuts("Register Status...");
	OSDgotoxy(4, 4); OSDColor( RED | GREEN | BLUE );	OSDPuts(" Index:0x");
														OSDPutHex(Value);
														OSDPuts("  Value:0x");
														OSDPutHex(DecData);
//	Printf("\r\nRegister Data:%02x", DecData);	// debug

	OSDFlip();

}

void ScaleTable(BYTE KindScale)
{
	BYTE	Color0,Color1,Color2;
//	OSDInitial();

	HEIGHT = WIDTH = 0;
	Color0 = Color1 = Color2 = (GREEN | BLUE);

	switch(KindScale){
		case 0:	Color0 = 0x00;	break;
		case 1: Color1 = 0x00;	break;
		case 2:	Color2 = 0x00;	break;
		default:	break;
	}

	OSDgotoxy(4, 3); OSDColor( GREEN );			OSDPuts("Scaling Demo");
	OSDgotoxy(4, 4); OSDColor( RED | Color0 );	OSDPuts(" Composite");
	OSDgotoxy(4, 5); OSDColor( RED | Color1 );	OSDPuts(" Horizental");
	OSDgotoxy(4, 6); OSDColor( RED | Color2 );	OSDPuts(" Vertical");

	OSDFlip();

}

void CaptionTable(BYTE CpONOFF)
{
	BYTE	Color0,Color1;
	OSDInitial();

	HEIGHT = WIDTH = 0;
	Color0 = Color1 = (GREEN | BLUE);

	switch(CpONOFF){
		case 0:	Color0 = 0x00;	break;
		case 1: Color1 = 0x00;	break;
		default:	break;
	}

	OSDgotoxy(4, 3); OSDColor( GREEN );			OSDPuts("Caption Mode");
	OSDgotoxy(4, 4); OSDColor( RED | Color0 );	OSDPuts(" OFF");
	OSDgotoxy(4, 5); OSDColor( RED | Color1 );	OSDPuts(" ON");

	OSDFlip();

}

void InitialTable(BYTE InitialOnOff)
{
	BYTE	Color0,Color1;
//	OSDInitial();

	HEIGHT = WIDTH = 0;
	Color0 = Color1 = (GREEN | BLUE);

	switch(InitialOnOff){
		case 0:	Color0 = 0x00;	break;
		case 1: Color1 = 0x00;	break;
		default:	break;
	}

	OSDgotoxy(4, 3); OSDColor( GREEN );			OSDPuts("Device Initializing");
	OSDgotoxy(4, 4); OSDColor( RED | Color0 );	OSDPuts(" OFF");
	OSDgotoxy(4, 5); OSDColor( RED | Color1 );	OSDPuts(" ON");

	OSDFlip();
//	InitRegisterSet(ChipID);
}

void DisInput(BYTE SelData)
{
//	OSDInitial();
	HEIGHT = WIDTH = 0;

//	WriteTW99( 0x43, 0x40 );
	delay(10);
	OSDInitial();

	OSDgotoxy(0, 1); OSDColor( RED | GREEN | BLUE);	
	switch(SelData){
	case 0: OSDPuts("Composite");	break;
	case 1: OSDPuts("Super");		break;
	case 2: OSDPuts("Component");	break;
	case 3: OSDPuts("SCART");		break;
	default: 	break;
	}	

	OSDFlip();
}

void ComositeInput(void)
{
//	OSDInitial();
	HEIGHT = WIDTH = 0;
	OSDgotoxy(5, 4); OSDColor( RED | GREEN | BLUE);	OSDPuts("Composite Input");
	OSDgotoxy(5, 5); OSDColor( RED | GREEN | BLUE);	OSDPuts(" 0x88(A) 0x02(I): ->0x41");
	OSDgotoxy(5, 6); OSDColor( RED | GREEN | BLUE);	OSDPuts(" 0x88(A) 0x14(I): ->0x5A");
	OSDgotoxy(5, 7); OSDColor( RED | GREEN | BLUE);	OSDPuts(" 0x88(A) 0x3c(I): ->0x01");

	OSDFlip();
}

void SuperInput(void)
{
//	OSDInitial();
	HEIGHT = WIDTH = 0;
	OSDgotoxy(5, 4); OSDColor( RED | GREEN | BLUE);	OSDPuts("Super Input");
	OSDgotoxy(5, 5); OSDColor( RED | GREEN | BLUE);	OSDPuts(" 0x88(A) 0x02(I): ->0x55");
	OSDgotoxy(5, 6); OSDColor( RED | GREEN | BLUE);	OSDPuts(" 0x88(A) 0x14(I): ->0x5A");
	
	OSDFlip();
}

void ComponentInput(void)
{
//	OSDInitial();
	HEIGHT = WIDTH = 0;
	OSDgotoxy(5, 4); OSDColor( RED | GREEN | BLUE);	OSDPuts("Component Input");
	OSDgotoxy(5, 5); OSDColor( RED | GREEN | BLUE);	OSDPuts(" 0x88(A) 0x02(I): ->0x6D");
	OSDgotoxy(5, 6); OSDColor( RED | GREEN | BLUE);	OSDPuts(" 0x88(A) 0x14(I): ->0x7A");
	OSDgotoxy(5, 7); OSDColor( RED | GREEN | BLUE);	OSDPuts(" 0x88(A) 0x3c(I): ->0x01");
	OSDgotoxy(5, 8); OSDColor( RED | GREEN | BLUE);	OSDPuts(" 0x88(A) 0x42(I): ->0xC0");
	OSDgotoxy(5, 9); OSDColor( RED | GREEN | BLUE);	OSDPuts(" 0x88(A) 0x43(I): ->0x40");

	OSDFlip();
}

void ScartInput(void)
{
//	OSDInitial();
	HEIGHT = WIDTH = 0;
	OSDgotoxy(5, 4); OSDColor( RED | GREEN | BLUE);	OSDPuts("SCART Input");

	OSDFlip();
}

void SubRegSet(BYTE RegIndex)
{



	HEIGHT = WIDTH = 0;

	OSDgotoxy(4, 3); OSDColor( GREEN );					OSDPuts("Register Setting");
	OSDgotoxy(4, 4); OSDColor( RED | GREEN | BLUE );	OSDPuts(" Index:0x");	
														OSDPutHex(TwoMenuIndex);
	OSDgotoxy(4, 5); OSDColor( RED | GREEN | BLUE );	OSDPuts(" Value:0x");		
														OSDPutHex(OldOSDData);
														OSDPuts("->0x");
														OSDPutHex(RegIndex);

//	Printf("\r\nOldOSDData:%02x RegIndex:%02x",OldOSDData,RegIndex);	// debug

	OSDFlip();
}

BYTE OSDWakeup(BYTE menulayer)
{
	#ifdef OLDKEY
	if((P0 & KeyValue) != KeyValue){
	#elif defined NEWKEY
	if((P2 & KeyValue) != KeyValue){
	#endif

			if(menulayer == 0){
//				WriteTW99( 0x43, 0x40 );
				delay(10);
				OSDLogo();
			}
		return 1;
	}
}

void DisScale(BYTE DisMenuIndex)
{

	HEIGHT = WIDTH = 0;

//	OSDgotoxy(4, 3); OSDColor( GREEN );					OSDPuts("C.Scale Setting");
	OSDgotoxy(4, 4); OSDColor( RED | GREEN | BLUE );	OSDPuts(" Index:0x");	
														OSDPutHex(TwoMenuIndex);
	OSDgotoxy(4, 5); OSDColor( RED | GREEN | BLUE );	OSDPuts(" Value:0x");		
														OSDPutHex(OldOSDData);
														OSDPuts("->0x");
														OSDPutHex(DisMenuIndex);

//	Printf("\r\nOldOSDData:%02x DisMenuIndex:%02x",OldOSDData,DisMenuIndex);	// debug

	OSDFlip();
}

void OSDHelp(void)
{

	BYTE	Color0;

	HEIGHT = WIDTH = 0;
	Color0 = (GREEN | BLUE);

	OSDgotoxy(4, 3); OSDColor( GREEN );			OSDPuts("Firmware");
	OSDgotoxy(4, 4); OSDColor( RED | Color0 );	OSDPuts("   Rev: ");
												OSDPutHex(FWVER/0x100);
												OSDPuts(".");
												OSDPutHex(FWVER%0x100);

	OSDFlip();
}

void KindDevice(BYTE DeviceType)		//$11
{
	BYTE	Color0,Color1,Color2;

	HEIGHT = WIDTH = 0;
	Color0 = Color1 = Color2 = (GREEN | BLUE);

	switch(DeviceType){
		case 0:	Color0 = 0x00;	break;
		case 1: Color1 = 0x00;	break;
		case 2:	Color2 = 0x00;	break;
		default:	break;
	}

	OSDgotoxy(4, 3); OSDColor( GREEN );			OSDPuts("Device Type");
	OSDgotoxy(4, 4); OSDColor( RED | Color0 );	OSDPuts(" Decoder");
	OSDgotoxy(4, 5); OSDColor( RED | Color1 );	OSDPuts(" Encoder");
	OSDgotoxy(4, 6); OSDColor( RED | Color2 );	OSDPuts(" FPGA");

	OSDFlip();
}

void SuperOut(BYTE SuperOnOff)
{
	BYTE	Color0,Color1;
//	OSDInitial();

	HEIGHT = WIDTH = 0;
	Color0 = Color1 = (GREEN | BLUE);

	switch(SuperOnOff){
		case 0:	Color0 = 0x00;	break;
		case 1: Color1 = 0x00;	break;
		default:	break;
	}

	OSDgotoxy(4, 3); OSDColor( GREEN );			OSDPuts("Super Control");
	OSDgotoxy(4, 4); OSDColor( RED | Color0 );	OSDPuts(" Component Out");
	OSDgotoxy(4, 5); OSDColor( RED | Color1 );	OSDPuts(" Super Out");

	OSDFlip();

}


void OSDDisplay(BYTE menulayer, BYTE menuindex, BYTE osddata)	
{
//	Printf("\r\nLayer:%02x, Index:%02x, OldIndex:%2x",menulayer,menuindex,oldmenuindex); // debug
//	Printf("\r\nOneMenuIndex:%02x TwoMenuIndex:%02x",OneMenuIndex,TwoMenuIndex);


	switch(menulayer){
		case 0:	OSDLogo();									break;
		case 1: MenuTable(menuindex);						break;
		case 2: 
			switch(OneMenuIndex){
				case 0: InputTable(menuindex);				break;
//				case 1: RegSetTable(menuindex, osddata);	break;
				case 1: KindDevice(menuindex);				break;	//$11
				case 2: ScaleTable(menuindex);				break;
				case 3: CaptionTable(menuindex);			break;
				case 4: InitialTable(menuindex);			break;
				case 5:	OSDHelp();							break;
				case 6:										break;
				default:									break;
			}
			break;
		case 3: 
			switch(OneMenuIndex){
				case 0:	
					switch(TwoMenuIndex){//oldmenuindex){
						case 0:	ComositeInput();		break;
						case 1: SuperInput();			break;
						case 2: ComponentInput();		break;
						case 3: ScartInput();			break;
						case 4: SuperOut(menuindex);	break;
						default:						break;
					}
					break;
//				case 1:	SubRegSet(menuindex);	break;
				case 1:	RegSetTable(menuindex, osddata);	break;		//$11
				case 2: 
					switch(TwoMenuIndex){
						case 0x0e:	OSDgotoxy(4, 3); OSDColor( GREEN );	OSDPuts("C.Scale Setting");
									DisScale(menuindex);	break;
						case 0x0f:	OSDgotoxy(4, 3); OSDColor( GREEN );	OSDPuts("H.Scale Setting");
									DisScale(menuindex);	break;
						case 0x0d:	OSDgotoxy(4, 3); OSDColor( GREEN );	OSDPuts("V.Scale Setting");
									DisScale(menuindex);	break;
						default:	break;
					}
					break;
				default:		break;
			}
			break;
		case 4:
			switch(OneMenuIndex){
				case 1:	SubRegSet(menuindex);	break;
				default:		break;
			}
			break;

		default:	break;
	}
}






⌨️ 快捷键说明

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