⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svostate.c

📁 一个完整DVDROM代码(使用日立PICKUP)
💻 C
📖 第 1 页 / 共 5 页
字号:
/*=============================================================================
* 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 + -