📄 source.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 + -