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

📄 source.c

📁 以ST公司CPU为核心的彩色电视机的完整源程序。
💻 C
字号:
/********************* SGS-THOMSON MICROELECTRONICS ************************
FILENAME     : SOURCE.C
VERSION      : V1.0
DATE         : JAN 1999
AUTHOR(s)    : ASHISH RUDOLA / DEEPAK DOSHI
PROCESSOR    : ST92195
DESCRIPTION  : This module contains functions for controlling the selection
               of video and audio sources.
MODIFICATIONS:
	-
*****************************************************************************/

#include "channel.h"
#include "source.h"
#include "macro.h"
#include "audio.h"
#include "eeprom.h"
#include "i2c_bus.h"
#include "st92196.h"
#include "io.h"
#include "register.h"
#include "video.h"
#include "utility.h"
#include "timer.h"
#include "tv_glob.h"
#include "display.h"
#include "power.h"
/* Current video source */
unsigned char source;
 
/* slow_sw counter */
unsigned char slow_sw_counter;

/*****************************************************************************
INPUTS     : none
OUTPUTS    : FORCED_MODE_ENABLE - Enable forced mode
             source - Select default external video source
             see write_video_switch
DESCRIPTION: This function initializes default input and output sources.
             In any cases, internal video and audio sources (antenna) are
             always connected to external video and audio outputs (SCART1
             and SCART 2).
*****************************************************************************/
void init_source(void)
{
	/* Enable forced mode. By this way, as soon as a video signal is
	detected on SCART, the TV switch to AV mode */

	source_flags |= FORCED_MODE_ENABLED ;
	source_flags &= ~AV_REQUEST;
    source_av =1;

 	write_video_ram_data(MAIN_VIDEO_SW, 0x00);
}

/*****************************************************************************
INPUTS     : source - Current external video and audio sources
OUTPUTS    : source - Next external video and audio sources
DESCRIPTION: This function will select external video and audio sources.
   --> TV RF --> SCART_CVBS/AV1 --> SCART_CVBS/AV2 -->SVHS(AV2,RCA)-->RCA/AV3;
   		0		   	  1					 2	         			3  		   4
        |_______________________________________________________________|
*****************************************************************************/
void get_source_input(void)
{
	/* get next video source input */
	switch (source)
	{
		case  TUNER:	
			tv_flags = tv_flags &~ FORCED_TV_AV;
		 	write_video_ram_data(MAIN_VIDEO_SW, 0x00);
		    write_video_ram_data(RGB_EXT,0x00 );
			write_video_ram_data(STANDARD_SELECTION, 0x18);
			write_video_ram_data(SVHS_SWITCH, 0x00);
			write_video_ram_data(TIME_CONSTANT, 0x00);

		break;		

		case  AV1:	
			tv_flags = tv_flags | FORCED_TV_AV;
		 	write_video_ram_data(MAIN_VIDEO_SW, 0x05);
			write_video_ram_data(RGB_EXT,0x00 );
			write_video_ram_data(STANDARD_SELECTION, 0x18);
			write_video_ram_data(TIME_CONSTANT, 0x10);

		break;			

		case  AV2:	
		 	write_video_ram_data(MAIN_VIDEO_SW,0x0A);
			write_video_ram_data(STANDARD_SELECTION, 0x18);
			write_video_ram_data(SVHS_SWITCH, 0x00);
			write_video_ram_data(TIME_CONSTANT, 0x10);

		break;			

		case  SVHS:	
		 	write_video_ram_data(MAIN_VIDEO_SW,0x0A);
			write_video_ram_data(STANDARD_SELECTION, 0x18);
			write_video_ram_data(SVHS_SWITCH, 0x10);
			write_video_ram_data(TIME_CONSTANT, 0x10);

		break;			


		case  EXT_RGB:	
		 	write_video_ram_data(MAIN_VIDEO_SW, 0x05);
			write_video_ram_data(RGB_EXT,0x80 );
			write_video_ram_data(SVHS_SWITCH, 0x00);
			write_video_ram_data(TIME_CONSTANT, 0x10);
		break;			

	}

	update_user_mute();

}

/*****************************************************************************
INPUTS     : 
OUTPUTS    : 
DESCRIPTION: This function...
*****************************************************************************/
void update_source(void)
{
    //here feman add;
    if(source_flags & AV_REQUEST)
        {
        if(source_flags & AV_NIBBLE_REQUEST)
            {
          	video[0x09] = video[0x09] | 0x40;
            write_video(0x09,video[0x09]);
            mute_audio();
            
            source = roll_source(source,EXT_RGB);
			get_source_input();
            
            source_flags &= ~AV_NIBBLE_REQUEST;
            display_request_flags |=  (STATUS_DISPLAY | REFRESH_DISPLAY );
      	    display_request_flags &= ~(SLEEP_DISPLAY |PROGRAM_DISPLAY |NORMAL_DISPLAY|COMMERCIAL_DISPLAY);
			fast_timers[TUNING_AV_TIMER] = 500/MS_PER_INTERRUPT;
            slow_timers[STATUS_TIMER] = STATUS_TIME_OUT;
            }
        else
            if(fast_timers[TUNING_AV_TIMER] ==0)
                {            
            	video[0x09] = video[0x09] & ~(0x40);
              	write_video(0x09,video[0x09]);
//               	millisecond_delay(255);
               	unmute_audio();
                source_flags &= ~AV_REQUEST;
                
                }
        }
    else
	/* Wait for power on before checking pin F_SW of SCART 1 */
	if (tv_flags & ON_STATE)
	{
		if (tv_flags & FORCED_TV_AV) /*ADDITIONAL CODE*/
			return;
		
		/* If forced mode enabled and S_SW pin set then switch to AV mode (SCART 1) */
		if (P5DR & S_SW1)
		{

			if(source_av != 0)
			{
				source = AV1;  
				tuning_flags = tuning_flags &~ TUNING_REQUEST;
				tv_flags = tv_flags &~ INITIAL_SETUP ;
				get_source_input(); 
				tv_flags = tv_flags &~ FORCED_TV_AV;
				source_av = 0;
			}
 
		   else
			{ 
				if (slow_sw_counter < 50)
					slow_sw_counter++;
				if ((slow_sw_counter >= 40) && (source_flags & FORCED_MODE_ENABLED))
				{
					source_flags = source_flags & ~FORCED_MODE_ENABLED;
					source = AV1;  
					tuning_flags = tuning_flags &~ TUNING_REQUEST;
					get_source_input(); 
					show_status() ; /* NEW CODE ADDED BY ASHISH*/
					tv_flags = tv_flags &~ FORCED_TV_AV;
					display_request_flags = display_request_flags | STATUS_DISPLAY;

					slow_timers[STATUS_TIMER] = STATUS_TIME_OUT;  
				}
			}	 
		}
		else
		{
			if (slow_sw_counter != 0)
				slow_sw_counter--;	
			if ((slow_sw_counter < 10) && !(source_flags & FORCED_MODE_ENABLED))
			{
				source_flags = source_flags | FORCED_MODE_ENABLED;
				
				/* start of Ashish's code */
				source = TUNER;  
				tuning_flags = tuning_flags | TUNING_REQUEST;
				get_source_input(); 
				source_av = 0;
				show_status() ; /* NEW CODE ADDED BY ASHISH*/

				display_request_flags = display_request_flags | STATUS_DISPLAY;
				slow_timers[STATUS_TIMER] = STATUS_TIME_OUT;  
				/* End of Ashish's code */
				
 			}
		}
	}
}

⌨️ 快捷键说明

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