📄 svostate.c
字号:
/*=============================================================================
* Copyright (C) 2001 Acer Labs, Inc. All Rights Reserved.
*
* File: SVOSTATE.C
*
* Contents: -
*
* History:
* 04/18/2001 develop 5705
******************************************************************************/
#include <reg52.h>
#include "typedef.h"
#include "defs.h"
#include "extern.h"
#include "bufalloc.h" //1828a01j
#include "function.h"
#include "macro.h"
#include "regdef.h"
BYTE bFLEVEL2,bFLEVEL2_1; //1a24a01m
#define f2discid fDir //1 hanyc d3811
#define ibBkCurrentFrmType ibLongJumpErr //1 hanyc d3811
/*-----------------------------------------------------------------------------
Function: servo state machine
Input: -
Output: -
-----------------------------------------------------------------------------*/
void ServoState(void)
{
BYTE id_status;
CheckButton();
id_status=ChkRdID();
if(id_status==READY){}
else if(id_status==BUSY)
{ //R1726_COM_02***
if(!fTOC&&fCDDisc&&RdFGCount()<0x25)
{
WrDSP(BRK_PRO,0x00);
WrDSP(FGIN_BRK,0x60);
WrDSP(SPD_MODE,0x0A);
Delay10ms(10);
WrDSP(SPD_MODE,0x00);
goto RECOVER_FROM_OUTSIDE;
}
return;
} //R1726_COM_02&&&
else
{
RECOVER_FROM_OUTSIDE: //R1726_COM_02
bRetryTimes++; //R1726_COM_02
fCHKID=1;//R1703_COM_02
bSUPhase=bSUSubPhase=0;
bASUState=bServoState;
bServoState=START_UP_STATE;
if(fNextB0&&bASUState==READ_TOC_STATE)
{
fSBvsSH=1;
bSUSubPhase=2;
FinishRdTOC();
SledIn();
// hanyc
Delay10ms(20); //50
SledOut();
Delay1ms(10);
SledOff();
ibServoSubTimer=100;
}
}
if( (!iwIdleTimer) && (!fTOC) && (bServoState > TRAY_IN_STATE) ) //1926a01j***
{
LEDOff();
SpindleOff();
LDOff();
HoldVCO();
bbCurrentFrmType=NO_DISC;
bDecoderState=IDLE;
bServoState=IDLE_STATE;
bPhase=bSubPhase=0;
} //1926a01j&&&
switch(bServoState)
{
case SEEK_STATE://0x09
SeekState();
break;
case IDLE_STATE://0x00
IdleState();
break;
case TRAY_OUT_STATE://0x01
TrayOutState();
break;
case TRAY_IN_STATE://0x02
TrayInState();
break;
case START_UP_STATE://0x03
StartUp();
break;
case SAVE_LGAIN://0x04
SaveLGain();
break;
case TURN_ERR_RATE://0x05
TuneErrRate();
break;
case READ_TOC_STATE://0x06
ReadTOCState();
break;
case SCAN_DISC_STATE://0x07
ScanDiscState();
break;
case MONITOR_STATE://0x08
Monitor();
CheckSpeed();
break;
}
}
/*-----------------------------------------------------------------------------
Function: -
Input: -
Output: -
-----------------------------------------------------------------------------*/
void CheckButton(void)
{
/*
#if PORTABLE_DEVICE
if ( (TrayInSW)&&(bServoState!=IDLE_STATE) ) LDOff();
#endif
*/
if(!fRuninJ && !fMaster && bBOFCount){return;}
// if(bPhase==TRAY_IN_STATE) {return;}
if(fEjectPressed)
{
fEjectPressed=0;
fTrayFail=0;
if(fTrayDir==OUT_WARD)
{
if(fPreAllow==ALLOW)
{
#if PORTABLE_DEVICE
#else
TrayOff();//1912a01j
#endif
if(bStateFlowNo!=0xFF && (fRead10Exed||fReadCDExed))
{
SetSenseCode(0x02,0x3A,0x00);
WrReg(ATAPIERR,0x20);
WrReg(MPACKREG2,0x02);
bStateFlowNo=0xFF;
}
LEDOff();
bServoState=TRAY_OUT_STATE;
bPhase=bSubPhase=0;
}
else
{
fTrayDir=IN_WARD;
ibMediaEvent=0x01;
}
}
else
{
#if PORTABLE_DEVICE
#else
TrayOff();//1912a01j
#endif
LEDOff();
bServoState=TRAY_IN_STATE;
bPhase=bSubPhase=0;
}
}
//1906a02j
}
/*-----------------------------------------------------------------------------
Function: -
Input: -
Output: -
-----------------------------------------------------------------------------*/
BYTE ChkRdID(void)
{
BYTE status=READY;
if(fJumpTrack||fJumpLayer||bServoState<=START_UP_STATE){}
else if(RdReg(SVO_STATUS)&FOCUS_OK)
{
if(!fDisRdQ)
{
if((status=RdSectorID())==READY)
fNewID=1;
}
else//R1703_COM_02
fCHKID=1;//R1703_COM_02
}
else
{
if(fTuneFTGR)
{
if(fDVDDual&&fLayerNumber)
{
TP_BYTE_4=ibFTGR;
ibFTGR=ibFTGR_1;
ibFTGR_1=TP_BYTE_4;
}
if(fTurnErrDir&&fTuneErrhaverun)
{
fTurnErrDir=0;
fTuneFTGR=0;
fTuneASL=1;
}
else
{
fTurnErrDir=1;
fTuneErrhaverun=0;
}
bPhase=0;
}
else if(fTuneASL)
{
fTuneASL=0;
if(fDVDDual&&fLayerNumber)
{
TP_BYTE_4=ibASL;
ibASL=ibASL_1;
ibASL_1=TP_BYTE_4;
InitPointer();
WrReg(0x0BD,0x00);
WrReg(0x014,(RdReg(0x014)|0x40));
if(fSaveNum)
{
bServoState=SAVE_LGAIN;
fLayerNumber=~fLayerNumber;
fAutoAdj=1;
}
else
{
bServoState=READ_TOC_STATE;
bPhase=bSubPhase=0;
fLayerNumber=0;
}
}
else
bPhase=4;
}
fNewID=0;
fDisRdQ=0;
status=ERROR;
}
return status;
}
/*-----------------------------------------------------------------------------
Function: -
Input: -
Output: -
-----------------------------------------------------------------------------*/
// if(SW1_ON && SW2_OFF&& SW3_OFF) fDiscWait =1;
void IdleState(void)
{
#if 1 //SHINWA_SLOTIN
switch(bPhase)
{
case 0:
#if (SHINWA_TW0407)
if(fNeedDiscOut)
{
fNeedDiscOut=0;
TrayOut();
ibServoTimer=100;
bPhase=12;
break;
}
else
#endif
if(fDiscWait)
{
iwSpeedTimer=60;
// ibServoTimer=6;
// bRetryTimes =10;
bPhase++;
}
#if 0//(SHINWA_TW0407)
#else
else
{
if(SW3_OFF && SW1_ON)
{
fTrayDir=IN_WARD;
fEjectPressed=TRUE;
}
}
#endif
break;
case 1:
if( ((SW1_OFF)&&(SW2_OFF))
||((SW1_OFF)&&(fMiniDisc)) )
{
fDiscWait=0;
bPhase=0;
break;
}
#if 0//(SHINWA_TW0407)
#else
else if( ((SW2_ON) && (fMiniDisc))
|| ((SW2_ON) && (SW1_OFF)) )
{
fDiscWait=0;
bPhase =3;
// break;
// fTrayDir=IN_WARD;
// fEjectPressed=TRUE;
}
#endif
#if (SHINWA_TW0407)
else if (SW1_ON && SW2_OFF)
{
iwSpeedTimer=1000;
bPhase++;
}
else if(!iwSpeedTimer)
{
if(SW1_ON && SW3_OFF)
bPhase=3;
else
bPhase=bSubPhase=0;
}
break;
#endif
#if (SHINWA_TW0407)
case 2:
if(SW2_ON && SW3_OFF)
bPhase++;
else if(SW1_OFF && SW2_OFF && SW3_OFF)
bPhase=bSubPhase=0;
else if(!iwSpeedTimer)
bPhase++;
break;
case 3:
#if 1
fTrayDir=IN_WARD;
fEjectPressed=TRUE;
break;
#else
fTrayDir=IN_WARD;
ibMediaEvent=0x01;
fDiscWait=0;
bServoState=TRAY_IN_STATE;
bPhase=bSubPhase=0;
break;
#endif
#endif
case 12:
if(SW3_OFF || !ibServoTimer)
{
ibServoTimer=250;
bPhase++;
}
break;
case 13:
if(fMiniDisc)
{
if(SW1_ON || !ibServoTimer)
{
ibServoTimer=250;
bPhase++;
}
}
else
{
if(SW1_OFF || SW2_OFF || !ibServoTimer)
{
if(!ibServoTimer)
ibServoTimer=150;
if(SW1_OFF&&SW2_ON)
{
while(SW2_ON);
TrayOff();
bPhase=15;
}
else if(SW1_ON&&SW2_OFF)
{
TrayOff();
bPhase=15;
}
else
bPhase++;
}
}
break;
case 14:
if(fMiniDisc)
{
if(SW2_ON || !ibServoTimer)
{
if(!ibServoTimer) fTrayFail=1;
ibServoTimer=250;
bPhase++;
}
}
else
{
if(SW1_OFF || SW2_OFF || !ibServoTimer)
{
if(!ibServoTimer) fTrayFail=1;
ibServoTimer=50; //250
if(SW2_OFF) TrayOff();
bPhase++;
}
}
break;
case 15:
if(SW2_OFF || !ibServoTimer)
{
{
TrayIn();
Delay1ms(10);
TrayOff();
}
if(SW2_OFF && SW1_ON) fDiscWait =1;
fTrayFail =0;
// bServoState=IDLE_STATE;
bPhase=bSubPhase=0;
}
break;
/*
case 2:
if(!ibServoTimer) bPhase=1;
if(SW1_OFF)
{
fDiscWait=0;
fTrayDir=IN_WARD;
fEjectPressed=TRUE;
}
break;
*/
}
#else
switch(bPhase)
{
case 0:
ibServoTimer=60;
bPhase++;
break;
case 1:
if(!ibServoTimer)
{
bPhase=bSubPhase=0;
#if PORTABLE_DEVICE
#else
if(fTrayFail)
{
if(!TrayOutSW&&TrayInSW)
{
fTrayFail=0;
fTrayDir=OUT_WARD;
}
else if(TrayOutSW&&!TrayInSW)
{
fTrayFail=0;
if(fTrayDir==OUT_WARD)
{
fTrayDir=IN_WARD;
fEjectPressed=TRUE;
}
}
}
#endif
#if PORTABLE_DEVICE
#else
else if(TrayOutSW&&TrayInSW)
{
fTrayDir=IN_WARD;
fEjectPressed=TRUE;
}
#endif
}
break;
}
#endif
}
/*-----------------------------------------------------------------------------
Function: -
Input: -
Output: -
-----------------------------------------------------------------------------*/
void TrayOutState(void)
{
switch(bPhase)
{
case 0:
#if PORTABLE_DEVICE
// PowerSave mode ***
if(fDisSleep)
{
bbCurrentFrmType=NO_DISC;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -