📄 auto.c
字号:
#include "fnt_inc.h"
///////////////////////////////////////////////////////////////////////////////////
void SetDefault(void)
{
unsigned int VTotal;
VTotal=(Reg7300[0x58]+(Reg7300[0x59]<<8));
Reg7300[0x20]=((VTotal-1)&0x00ff);
Reg7300[0x21]=((VTotal-1)>>8);
Reg7300[0x24]=(CurModePtr[4]&0x00ff);
Reg7300[0x25]=(CurModePtr[4]>>8);
Reg7300[0x1e]=(CurModePtr[3]&0x00ff);
Reg7300[0x1f]=(CurModePtr[3]>>8);
Reg7300[0x1a]=((CurModePtr[5]-CurModePtr[3])&0x00ff);
Reg7300[0x1b]=((CurModePtr[5]-CurModePtr[3])>>8);
Reg7300[0x1c]=((CurModePtr[6]+CurModePtr[7]-22)&0x00ff);
Reg7300[0x1d]=((CurModePtr[6]+CurModePtr[7]-22)>>8);
Reg7300[0x23]=(CurModePtr[9]&0x00ff);
OriginalColock=(Reg7300[0x5d]<<8)+Reg7300[0x5c]+1;
}
///////////////////////////////////////////////////////////////////////////////////
unsigned int ReportHActive(void)
{
unsigned int value;
value=0;
if(SourceType!=_DigitalSource){
while(value!=(Reg7300[0x31]<<8)+Reg7300[0x30]-(Reg7300[0x2f]<<8)-Reg7300[0x2e]+1){
value=(Reg7300[0x31]<<8)+Reg7300[0x30]-(Reg7300[0x2f]<<8)-Reg7300[0x2e]+1;
Wait1Frame();
}
}
else {
Reg7300[0x5e]=0x19;
value=Reg7300[0x5f];
Reg7300[0x5e]=0x1a;
value=value + (Reg7300[0x5f]<<8);
}
return(value);
}
///////////////////////////////////////////////////////////////////////////////////
unsigned int ReportVActive(void)
{
unsigned int VActive;
VActive=0;
if(SourceType!=_DigitalSource){
while(VActive!=(Reg7300[0x35]<<8)+Reg7300[0x34]-(Reg7300[0x33]<<8)-Reg7300[0x32]+1){
VActive=(Reg7300[0x35]<<8)+Reg7300[0x34]-(Reg7300[0x33]<<8)-Reg7300[0x32]+1;
Wait1Frame();
}
}
else {
Reg7300[0x5e]=0x1b;
VActive=Reg7300[0x5f];
Reg7300[0x5e]=0x1c;
VActive=VActive + (Reg7300[0x5f]<<8);
}
return(VActive);
}
////////////////////////////////////////////////////////////////////////////////////
void SetFullScreen(void)
{
unsigned int BoundryValue;
BoundryValue=Reg7300[0x1c]+(Reg7300[0x1d]<<8)+10;
Reg7300[0x26]=(BoundryValue&0x00ff);
Reg7300[0x27]=(BoundryValue>>8);
BoundryValue=BoundryValue+Reg7300[0x1e]+(Reg7300[0x1f]<<8)-20;
Reg7300[0x28]=(BoundryValue&0x00ff);
Reg7300[0x29]=(BoundryValue>>8);
BoundryValue=Reg7300[0x23]+10;
Reg7300[0x2a]=(BoundryValue&0x00ff);
Reg7300[0x2b]=0;
BoundryValue=BoundryValue+Reg7300[0x24]+(Reg7300[0x25]<<8)-20;
Reg7300[0x2c]=(BoundryValue&0x00ff);
Reg7300[0x2d]=(BoundryValue>>8);
}
////////////////////////////////////////////////////////////////////////////////////////////
void AverageMaxMin(unsigned int *Ra,unsigned int *Ga,unsigned int *Ba,
unsigned int *Ri,unsigned int *Gi,unsigned int *Bi,unsigned char iter){
unsigned char i;
*Ra=0;*Ga=0;*Ba=0;*Ri=0;*Gi=0;*Bi=0;
for(i=0;i<iter;i++){
Wait1Frame();
*Ra=*Ra+Reg7300[0x46];
*Ri=*Ri+Reg7300[0x49];
*Ga=*Ga+Reg7300[0x47];
*Gi=*Gi+Reg7300[0x4a];
*Ba=*Ba+Reg7300[0x48];
*Bi=*Bi+Reg7300[0x4b];
}
}
/////////////////////////////////////////////////////////////////////////////////////
void UltAutoColor(void) //2-4-8 frames & (15,20*2,20*3) & with 3-breaking & (10-14,980-988)for 4 frames & (20-28,1960-1976)for 8 frames
{
unsigned char GainValue, IterCnt, FrameAveNum;
unsigned int Ra,Ri,Ga,Gi,Ba,Bi, WhiteMaxAdj, WhiteMinAdj, BlackMaxAdj, BlackMinAdj;
unsigned int i,Cnt=0;
Reg7300[0x61]=0x00;//for command table test
SetFullScreen();
Reg7300[0x04]=0x2f;
Wait1Frame();
for(IterCnt=0;IterCnt<6;IterCnt++)Reg7300[0x09+IterCnt]=0x80;
for(FrameAveNum=0;FrameAveNum<3;FrameAveNum++){//Average of 1frame,4frame,8frame
Cnt=0;
for(i=0;i<100;i++){
if(Cnt<2){
if(FrameAveNum==0){
GainValue=2;
AverageMaxMin(&Ra,&Ga,&Ba,&Ri,&Gi,&Bi,1);
WhiteMaxAdj=ColorSetting[0];
WhiteMinAdj=ColorSetting[1];
BlackMaxAdj=ColorSetting[2];
BlackMinAdj=ColorSetting[3];
}
else{
GainValue=1;
AverageMaxMin(&Ra,&Ga,&Ba,&Ri,&Gi,&Bi,(FrameAveNum<<2));
WhiteMaxAdj=(ColorSetting[0]<<(FrameAveNum+1))-(FrameAveNum);
WhiteMinAdj=(ColorSetting[1]<<(FrameAveNum+1))+(FrameAveNum);
BlackMaxAdj=(ColorSetting[2]<<(FrameAveNum+1))-(FrameAveNum);
BlackMinAdj=(ColorSetting[3]<<(FrameAveNum+1))+(FrameAveNum);
}
if(Ri<BlackMinAdj)Reg7300[0x0c]-=GainValue;
else if(Ri>BlackMaxAdj)Reg7300[0x0c]+=GainValue;
if(Ra<WhiteMinAdj)Reg7300[0x09]+=GainValue;
else if(Ra>WhiteMaxAdj)Reg7300[0x09]-=GainValue;
if(Gi<BlackMinAdj)Reg7300[0x0d]-=GainValue;
else if(Gi>BlackMaxAdj)Reg7300[0x0d]+=GainValue;
if(Ga<WhiteMinAdj)Reg7300[0x0a]+=GainValue;
else if(Ga>WhiteMaxAdj)Reg7300[0x0a]-=GainValue;
if(Bi<BlackMinAdj)Reg7300[0x0e]-=GainValue;
else if(Bi>BlackMaxAdj)Reg7300[0x0e]+=GainValue;
if(Ba<WhiteMinAdj)Reg7300[0x0b]+=GainValue;
else if(Ba>WhiteMaxAdj)Reg7300[0x0b]-=GainValue;
if((Ri>=BlackMinAdj)&&(Ri<=BlackMaxAdj)&&(Ra>=WhiteMinAdj)&&(Ra<=WhiteMaxAdj)&&(Bi>=BlackMinAdj)&&(Bi<=BlackMaxAdj)&&(Ba>=WhiteMinAdj)&&(Ba<=WhiteMaxAdj)&&(Gi>=BlackMinAdj)&&(Gi<=BlackMaxAdj)&&(Ga>=WhiteMinAdj)&&(Ga<=WhiteMaxAdj))
Cnt++;
}//if(Cnt<2)
}//for->i
}//for->FrameAveNum
Reg7300[0x61]=0x66;//for command table test
}
//////////////////////////////////////////////////////////////////////////////////////
unsigned char CalCoarsePhaseStep(void){//_CorPhaseDiv=8;_SeudoClk=100.0;_PhaseStep=320ps/step
float tmp;
if(CurVtotal>1024)tmp=0.3125;
else tmp=0.4167;
return(((float)((Reg7300[0x15]<<8)+Reg7300[0x14])*(1000.0)/((float)_CorPhaseDiv*_SeudoClk))
/((float)((Reg7300[0x1f]<<8)+Reg7300[0x1e]+(Reg7300[0x1b]<<8)+Reg7300[0x1a])
*tmp)+0.5);
}
//////////////////////////////////////////////////////////////////////////////////////
void FreqCalibration(void)
{
unsigned int CurHPor,RecHPor;
unsigned char CorPhaseStep,MatchCnt,MatchMax,CurPhase,ScanCnt,IterCnt;
Reg7300[0x61]=0x00;//for command table test
CurHPor=CurModePtr[5]-CurModePtr[3]; //CurModePtr[5]=Htotal;CurModePtr[3]=Hsize;
Reg7300[0x1e]=(CurModePtr[3]&0x00ff);
Reg7300[0x1f]=(CurModePtr[3]>>8);
Reg7300[0x1a]=(CurHPor&0x00ff);
Reg7300[0x1b]=(CurHPor>>8);
Reg7300[0x36]=_HTHValue; //_HTHValue=0x70
Reg7300[0x07]=(Reg7300[0x07]|0x04); //Bit2=1->Reset internal source digital PLL
Reg7300[0x07]=(Reg7300[0x07]&0xfb); //&11111011->clear Reset
Wait2Frame(); //waite PLL stable
CurHPor=((double)(CurModePtr[3]+CurHPor)*(double)CurModePtr[3] //Rough Adjust
/(double)ReportHActive()-(double)CurModePtr[3]+0.5);
Reg7300[0x1a]=(CurHPor&0x00ff);
Reg7300[0x1b]=(CurHPor>>8);
CorPhaseStep=CalCoarsePhaseStep();
MatchMax=0;
CurHPor=CurHPor-1;
for(ScanCnt=0;ScanCnt<3;ScanCnt++){
Reg7300[0x1a]=(CurHPor&0x00ff);
Reg7300[0x1b]=(CurHPor>>8);
CurPhase=0x08;
MatchCnt=0;
for(IterCnt=0;IterCnt<_CorPhaseDiv;IterCnt++){
Reg7300[0x0f]=CurPhase;
//Wait2Frame();
Wait1Frame();
if(ReportHActive()==CurModePtr[3])MatchCnt++;
CurPhase=CurPhase+CorPhaseStep;
}
if(MatchCnt>=MatchMax){
MatchMax=MatchCnt;
RecHPor=CurHPor;
}
CurHPor++;
}
Reg7300[0x1a]=(RecHPor&0x00ff);
Reg7300[0x1b]=(RecHPor>>8);
OriginalColock=(Reg7300[0x5d]<<8)+Reg7300[0x5c]+1;
Reg7300[0x61]=0x66;//for command table test
}
//////////////////////////////////////////////////////////////////////////////////////
void PhaseCalibration(void)//Sum
{
unsigned char CurPhase, TimeOutCnt, TimeOut;
unsigned char MeanPhase, MinPhase1, CyclePhaseNum;
unsigned long PrSum, NxSum;
float PhaseStep,tmp;
Reg7300[0x61]=0x00;//for command table test
if(CurVtotal>1024)tmp=0.3125;
else tmp=0.4167;
SetFullScreen();
CurPhase=0x48;
TimeOutCnt=0;
MinPhase1=0;
CyclePhaseNum=((float)((Reg7300[0x15]<<8)+Reg7300[0x14])*10.0/(float)((Reg7300[0x5d]<<8)+Reg7300[0x5c]+1))/tmp+0.5;
if(CyclePhaseNum<16){TimeOut=CyclePhaseNum;PhaseStep=1.0;}
else {TimeOut=16;PhaseStep=(float)CyclePhaseNum/16.0;}
Reg7300[0x0f]=CurPhase;
Wait1Frame();//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -