📄 modehandle.c
字号:
#include "F63REG.H"
#include "stdio.h"
#include "RAM.H"
#include "ModeHandle.H"
#include "MyDef.H"
#include "UserAdj.H"
#include "IIC.H"
#include "Scaler.H"
#include "MCU.H"
#include "PANEL.H"
#include "AutoAdj.H"
#include "OSD.H"
#include "ROM_MAP.H"
#define MoveAltOSD
void GetCounter(void)
{
unsigned char value,temp;
unsigned long Freq;
// VGA/DVI Connector
// Connected
value = INTHV_FLG & 0x47; //V sync
if(value != 0){
INTHV_FLG = 0xc7;
flag1 |= BIT_0;
//bit4==>H_pol, bit5==>V_pol
HV_Pol = 0;
value = HVI_REG & 0x03;
if((value & BIT_0) != 0)
HV_Pol |= BIT_5;
if((value & BIT_1) != 0)
HV_Pol |= BIT_4;
//H_SYNC=xx.xKHz
temp = HCNT_LB;
value = HCNT_HB;
if((value & BIT_7) != 0){
H_SYNC = 0;
flag1 &= ~BIT_0;
}
else{
H_SYNC = value & 0x0f;
H_SYNC <<= 8;
H_SYNC = H_SYNC | temp;
if((H_SYNC == 0x0fff)||(H_SYNC == 0)){
H_SYNC = 0;
flag1 &= ~BIT_0;
}
else{
Freq = (unsigned long)H_SYNC * 100000;
H_SYNC = (unsigned int)(((Freq / 32768) + 5) / 10);
}
}
//V_SYNC=xx.xHz
temp = VCNT_LB;
value = VCNT_HB;
if((value & BIT_7) != 0){
V_SYNC = 0;
flag1 &= ~BIT_0;
}
else{
V_SYNC = value & 0x3f;
V_SYNC <<= 8;
V_SYNC = V_SYNC | temp;
if((V_SYNC == 0x3fff)||(V_SYNC == 0)){
V_SYNC = 0;
flag1 &= ~BIT_0;
}
else{
Freq = (unsigned long)12500000 / V_SYNC + 5;
V_SYNC = Freq / 10;
}
}
}
else{
if((MUTE_CTRL & 0x30) != 0x30){
flag1 &= ~BIT_0;
}
}
}
void CheckFreq(void)
{
// Timer4 = 0;
Timer3 = 100;
do{
GetCounter();
if(((flag1 & BIT_0)==0)||(Timer3 == 0)){
NoSync();
return;
}
else{
if((flag1 & BIT_3) != 0){
if((SyncMode == 2) && ((flag2 & BIT_4) == 0)){
flag1 &= ~BIT_0;
flag2 |= BIT_4;
return;
}
ScalerPowerUp();
}
}
if(HV_Pol_Temp != HV_Pol){
BackLightOff();
ForceToBackground(0); //Set fource to background
HV_Pol_Temp = HV_Pol;
Timer4 = SyncStabTime;
OSD_OFF();
flag1 |= BIT_4;
if((flag3 & BIT_2) != 0x00)
printf("HV_Pol Change\r\n");
}
if(H_SYNC_Temp > H_SYNC){
if((H_SYNC_Temp - H_SYNC) > 10){
BackLightOff();
ForceToBackground(0); //Set fource to background
H_SYNC_Temp = H_SYNC;
Timer4 = SyncStabTime;
OSD_OFF();
flag1 |= BIT_4;
if((flag3 & BIT_2) != 0x00)
printf("H_SYNC Change %d\r\n",(unsigned short)H_SYNC);
}
}
else{
if((H_SYNC - H_SYNC_Temp) > 10){
BackLightOff();
ForceToBackground(0); //Set fource to background
H_SYNC_Temp = H_SYNC;
Timer4 = SyncStabTime;
OSD_OFF();
flag1 |= BIT_4;
if((flag3 & BIT_2) != 0x00)
printf("H_SYNC Change %d\r\n",(unsigned short)H_SYNC);
}
}
if(V_SYNC_Temp > V_SYNC){
if((V_SYNC_Temp - V_SYNC) > 10){
BackLightOff();
ForceToBackground(0); //Set fource to background
V_SYNC_Temp = V_SYNC;
Timer4 = SyncStabTime;
OSD_OFF();
flag1 |= BIT_4;
if((flag3 & BIT_2) != 0x00)
printf("V_SYNC Change %d\r\n",(unsigned short)V_SYNC);
}
}
else{
if((V_SYNC - V_SYNC_Temp) > 10){
BackLightOff();
ForceToBackground(0); //Set fource to background
V_SYNC_Temp = V_SYNC;
Timer4 = SyncStabTime;
OSD_OFF();
flag1 |= BIT_4;
if((flag3 & BIT_2) != 0x00)
printf("V_SYNC Change %d\r\n",(unsigned short)V_SYNC);
}
}
}while(Timer4 != 0);
if((flag1 & BIT_4) != 0){
flag1 &= ~BIT_4;
GetMode();
SetMinMax();
CheckModeChange();
if(H_SYNC_Temp == 0xffff){
return;
}
if((flag3 & BIT_1) == 0){
SetDisplayNormal();
if(Read24C16(0xdb) != 0){
// if((PortC & BIT_6) != 0){
// Sleep(PowerUpInvTiming);
BackLightOn();
// }
AutoTune();
}
// ShowInputSource();
SetVolume();
}
else{
ShowOutOfRange();
BackLightOn();
}
// if((PortC & BIT_6) != 0){
// Sleep(PowerUpInvTiming);
// BackLightOn();
// }
}
#ifdef MoveAltOSD
else{
if(((flag3 & BIT_1) != 0)&&(OutOfRangeTimer < 400)&&(OutOfRangeTimer > 0)){
ShowOutOfRange();
}
}
#endif
}
void GetMode(void)
{
unsigned char ch;
unsigned short i,j,value;
#if 0
ch = ReadIIC_HW(Scaler_Addr,0x87);
if((ch & BIT_4) == 0){
flag3 &= ~BIT_6;
WriteIIC_HW(Scaler_Addr,0x13,0x00);
if((flag3 & BIT_2) != 0x00){
printf("Non-Interlace mode\r\n");
}
}
else{
flag3 |= BIT_6;
WriteIIC_HW(Scaler_Addr,0x13,0x31);
if((flag3 & BIT_2) != 0x00){
printf("Interlace mode\r\n");
}
}
#endif
ModePoint = 0;
VTotal = (unsigned short)(((unsigned long)H_SYNC * 1000)/ V_SYNC);
for(j=0; j< ModeButtom; j=j+4){
i = j;
ch = Read24C16(i); //check h_sync
value = ch;
value = value << 8;
i++;
ch = Read24C16(i);
value = value + ch;
i++;
if((H_SYNC < (value + 10))&&(H_SYNC > (value - 10))){
ch = Read24C16(i); // check hv_pol
value = ch & 0x0f;
value = value << 8;
ch = ch & 0x30;
i++;
if(ch == HV_Pol){
ch = Read24C16(i); // check v_sync
value = value + ch;
i++;
if((V_SYNC < (value + 10))&&(V_SYNC > (value - 10))){
if((flag3 & BIT_2) != 0x00){
printf("Mode %d\r\n",(unsigned short)ModePoint);
}
break;
}
}
}
ModePoint++;
}
if(ModePoint >= ModeNum){
if((flag3 & BIT_2) != 0x00){
printf("user's mode\r\n");
}
SetUserMode();
}
LoadModeDependentSettings();
i = 0x106 + (ModePoint * 8);
i = Read24C16(i);
VP_Max = (unsigned char)(VTotal - V_ActiveTab[i] + 20);
if(VP_Max < VP_Start)
VP_Max = (unsigned char)VP_Start;
if((flag3 & BIT_2) != 0x00){
printf("HV_Pol= %x\r\n",(unsigned short)HV_Pol);
printf("H_SYNC= %d\r\n",H_SYNC);
printf("V_SYNC= %d\r\n",V_SYNC);
printf("VP_Max = %d\r\n",(unsigned short)VP_Max);
}
/*
if((SyncMode == 2)||(SyncMode == 1)){ //sog,h+v
WriteIIC_HW(Scaler_Addr,0x01,(0xd8 | DT01));
WriteIIC_HW(Scaler_Addr,0xe8,0xc0);
}
else{
WriteIIC_HW(Scaler_Addr,0x01,(0x48 | DT01));
WriteIIC_HW(Scaler_Addr,0xe8,0x80);
}
*/
SetADC_PLL();
if((flag3 & BIT_1) == 0){
SetScaler();
if(SyncMode != 3){
SetADC_Phase();
SetSharpness();
}
}
#if DVImode == DEmode
VP_Start = 0;
HP_Start = 0;
WriteWordIIC_HW(Scaler_Addr,0x14,VP_Start);
WriteWordIIC_HW(Scaler_Addr,0x18,HP_Start);
#else
if((SyncMode == 3) && ((PortD & BIT_2) != 0)) //DVI
AutoPosition();
#endif
}
void SetUserMode(void)
{
code unsigned short Vt_Tab[]={
500,600,700,768,850,950,1050,1080
};
code unsigned char UserTimeTab[]={
0x00,0x10,0x00,0x60,0x03,0x84,0x01,0x10, //720x400
0x00,0x10,0x00,0x50,0x06,0x80,0x02,0x10, //640x480
0x00,0x10,0x00,0x98,0x04,0x18,0x03,0x10, //800x600
0x00,0x10,0x00,0xe0,0x06,0xc0,0x0c,0x10, //1280x720
0x00,0x10,0x00,0xd0,0x05,0x40,0x05,0x10, //1024x768
0x00,0x10,0x00,0xd0,0x06,0x40,0x06,0x10, //1152x864
0x00,0x10,0x00,0xe0,0x06,0xc0,0x07,0x10, //1280x960
0x00,0x10,0x00,0xf8,0x06,0x98,0x08,0x10, //1280x1024
0x00,0x2e,0x01,0x30,0x08,0x70,0x09,0x10 //over (1600x1200)
};
unsigned short addr;
unsigned char i,j,k;
if((flag3 & BIT_2) != 0x00){
printf("Vtotal = %d\r\n",VTotal);
}
if((flag3 & BIT_6) != 0){
addr = VTotal << 1;
}
else{
addr = VTotal;
}
j = 8;
for(i=0; i<8; i++){
if(addr < Vt_Tab[i]){
j = i;
break;
}
}
j = j * 8;
ModePoint = Read24C16(0xd2);
ModePoint++;
if(ModePoint >= ModeNum){
ModePoint = UserModeSt - 1;
}
Write24C16(0xd2,ModePoint);
if((flag3 & BIT_2) != 0x00){
printf("UserModePoint = %d\r\n",(unsigned short)ModePoint);
}
addr = 0x100 + (ModePoint * 8);
for(i=0; i<8; i++){
k = UserTimeTab[j];
Write24C16(addr,k);
if((flag3 & BIT_2) != 0x00){
printf("Data %x = %x\r\n",(unsigned short)i,(unsigned short)k);
}
addr++;
j++;
}
addr = ModePoint * 4;
k = H_SYNC >> 8;
Write24C16(addr,k);
addr++;
k = H_SYNC;
Write24C16(addr,k);
addr++;
k = V_SYNC >> 8;
k |= HV_Pol;
Write24C16(addr,k);
addr++;
k = V_SYNC;
Write24C16(addr,k);
addr = 0x290 + (ModePoint << 1);
j = j - 4;
k = UserTimeTab[j];
Write24C16(addr,k);
addr++;
j++;
k = UserTimeTab[j];
Write24C16(addr,k);
}
void SyncSource(void)
{
unsigned char value;
if((flag1 & BIT_3) != 0){
if((PoSvTimer == 0)&&((PortC & BIT_6) == 0)){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -