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

📄 tw99.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 "lcd.h"
//#include "keypad.h"

extern DATA BYTE InSel;
extern DATA BYTE VcrFFNo;
extern bit CCFlag;
extern bit Flashing;
extern bit ReturnValue;

extern CODE BYTE InputComposite[];
extern CODE BYTE InputSVideo[];
extern CODE BYTE InputYPbPr[];
extern CODE BYTE InputSCART[];
extern CODE BYTE InputCompositeC[];
extern CODE BYTE InputYPbPrC[];
extern CODE BYTE InputSCARTC[];
extern DATA BYTE ChipID;

void CaptionOn(BYTE flag)
{
	BYTE buf;

	if( !flag ) {
		Puts("\r\nOSD/CC1/TEXT -- OFF \r\n");
		buf = 0x33;	WriteI2Cn_(0x28, &buf, 1);//MonWriteI2Cn_(0x28, &buf, 1);
//		delay(10);
					
//		buf = ReadTW99(0x02);
//		buf &= 0xfe;
//		WriteTW99(0x02, buf);	
		if(ChipID == TW9908CID)
			WriteTW99(0x3c, 0x40);	//0xc0	
		else
			WriteTW99(0x42, 0x40);	//0xc0	


	}
	else {
		Puts("\r\nOSD/CC1/TEXT -- ON \r\n");
		buf = 0x17;	WriteI2Cn_(0x28, &buf, 1);//MonWriteI2Cn_(0x28, &buf, 1);
//		delay(10);
				
		buf = ReadTW99(0x02);
		buf |= 0x01;
		WriteTW99(0x02, buf);	
		if(ChipID == TW9908CID){
			WriteTW99(0x36, 0x01);	
			WriteTW99(0x3c, 0xc0);	//0xc0	
			WriteTW99(0x3d, 0x40);	
		}else{
			WriteTW99(0x3c, 0x01);	
			WriteTW99(0x42, 0xc0);	//0xc0	
			WriteTW99(0x43, 0x40);
		}	
	}
}

void ChangeInputSW(BYTE InSel)
{
	if(ChipID == TW9908CID){
		switch(InSel) {
		case 0: I2CDeviceSet( InputCompositeC );	break;
		case 1: I2CDeviceSet( InputSVideo );		break;
		case 2: I2CDeviceSet( InputYPbPrC );		break;
		case 3: I2CDeviceSet( InputSCARTC );		break;
		}
	}else{
		switch(InSel) {
		case 0: I2CDeviceSet( InputComposite );	break;
		case 1: I2CDeviceSet( InputSVideo );	break;
		case 2: I2CDeviceSet( InputYPbPr );		break;
		case 3: I2CDeviceSet( InputSCART );		break;
		}
	}
//	if( CCFlag ) CaptionOn(CCFlag);

}



BYTE GetColorSystem(BYTE DecRegister1)
{
//	if( (ReadTW99(0x01) & 0x01) == 0x01 )
	if( (DecRegister1 & 0x01) == 0x01 )
		return 0;	// PAL
	else
		return 1;	// NTSC
}

BYTE IsInteraced(void)
{
	if( (ReadTW99(0x39) & 0x08)==0x08 )	
		return 1;
	else
		return 0;
}

BYTE IsVideoIn(BYTE DReg1)
{
//	if( (ReadTW99(0x01) & 0x80)==0x80 )
	if( (DReg1 & 0xc8)==0x80 )
		return 0;
	else	
		return 1;
}

BYTE GetVDelay(void)
{
	return ReadTW99(0x08);
}

void SetVDelay(BYTE dat)
{
	WriteTW99( 0x08, dat );
}


BYTE IsStandard(void)
{
	BYTE dat;

	dat = ReadTW99(0x39);

	if( dat & 0x10 ) return 1;
	else             return 0;
}

/*
BYTE GetFFStatus(void)
{

	if( IsStandard() && !FFbyFPGA ) 
		return 0;
	else
		return 1;

}
*/

BYTE GetFFS(void)
{

	if(IsInteraced() == 0){
		if(IsStandard()){				// standard
			if(VcrFFNo > 0){
				VcrFFNo--;
//				Printf("\r\nVcrFFNo : %02x  VDelay : %02x", VcrFFNo, ReadTW99(0x08));
			}
			else
				ReturnValue = 0;
		}
		else{							// nonstandard
			if(VcrFFNo < 32){
				VcrFFNo++;
//				Printf("\r\nVcrFFNo : %02x  VDelay : %02x", VcrFFNo, ReadTW99(0x08));
			}
			else
				ReturnValue = 1;
		}
	}
	return  ReturnValue;
}

#ifdef NEW_BOARD
void BypassMode(void)
{
	BYTE buf;
	Puts("\r\nBypass Mode");
	buf = ReadI2C(SAA71XX, 0x3a) | 0x10;
	MonWriteI2C(SAA71XX, 0x3a, buf);
	MonWriteI2C(SAA71XX, 0x6c, 0xe0);
	NewLine();
}

void NonBypassMode(void)
{
	BYTE buf;
	Puts("\r\nNon-Bypass Mode");
	buf = ReadI2C(SAA71XX, 0x3a) & 0xef;
	MonWriteI2C(SAA71XX, 0x3a, buf);
	MonWriteI2C(SAA71XX, 0x6c, 0x03);
	NewLine();
}
#endif //NEW_BOARD

void ClosedCaptionToSerial(BYTE eds, BYTE hex)
{
	BYTE  rd[2], control_code=0, control_code_count=0,  i , ReturnKey = 0;
	bit	IndEnd = 0;

	rd[1]='\0'; i =0;
	NewLine();

	MonWriteI2C(TW99I2CAddress,0x1a, eds ? 0xc0 : 0xa0); // enable CC_DATA

	Puts("\r\nPress anykey to exit CC | EDS...\r\n");

	while( !RS_ready() ) {
		rd[0] = ReadTW99(0x1a);
		if( eds && ((rd[0] & 0x06) == 0x06) || !eds && (rd[0] & 0x04)) {
				rd[0] = ReadTW99(0x1b) & 0x7f;
			if( hex ) {
				Printf("%02x", rd[0]); 
				i += 1;
				if(i==16) {
					Puts("\r\n");
					i = 0;
				}
				else Puts(" ");
			}
			else  if(DetAuto){ 
				if( rd[0] < 0x20 ) {	
					// Nondisplay control chars
					control_code = rd[0];
/*					control_code_count++;				// 
				}
				else if( control_code_count>=2 ) {
					// Second control code for ensuring. Don't need to do anything
					control_code_count=0;*/
				}
				else { 
					switch( control_code ) {
					case 0:
						PutsP(rd);
						ReturnKey = 0;
						break;
					default:
						if( rd[0] >= 0x20 && rd[0] <= 0x2f ) {
							if( control_code==0x11 || control_code==0x19 ) {
							}
							else {
								switch( rd[0] ) {
								case 0x20:
								case 0x2C:
								case 0x2F:
									break;
								default:
									break;
								}
							}
						}
						else if( rd[0] >= 0x30 && rd[0] <= 0x3f ) {
							// Special chars.
							// debug	--	Puts("_");
							// debug	--	Printf("%02x", rd[0]);
						}
						else if( rd[0] >= 0x40 && rd[0] <= 0x7f ) {
							if(ReturnKey == 0){
								NewLine();
								ReturnKey++;
							}
		
							if( rd[0] & 0x10 ) {
								// Indent
								rd[0] &= 0x0e;
								rd[0] <<= 1;
								for(i=0; i<rd[0]; i++)
									Puts(" ");
							}
							else {
								// Color
								// debug -- Puts("=");
								// debug -- Printf("%02x", rd[0]);
							}
						}
						else 
							// Bad
							;	
						control_code = 0;
						break;
					}
				}
			}
			else if(!DetAuto){					// small caption  
				if( rd[0] < 0x20 ) {	
					control_code = rd[0];
/*					control_code_count++;
				}
				else if( control_code_count>=2 ) {
					control_code_count=0;*/
				}
				else { 
					switch( control_code ) {
					case 0:
						if(rd[0] == 0x2e || rd[0] == 0x3f || rd[0] == 0x3a || 
						   rd[0] == 0x21 || rd[0] == 0x7d ){
							IndEnd = 1;
						}
						if(!IndEnd){
							if(rd[0] >= 0x41 && rd[0] <= 0x60){
								rd[0] = rd[0] + 0x20;
							}
						}
						else if(IndEnd){
							if(rd[0] >= 0x41 && rd[0] <= 0x60)
								IndEnd = 0;
						}
						
						PutsP(rd);
/*						SerialOutputHex(rd[0]);*/
						ReturnKey = 0;
						break;
					default:
						if( rd[0] >= 0x40 && rd[0] <= 0x7f ) {
							if(ReturnKey == 0){
								NewLine();
								ReturnKey++;
							}
						}
						else 
							/*Bad*/
							;	
						control_code = 0;
						break;
					}
				}	
			}

		}
	}
	RS_rx();
	NewLine();
	MonWriteI2C(TW99I2CAddress,0x1a, 0x00); NewLine(); // disable CC_DATA
}

⌨️ 快捷键说明

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