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

📄 osdbasic.c

📁 此程序为twell8806驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//osd_basic.c
// ver0.11 2/1x/2001 Change display format from hex to decimal
//	1.32	LJY11262001	.Add border features to OSD window
//	1.70	LJY05302003 .Support a menu with external OSD.

#include "Config.h"

#include "typedefs.h"
#include "i2c.h"
#include "main.h"
#include "tw88.h"

#include "osdbasic.h"
#include "dispinfo.h"
#include "measure.h"
#include "debug.h"
#include "printf.h"
#include "udfont.h"
#include "regmap.h"

extern CODE struct RegisterInfo UserRange;

///#ifdef TW8803
CODE BYTE ZoomAttr[]={	0,	0,	0x40,	0x80,	0xc0	};
///#else
///CODE BYTE ZoomAttr[]={	0,	0,	0x04,	0x08,	0x0c	};
///#endif

//IDATA struct BarInfo BarInfo;
IDATA struct OSDStrInfo OSDStrInfo;
extern	bit   I2CAutoIncFlagOn ;

//extern IDATA BYTE I2CAddr, I2CIdx, I2CData;




//********************************************************************
//
//	Font
//
//********************************************************************
//----------------------------------------------------------------
//	Data2FontRAM
//----------------------------------------------------------------
//
//  The followings are structure of FONT RAM
//   ...........    1 byte .....................................
//	 --------------------------------------------------------	 .	
//  |  First 32 byte data for every characters in FONT RAM   |	 .	
//	|  That is, first 1 byte data for first font char,		 |	 .
//  |			first 1 byte data for second font char,		 |	32 bytes 
//	|			first 1 byte data for third font char.		 |	 .
//	|			..											 |   .
//	|			..											 |   .
//	 --------------------------------------------------------    .
//  |  Second 32 byte data for every characters in FONT RAM  |   .
//	|  That is, second 1 byte data for first font char,		 |   .
//  |			second 1 byte data for second font char,	 |  32 bytes
//	|			second 1 byte data for third font char.		 |   .
//	|			..											 |   .
//	|			..											 |   .
//	 --------------------------------------------------------    .
//	|														 |   .
//	|														 |   .
//	|														 |   .
//	|														 |   .
//	|														 |   .
//	|														 |   .
//	|														 |   .
//	|														 |   .
//	|														 |   .
//	|														 |   .
//	|														 |   .
//	|														 |   .
//	|														 |   .
//	|														 |   .
//	|														 |   .
//	 --------------------------------------------------------	1024 bytes
//	



/*
void ClearOSDRAM(BYTE attr)
{
	WriteTW88(TW88_OSDRAMDATALO, attr);
	WriteTW88(TW88_ENABLERAM, 0x02);	// OSD RAM Auto Clear with attr.

	while( ReadTW88(TW88_ENABLERAM) & 0x02 );
}
*/
void WaitEndofDisplayArea(void)
{
	#ifdef TW8804D
	BYTE ret,i;

	ret =  ReadTW88(OSDWINSTATUS) & 0x40;

	for(i=0;i<10;i++){
		if( ret^ (ReadTW88(OSDWINSTATUS)&0x40)) break; 
	}
	#endif

}

//=============================================================================
//			Download OSD Color Look up 
//=============================================================================
void Change_OSDColorLookup(void)
{
	BYTE i,j,dt;
	#ifdef DEBUG_CCEDS
	Printf("\r\n --- Change_OSDColorLookup to Table ");
	#endif
	for(j=0; j<2; j++) 
	{   
		for(i=0; i<8; i++) 
		{
			dt = ReadTW88(0x9c);
			dt &= 0xf0;
			WriteTW88(0x9c, i+j*8);
			WriteTW88(0x9d, OSD_Color_LookUp_Data_Table[j][i]);
		}
	}
}

#ifdef SUPPORT_TW88_CC_DECODER
void Reset_OSDColorLookup(void)
{
	BYTE i,dt;
	CODE BYTE tt[] = {0x00,0x03,0x1C,0x1F,0xE0,0xE3,0xFC,0xFF};
	#ifdef DEBUG_CCEDS
	Printf("\r\n --- Reset_OSDColorLookup");
	#endif
	
	for(i=0; i<8; i++) {
		dt = ReadTW88(0x9c);
		dt &= 0xf0;
		WriteTW88(0x9c, i);
		WriteTW88(0x9d, tt[i]);
	}
}
#endif
//=============================================================================
//			Download RAM Font Data
//=============================================================================
void DownloadFont(BYTE cod, CODE_P BYTE *fontdata)
{
	WriteTW88(TW88_ENABLERAM, ReadTW88(TW88_ENABLERAM) | 0x01);		// Font RAM access mode
	WriteTW88(TW88_FONTRAMADDR, cod);

	WriteTW88(0xff, ReadTW88(0xff) | 0x10);	// Disable I2C index auto increment during multi-write
	WriteI2Cn( TW88I2CAddress, TW88_FONTRAMDATA, fontdata, 27 );

	WriteTW88(TW88_ENABLERAM, ReadTW88(TW88_ENABLERAM) & 0xfe);		// OSD RAM access mode
}

void DownloadUDFont(void)
{
	BYTE i;

	WriteTW88(TW88_MULTISTART, COLORFONT_START); // Set Color Font Start Address. 

	for(i=0; i< NO_UDFONT && i<= MAX_FONT_RAM_CHARS ; i++) {
		DownloadFont(i, RAMFONTDATA[i]);
	}
}

//*****************************************************************************
//	OSD Window internal subfunction for TW88xx
//*****************************************************************************
#ifdef SUPPORT_TW88_CC_DECODER
void EnableOSDRAMAndChangeFont(BYTE type)
{
	BYTE dt;

	dt = ReadTW88(TW88_ENABLERAM);
	if( type==FONT_ROM )	dt &= 0x7f;
	else					dt |= 0x80;
	WriteTW88(TW88_ENABLERAM, dt);

}
#endif
//*****************************************************************************
//	Functions for TW88xx internal OSD
//*****************************************************************************
#ifdef SUPPORT_CCD_VCHIP
void ClearOSD_TW88()
{
	BYTE i;

	for(i=1; i<=MAX_OSDWINDOW_TW88; i++) {
		ShowOSDWindow_TW88(i,FALSE);
	}
}
#endif
//-----------------------------------------------------------------------------
//	CreateOSDWindow_TW88
//	winno:	1,2,3,4
//	x:		based on pixel not char.(8 pixels per 1 step).
//	y:		based on lines not char.(4 lines per 1 step).
//	w:		based on char.(1 character width per 1 step)
//	h:
//  sa:		start address
//	attr:	BG_COLOR | ZOOM | SHOW
//-----------------------------------------------------------------------------
/*#ifdef SUPPORT_CCD_VCHIP
void CreateOSDWindow_TW88(BYTE winno, BYTE x, BYTE y, BYTE w, BYTE h, WORD sa, BYTE attr)
{
	BYTE zoom_attr, new_attr;

	if( winno<1 || winno>8 ) return;
	SetOSDWindowNum(winno);				// * set winno

	SetOSDWindowX_TW88(winno, x);		// * set x
	SetOSDWindowY_TW88(winno, y);		// * set y

	WriteTW88(TW88_WINWIDTH,  w);		// * set w width(1 character width per 1 step)
	WriteTW88(TW88_WINHEIGHT, h);		// * set h height(1 character height per 1 step)
	
	zoom_attr = (attr & 0x07)-1;
	zoom_attr = zoom_attr*0x40 + zoom_attr*0x10 + (sa>>8);
	WriteTW88(TW88_WINZOOM, zoom_attr);

	WriteTW88(TW88_WINSADDRLO,  sa);		// * set sa start address of OSD RAM

	new_attr = attr & 0xf0;				//for color
	if( attr & SHOW ) new_attr |= 0x01;
	WriteTW88(TW88_WINATTR, new_attr);	// attribute

	// Disable all other functions
	WriteTW88( TW88_WINBRDATTR,   0x00 );
	WriteTW88( TW88_WINBRDWIDTH,  0x00 );
	WriteTW88( TW88_WINBRDHEIGHT, 0x00 );
	WriteTW88( TW88_WINSPACE,     0x00 );
	WriteTW88( TW88_WINSHADOW,    0x00 );
	WriteTW88( TW88_WINBLENDING,  0x00 );
	WriteTW88( TW88_WINCHEFFECT,  0x00 );

	#ifdef DEBUG_OSD
	dPrintf("\r\n++(CreateOSDWindow_TW88) wino:%bd,", winno-1 );
	dPrintf("attr:0x%bx, new_attr:0x%bx __", attr, new_attr);
	#endif

}
#endif // SUPPORT_CCD_VCHIP

//#endif // SUPPORT_TW88_CC_DECODER
*/
#ifdef SUPPORT_OSDPOSITIONMOVE

void SetOSDWindowX_TW88(BYTE winno, BYTE x)
{
	WORD tmp;
	BYTE dat;

	if( winno<1 || winno>8 ) return;
	SetOSDWindowNum(winno);

	tmp = x << 3;

	dat = ReadTW88(TW88_WINSTART_HI) & 0xf0;
	dat = dat | (tmp>>8);

	WriteTW88(TW88_WINSTART_HI, dat);
	WriteTW88(TW88_WINXSTART, tmp);
}
#endif
void SetOSDWindowY_TW88(BYTE winno, BYTE y)
{
	WORD tmp;
	BYTE dat;

	if( winno<1 || winno>8 ) return;
	SetOSDWindowNum(winno);

	tmp = y << 2;

	dat = ReadTW88(TW88_WINSTART_HI) & 0x0f;
	dat = dat | ((tmp>>8)<<4);

	WriteTW88(TW88_WINSTART_HI, dat);
	WriteTW88(TW88_WINYSTART, tmp);
}

//#if (defined SUPPORT_TW88_CC_DECODER)

//ljy052903: CC + Info
//=============================================================================
//			ShowOSDWindow_TW88
//=============================================================================
void ShowOSDWindowAll(BYTE on)
{
	BYTE rd;

	WaitEndofDisplayArea();	
	rd = ReadTW88(TW88_OSDLOCKUPSEL);

	if( on )
		WriteTW88(TW88_OSDLOCKUPSEL, rd&0xef);	// 
	else
		WriteTW88(TW88_OSDLOCKUPSEL, rd|0x10);	// OSD All Off (TW8806B)

}
void ShowOSDWindow_TW88(BYTE winno, BYTE onoff)
{
	BYTE rd;

	if( winno<1 || winno>8 ) return;
	SetOSDWindowNum(winno);

	rd = ReadTW88(TW88_WINATTR);
	if( onoff ) rd |= 0x01;
	else 		rd &= 0xfe;

	WaitEndofDisplayArea();	
	WriteTW88(TW88_WINATTR, rd);
}

#ifdef SUPPORT_OSDPOSITIONMOVE
WORD GetOSDWindowX(BYTE winno)
{
	WORD x;

	if( winno<1 || winno>8 ) return 0;
	SetOSDWindowNum(winno);

	x = (ReadTW88(TW88_WINSTART_HI) & 0x0f) << 8;
	x = x  | ReadTW88(TW88_WINXSTART);

	return (BYTE)(x >> 3);
}
#endif

WORD GetOSDWindowY(BYTE winno)
{
	WORD y;

	if( winno<1 || winno>8 ) return 0;
	SetOSDWindowNum(winno);

	y = (ReadTW88(TW88_WINSTART_HI) & 0xf0) << 4;

⌨️ 快捷键说明

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