📄 sync.c
字号:
* 函 数 名: SyncClearIntFlag
* 功能描述: 清除与同步处理相关的中断标志
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void SyncClearIntFlag(void)
{
WrScalarReg(rP1AB, 0x3F); // 清除中断标志
WrScalarReg(rP1AC, 0x1F); // 清除中断标志
}
/*
********************************************************************************
* 函 数 名: SyncSelType
* 功能描述: 选择同步信号类型
* 输 入: Type : 选择同步信号的类型,只有三个值
* SYNCTYPE_SEPA: 分离式同步信号
* SYNCTYPE_COMP: 复合式同步信号
* SYNCTYPE_SOG: 绿色同步信号
* 返 回: 无
********************************************************************************
*/
void SyncSelType(uint8 Type)
{
if (Type == SYNCTYPE_SOG) WrScalarRegBit(rP000, 0x08, 0x08);
else WrScalarRegBit(rP000, 0x00, 0x08);
}
/*
********************************************************************************
* 函 数 名: SyncGetHcnt
* 功能描述: 从Scalar寄存器当中读取当前水平同步频率的计数值
* 输 入: 无
* 返 回: 水平同步频率的计数值,如果OVER则返回0x1FFF
********************************************************************************
*/
static uint16 SyncGetHcnt(void)
{
uint8 state;
state = RdScalarReg(rP19A);
if (state & 0x40) return 0x1FFF;
else if (state & 0x08) return (RdScalarWord(rP19B) & 0x1FFF);
else return 0x1FFF;
}
/*
********************************************************************************
* 函 数 名: SyncGetVcnt
* 功能描述: 从Scalar寄存器当中读取当前垂直同步频率的计数值
* 输 入: 无
* 返 回: 垂直同步频率的计数值,如果OVER则返回0x1FFF
********************************************************************************
*/
static uint16 SyncGetVcnt(void)
{
uint8 state;
state = RdScalarReg(rP19A);
if (state & 0x80) return 0x1FFF;
else if (state & 0x30) return (RdScalarWord(rP19D) & 0x1FFF);
else return 0x1FFF;
}
/*
********************************************************************************
* 函 数 名: SyncGetPol
* 功能描述: 读取当前同步信号的极性,1表示正极性,0表示负极性
* 输 入: 无
* 返 回: 返回当前的同步信号极性
* 第0位:水平极性;
* 第1位:垂直极性;
********************************************************************************
*/
static uint8 SyncGetPol(void)
{
uint8 pol;
uint8 v;
pol = RdScalarReg(rP19A) & 0x03;
// 所读到的值得第0位和第1位交换
v = (pol>>1) & 0x01;
pol = ((pol << 1) & 0x02) + v;
return pol;
}
/*
********************************************************************************
* 函 数 名: SyncFreeRun
* 功能描述: 在没有水平和垂直同步信号或者是同步超出范围时自由运行
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void SyncFreeRun(void)
{
SarBF3Disable(0);
SarBF3Disable(1);
SarPower(POWER_NORMAL);
PowerLED(POWER_NORMAL);
// WrScalarRegBit(rP0F0, B0000_1000, B0000_1000); //chen add 08-05-22
// WrScalarRegBit(rP0F0, B0000_0000, B0000_1000); //chen add 08-05-22
SarFreeRun();
PanelPowerSequence(ON);
AdjBacklight(HIDE, 0);
AdjBri(HIDE, 0);
AdjCon(HIDE, 0);
AdjOsdHpos(HIDE, 0);
AdjOsdVpos(HIDE, 0);
SarBF3DisBoard(0);
if (!Flg_BackLighPower) BackLightPower(ON);
}
uint8 BurnPat;
/*
********************************************************************************
* 函 数 名: SyncBurn
* 功能描述: 产生老化测试画面,只有在满足没有同步信号输入,同时允许老化的条件下
* 才能产生老化的测试画面。
* 输 入: 无
* 返 回: 无
* 注 意: BurnPat用来指明是使用哪一个测试画面。
********************************************************************************
*/
void SyncBurn(void)
{
BurnPat &= 0x0F;
WrScalarReg(rP154, (BurnPat<<4) + 0x01);
BurnPat++;
}
/*
********************************************************************************
* 函 数 名: SyncEnterSleep
* 功能描述: 当没有同步信号输入时,判断是否允许老化,如果允许老化则进入老化
* 否则显示无信号输入提示画面之后,进入省电状态
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
static void SyncEnterSleep(void)
{
SyncFreeRun();
if (SysPar.Flag & FLAG_BURNIN) {
BurnPat = 0;
SysState = SYS_BURNIN;
MenuBurning();
SyncBurn();
Flg_EnBurning = 1;
}
else {
MenuShowNoSync();
ActivePowerSaving();
}
}
/*
********************************************************************************
* 函 数 名: SyncGetAttr
* 功能描述: 读取同步信号属性,包括水平同步和垂直同步的计数值,水平/垂直同步极性
* 输 入: Sync : 指向保存同步属性的结构指针
* 返 回: 无
********************************************************************************
*/
static void SyncGetAttr(SYNCATTR * Sync)
{
Sync->Hcount = SyncGetHcnt();
Sync->Vcount = SyncGetVcnt();
Sync->HVPol = SyncGetPol();
}
/*
********************************************************************************
* 函 数 名: SyncInt
* 功能描述: 禁止或者是允许同步处理中断
* 输 入: state = ON 允许同步处理中断
* = OFF 禁止同步处理中断
* 返 回: 无
********************************************************************************
*/
void SyncInt(uint8 state)
{
if (state == ON) EnableScalarInt();
else DisableScalarInt();
}
/*
********************************************************************************
* 函 数 名: SyncOutOfRangeProc
* 功能描述: 对同步信号超出范围,或者显示模式不在列表的情况进行处理
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
static void SyncOutOfRangeProc(void)
{
SysState = SYS_OUTOFHIGH;
SyncFreeRun();
MenuShowOutOfRange();
ActivePowerSaving();
}
uint8 SyncState;
uint8 ModeWaitCount;
void SyncDet(void)
{
#if EN_ALWAYSAUTO
uint8 AutoResult;
#endif
#if EN_NT68167_C //|| EN_NT68167_B
uint8 xdata *Addr;
#endif
uint8 CurSyncState;
switch (ModeState) {
case MODE_INIT:
Flg_SyncInt = 1;
ModeState = MODE_DETECT;
break;
case MODE_DETECT:
if (!Flg_SyncInt) break;
DisplayMute(ON); // 关屏幕
//chen 08-05-13解决NT68167 B版无信号开机进入待机,再接入信号时图象不正常
if(SysState != SYS_NORMAL)
{
#if EN_NT68167_B
SarPower(POWER_NORMAL); //chen 08-05-13
#elif EN_NT68167_C
Addr = 0xF000 + IDX_LDO_ADJ;
*Addr = 0x8B; //Power up APLL //chen 08-05-16
Addr = 0xF000 + IDX_CURR_ADJ1;
*Addr = 0x55; //Set the current of PortB/PortA to mid value //chen 08-05-16
#endif
}
SarDispCtrl(DISP_OSD);
DisableScalarInt();
SyncInt(OFF);
SyncClearIntFlag(); // 清除中断标志
SetTimerEvent(EVENT_POWERSAVING, 0); // 清除节能事件
Flg_EnBurning = 0;
if (GetEventTime(EVENT_SAVEPAR)) SaveAllPar();
if (SysState != SYS_SWITCH) {
CtrlOsdParReset();
}
SyncState = 0x55;
ModeWaitCount = 0x00;
ModeState = MODE_WAIT;
break;
case MODE_WAIT:
CurSyncState = (RdScalarReg(rP1AB) & B0011_1100) + (RdScalarReg(rP1AC) & B0000_0011);
if (CurSyncState != SyncState) {
SyncState = CurSyncState;
ModeWaitCount = 0x00;
Delay(2);
}
else {
ModeWaitCount++;
if (ModeWaitCount > 100) {
SyncGetAttr(&SyncAttr);
ModeState = MODE_STAB;
}
else Delay(2);
}
SyncClearIntFlag();
break;
case MODE_STAB:
SyncClearIntFlag(); // 清除中断标志, 这条放在这里很重要,否则快速插拔信号时
// 会出现问题
Flg_SyncInt = 0;
SyncInt(ON);
ModeState = MODE_DETECT;
/*
================================================================================
= 对稳定状态的处理
=
= Vtotal = 水平同步频率/垂直同步频率
= 水平同步频率 = 96000000/水平计数值
= 垂直同步频率 = 46875/垂直计数值
= 因此推算出来的计算公式: Vtotal = (2048 * 垂直计数值)/水平计数值
= 要注意一点, 这些公式是在SCALAR时钟频率为12M时得出来的
=
================================================================================
*/
Hfre = 9600000L/SyncAttr.Hcount; // 公式计算出来的值除以100就是水平同步频率,单位是:kHz
Vfre = 4687500L/SyncAttr.Vcount; // 公式计算出来的值除以100就是水平同步频率,单位是:Hz
Vtotal = ((uint32)SyncAttr.Vcount * 2048)/SyncAttr.Hcount;
/*
================================================================================
= 判断同步频率有没有超过上限值
================================================================================
*/
if (Hfre > MAX_HSYNC || Vfre > MAX_VSYNC) {
SarSetBackGround(0x00, 0x00, 0x00);
SyncOutOfRangeProc();
break;
}
/*
================================================================================
= 判断同步频率有没有超过下限值
================================================================================
*/
if (Hfre < MIN_HSYNC || Vfre < MIN_VSYNC) {
if (Hfre < MIN_HSYNC && Vfre < MIN_VSYNC) SysState = SYS_OUTOFLOW;
else if (Hfre < MIN_HSYNC) SysState = SYS_OUTOFHLOW;
else SysState = SYS_OUTOFVLOW;
SarSetBackGround(0x00, 0x00, 0x00);
SyncEnterSleep();
break;
}
/*
================================================================================
= 对频率在正常范围内的处理
================================================================================
*/
SyncSetInterlace();
ModePar.mode = SyncGetIndex();
if (ModePar.mode == 0xFF) {
SyncOutOfRangeProc();
break;
}
LoadRelPar(ModePar.mode);
SyncGetModePixels();
AdjClock(HIDE, 0);
AdjPhase(HIDE, 0);
SyncGetHscnt();
ModeState = MODE_OUTPUT;
break;
/*
================================================================================
= 参数输出部分
================================================================================
*/
case MODE_OUTPUT:
ModeState = MODE_DETECT;
SarSetBackGround(0x00, 0x00, 0x00);
if (SysState != SYS_NORMAL)
{
SarPower(POWER_NORMAL);
}
SyncOutRelPar();
if (Flg_SyncInt) break;
if (SysState != SYS_NORMAL) { // 这里的处理是防止从其他同步模式到这里
PowerLED(POWER_NORMAL); // 电源没有正常控制
SyncOutOneTimePar();
PanelPowerSequence(ON);
}
if (Flg_SyncInt) break;
DisplayMute(OFF);
SysState = SYS_NORMAL;
#if USE_AUDIO //chen 08-05-22
AudioVolume(SysPar.Volume);
AdjMute(HIDE,0);
#endif
#if EN_ALWAYSAUTO // 允许总是在模式切换发生时进行AUTO
AutoResult = AutoTuneProc();
if ((AutoResult == AUTO_OK) && (!ModePar.flag)) {
ActiveSave_VGAMODE();
SaveAllPar();
}
#endif
break;
}
}
/*
********************************************************************************
* 文 件 结 束 *
********************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -