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

📄 main.c

📁 tw9910的驱动源码,来自techwell的FAE
💻 C
📖 第 1 页 / 共 5 页
字号:
			if(SelectedSW == 2 || SelectedSW == 3)
				ChangeInputSW(SelectedSW);

			if(SelectedSW == 0)
				Printf("\r\nComposite Input");
			else if(SelectedSW == 1)
				Printf("\r\nS-Video Input");

		}
		// Long Key
/*		else {
			Printf("\r\n---------> Long  Key");
			CCFlag = !CCFlag;
			CaptionOn(CCFlag);
		}
*/		
		while( !(P4 & 0x04) );

	}
}


/*=========================================================================*/
/*        Initialize Register Set                                          */
/*=========================================================================*/
void InitRegisterSet(BYTE id)
{
	BYTE	buf;

	if( SQ ) {


		#ifdef	ADV717X

		switch(EncoderID){
		case 0x54:	ptr_ENC_NTSC = ADV7176_NTSC_DataSet; ptr_ENC_PAL = ADV7176_PAL_DataSet;	break;
		case 0xd4:	ptr_ENC_NTSC = ADV7175_NTSC_DataSet; ptr_ENC_PAL = ADV7175_PAL_DataSet; break;
		default: Printf("\r\n=====> This chip is not defined ! (%02x)\r\n", EncoderID );
		}		

		#endif	//ADV717X


		#ifdef	SAA71XX

		ptr_ENC_NTSC = SAA7129_NTSC_DataSet;
		ptr_ENC_PAL  = SAA7129_PAL_DataSet;

		#endif	//SAA71XX
		
		

		switch( id ) {
		case TW9908AID: ptr_NTSC = TW9908A_CCIR_NTSC_DataSet;	ptr_PAL = TW9908A_CCIR_PAL_DataSet;	break;
		case TW9908CID: ptr_NTSC = TW9908C_CCIR_NTSC_DataSet;	ptr_PAL = TW9908C_CCIR_PAL_DataSet;	break;
		case TW9910AID: Puts("\r\nTW9910A detected!!!\r\n");
						ptr_NTSC = TW9910A_CCIR_NTSC_DataSet;	ptr_PAL = TW9910A_CCIR_PAL_DataSet;	break;
		case TW9910BID: Puts("\r\nTW9910A detected!!!\r\n");
						ptr_NTSC = TW9910B_CCIR_NTSC_DataSet;	ptr_PAL = TW9910B_CCIR_PAL_DataSet;	break;


		default:
			Printf("\r\n=====> This chip is not defined ! (%02x)\r\n", id );
			NotDefineID = 1;
			break;
		}
	}

	else {

		#ifdef	ADV717X

		switch(EncoderID){
		case 0x54:	ptr_ENC_NTSC = ADV7176_SQ_NTSC_DataSet; ptr_ENC_PAL = ADV7176_SQ_PAL_DataSet;	break;
		case 0xd4:	ptr_ENC_NTSC = ADV7175_SQ_NTSC_DataSet; ptr_ENC_PAL = ADV7175_SQ_PAL_DataSet; 	break;
		default: Printf("\r\n=====> This chip is not defined ! (%02x)\r\n", EncoderID );
		}

		#endif	//ADV717X


		#ifdef	SAA71XX

		ptr_ENC_NTSC = SAA7129_NTSC_DataSet;
		ptr_ENC_PAL  = SAA7129_PAL_DataSet;

		#endif	//SAA71XX


		switch( id ) {	
		case TW9908AID: ptr_NTSC = TW9908A_SQ_NTSC_DataSet;		ptr_PAL = TW9908A_SQ_PAL_DataSet;	break;
		case TW9908CID: ptr_NTSC = TW9908C_SQ_NTSC_DataSet;		ptr_PAL = TW9908C_SQ_PAL_DataSet;	break;
		default:
			Printf("\r\n=====> This chip is not defined ! (ID:%02x)\r\n", id );
			NotDefineID = 1;
			break;
		}
	}
	
//	Last_PAL_NTSC = PAL_NTSC;
	if(!NotDefineID){
		if( Last_PAL_NTSC ){ 
			I2CDeviceSet( ptr_NTSC );

			buf = ReadI2C(FPGA, 0x02);
			buf = buf | 0x01;
			
			MonWriteI2C(FPGA, 0x02, buf);

			I2CDeviceSet( ptr_ENC_NTSC );
		}

		else {
			I2CDeviceSet( ptr_PAL  );

			buf = ReadI2C(FPGA, 0x02);
			buf = buf & 0xfe;
			MonWriteI2C(FPGA, 0x02, buf);

			I2CDeviceSet( ptr_ENC_PAL );
		}

	}
}

void DacPassFrame(BYTE PassFrame)
{
	BYTE buf;

	if(PassFrame == 1){
		Puts("\r\nDAC Direct Pass Mode\r\n");
		buf = ReadI2C(FPGA, 0x04);
		WriteI2C(FPGA, 0x04, buf & 0x7f);
	
		if(MaskScaleMode)
		{
			WriteI2C(TW99I2CAddress, 0x0d, 0x00);
			WriteI2C(TW99I2CAddress, 0x0e, 0x11);
			WriteI2C(TW99I2CAddress, 0x0f, 0x00);
			MaskScaleMode = 0;
	   	}

  	}else if(PassFrame == 2){
		Puts("\r\nDAC Frame Buffering Mode\r\n");  
		buf = ReadI2C(FPGA, 0x04);
		WriteI2C(FPGA, 0x04, buf | 0x80);
	}
}

void ScalingMode()
{
	if(MaskScaleMode != OldMaskScaleMode)
	{
		if(ReadTW99(0x0d) != 0x00 || ReadTW99(0x0e) != 0x11	|| ReadTW99(0x0f) != 0x00)
		{
			WriteTW99( 0x19, ReadTW99(0x19) | 0x08 );
			DacPassFrame(2);
	   	}
		else
		{		
			WriteTW99( 0x19, ReadTW99(0x19) & 0xf7 );
			DacPassFrame(1);
	  	}
	}
	OldMaskScaleMode = MaskScaleMode;
}



void AutoDetectRegSet(){

	#ifdef ADV717X
	BYTE buf;
	#endif //ADV717X

//	StatusReg1 = ReadTW99(0x01);				// read status register1 of decoder

	if( OldDetAuto != DetAuto ) {
			if( DetAuto ) Puts("\r\n===== Auto Detect Mode ======\r\n");
			else          Puts("\r\n===== Manual Register Set Mode ======\r\n");
			OldDetAuto = DetAuto;
		}

		if( DetAuto ) {

			StatusReg1 = ReadTW99(0x01);				// read status register1 of decoder


			//----- Check if video in or not
			
			if( DetVideo != IsVideoIn(StatusReg1) ) {
				DetVideo = IsVideoIn(StatusReg1);
				OSDLockMode();
//				Printf("\r\nDetVideo0:%02x PAL_NTSC0:%02x",DetVideo,PAL_NTSC);
			}
			
			//----- Check if Color system is changed or not

			if( DetVideo ) {

				if( (PAL_NTSC=GetColorSystem(StatusReg1)) != Last_PAL_NTSC ) {
					Last_PAL_NTSC = PAL_NTSC;
					BUSY = Last_PAL_NTSC;
					if( Last_PAL_NTSC ){

						delay(20);
						buf = ReadI2C(FPGA, 0x02);
						buf = buf | 0x01;
//						MonWriteI2C(TW99I2CAddress, 0x70, 0x40);
						WriteI2C(FPGA, 0x02, buf);

						Printf("\r\n\r\n ===== NTSC ====== \r\n");

						switch(ChipID){
						case TW9910AID : I2CDeviceSet( TW9910A_NTSC );	break;
						}

						#ifdef	ADV717X
						if(EncoderID == 0x54)
							I2CDeviceSet( ADV7176_NTSC_DataSet );		// P->N
						else if(EncoderID == 0xd4)
							I2CDeviceSet( ADV7175_NTSC_DataSet );
						#elif defined	SAA71XX	//ADV717X
						I2CDeviceSet( SAA7129_NTSC_DataSet );
						#endif	//SAA71XX
 

					}
					else{

						delay(20);
						buf = ReadI2C(FPGA, 0x02);	// to PAL
						buf = buf & 0xfe;
//						MonWriteI2C(TW99I2CAddress, 0x70, 0xd4);
						WriteI2C(FPGA, 0x02, buf);

						Printf("\r\n\r\n ===== PAL ====== \r\n");

						switch(ChipID){
						case TW9910AID : I2CDeviceSet( TW9910A_PAL );	break;
						}


						#ifdef	ADV717X
						if(EncoderID == 0x54)
							I2CDeviceSet( ADV7176_PAL_DataSet );		// N->P
						else if(EncoderID == 0xd4)
							I2CDeviceSet( ADV7175_PAL_DataSet );
						#elif defined	SAA71XX	//ADV717X
						I2CDeviceSet( SAA7129_PAL_DataSet );
						#endif	//SAA71XX
					}
				}
			
			}

			//----- Check if Interaced or not

			if( DetVideo ) {

				if( DetInterace != IsInteraced() ) {
					DetInterace = IsInteraced();

					#ifdef	ADV717X
					if( DetInterace ){						//I2CDeviceSet(NonInteraceMode);
						WriteTW99(0x28, 0x02);
						buf = ReadI2C(EncoderID, 0x01);
						buf = (buf & 0xfe) + 0x01;
						WriteI2C(EncoderID, 0x01, buf);
						MD0 = 0;
					}
					else{									//I2CDeviceSet(InteraceMode);
						WriteTW99(0x28, 0x00);
						buf = ReadI2C(EncoderID, 0x01);
						buf = buf & 0xfe;
						WriteI2C(EncoderID, 0x01, buf);
						MD0 = 1;
					}
					#elif defined	SAA71XX	//AVD717X		// need to work program for noninterace of SAA...
					#endif	//SAA71XX

				}
			}

			//----- Check FastForward

			if( DetVideo ) {

				if(ChipID == TW9908AID){
					if( DetFF != GetFFS() ) {

						static DATA	BYTE VDelayReg;

						DetFF = GetFFS();

						if( DetFF ) {
							VDelayReg = GetVDelay();
							SetVDelay(0x0d);
						}
						else {
							SetVDelay( VDelayReg );
						}
					}
				}
			}

			//----- Path Through Function
			#ifdef NEW_BOARD
			if(OldBypassKey != BypassKey){
				if(BypassKey)
					NonBypassMode();	
				else 
					BypassMode();
				OldBypassKey = BypassKey;
			}
			#endif //NEW_BOARD

			ScalingMode();
					
	}
}


void ReturnInitialOFF(void)
{
	if(MenuIndex == 0x01){

		reset = 0;	delay(1);		// reset
		reset = 1;	delay(1);
		delay(10);
		InitRegisterSet(ChipID);
		delay(10);

		WriteTW99( 0x43, 0x40 );
		delay(10);
		OSDInitial();
		MenuIndex = 0x00;
//		Printf("\r\nILayer:%02x IIndex:%02x IOldKeyState:%02x", MenuLayer, MenuIndex, OldKeyState); // debug
	}
}


void DetectEncoderID(void)
{

	#ifdef	ADV717X
	if(ReadI2C(ADV7176I2CAddress, 0x00) != 0xff)
		EncoderID = 0x54;
	else
		EncoderID = 0xd4;
	#endif	//ADV717X


	#ifdef	SAA71XX
		EncoderID = 0x8c;
	#endif	//SAA71XX

	
}

void MakeMaxMenuLayer(void)
{
	switch(OneMenuIndex){
		case 0: MaxMenuLayer = 0x03;	break;	// video input
		case 1: MaxMenuLayer = 0x04;	break;	// register set		//$11
		case 2: MaxMenuLayer = 0x03;	break;	// scaling
		case 3: MaxMenuLayer = 0x02;	break;	// Caption
		case 4: MaxMenuLayer = 0x02;	break;	// initializing
		case 5: MaxMenuLayer = 0x02;	break;	// escape
		case 6: MaxMenuLayer = 0x01;	break;	// help
		default:	break;
	}
}


void OSDLockMode(void)
{

	if(!DetVideo){
//		delay(100);
		OSDCmd2(0xc0, 0x0c);
//		Printf("\r\nDetVideo:%02x PAL_NTSC:%02x",DetVideo,PAL_NTSC);
	}
	else{ 
		if(PAL_NTSC)
			OSDCmd2(0xc0, 0x00);
		else
			OSDCmd2(0xc0, 0x01);
//		Printf("\r\nDetVideoP:%02x PAL_NTSC:%02x",DetVideo,PAL_NTSC);
	}
	
		
}


void ExeMenu(void)
{
	#ifdef ADV717X
	BYTE OutSelect;
	#endif //ADV717X

	switch(OneMenuIndex){
		case 0:
			if(MenuLayer == 3){
				
				switch(TwoMenuIndex){
					case 0: I2CDeviceSet( OSDComposite ); 	break;
					case 1: I2CDeviceSet( OSDSVideo );		break;
					case 2: I2CDeviceSet( OSDYPbPr );		break;
					case 3: I2CDeviceSet( InputSCART ); 	break;
					case 4: 
						#ifdef ADV717X
						OutSelect = ReadI2C(EncoderID, 0x00);
						switch(MenuIndex){
							case 0: WriteI2C(EncoderID, 0x00, (OutSelect | 0x40));	break;
							case 1: WriteI2C(EncoderID, 0x00, (OutSelect & 0xbf));	break;
							default:	break;
						}
						#elif defined SAA71XX	// ADV717X		// has to work program for switching R,G,B / Cb,Y,Cr
						#endif	//SAA71XX
						break;
					default:	break;
				}
			}
			break;
		case 1:	
			switch(MenuLayer){		//$11
				case 2:
					switch(MenuIndex){
						case 0:	TargetID = 0x88;		break;
						case 1:	TargetID = EncoderID;	break;	// check EncoderID up
						case 2: TargetID = 0x5c;		break;
						default:						break;
					}
					break;
				case 3:	OSDData = ReadI2C(TargetID, MenuIndex);	break;
				case 4:
					WriteI2C(TargetID, TwoMenuIndex, MenuIndex);	break;
				default:	break;
			}
			break;

		case 2:
			if(MenuLayer == 2)
				switch(MenuIndex){
					case 0: OSDData = ReadTW99(0x0e);	break;
					case 1: OSDData = ReadTW99(0x0f);	break;
					case 2: OSDData = ReadTW99(0x0d);	break;
					default:	 break;
				}

			if(MenuLayer == 3)
				WriteTW99(TwoMenuIndex, MenuIndex);
			break;
		case 3:
			if(MenuLayer == 2){
				switch(MenuIndex){
					case 1: OSDCmd1(0x17);	break;	// caption on
					default:				break;
				}
			}
			break;
		case 4:
			if(MenuLayer == 2){
				switch(MenuIndex){
					case 1: ReturnInitialOFF();	break;
					default:					break;
				}
			}
			break;
		case 5:

⌨️ 快捷键说明

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