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

📄 servo.c

📁 一个完整DVDROM代码(使用日立PICKUP)
💻 C
📖 第 1 页 / 共 5 页
字号:
/*=============================================================================
* Copyright (C) 2001 Acer Labs, Inc. All Rights Reserved.
*
* File:         SERVO.C
*
* Contents:     -
*
* History:
*   04/18/2001  develop 5705
******************************************************************************/
#include <reg52.h>
#include "typedef.h"
#include "defs.h"
#include "extern.h"
#include "function.h"
#include "macro.h"
#include "regdef.h"
#include "svocoeff.h"
#include "bufalloc.h"
extern BYTE bFLEVEL2,bFLEVEL2_1;       //1a24a01m

#define TEST_SDRAM 0
#define TEST_FES 0
#define TUNE_FES 0
#if TEST_FES
BYTE test_fe(void)
{
BYTE    status=BUSY;
//BYTE    temp0=0;
    switch(bSubPhase)
    {
    case 0:
        if(fDVDDisc) 
           InitPA4DVD();
        else if(fCDRW) InitPA4RW();
            else InitPA4CD();
        if(fDVDDual)
            {
            WrSSI(SIGR, dlSIGR);
            WrSSI(FTGR, dlFTGR);
            WrSSI(CDR,  dlCDR);
            WrSSI(FBCR, dlFBCR);
            WrSSI(FCCR, dlFCCR);
            }            
        LDOn();
        WrCoeff(KFSRCH,0x1200); //
                    
        WrDSP(FACTION,0x10);            //move down

        ibServoSubTimer=50;
        bSubPhase++;
        break;

    case 1:
        if(!ibServoSubTimer)
        {
            WrDSP(INITR,0x01);

            WrDSP(FACTION,0x28);        //move up,start disc ID
            ibServoSubTimer=50;
            bSubPhase++;
        }
        break;

    case 2:
        if(!ibServoSubTimer)
        {
            WrDSP(FACTION,0x00);
            Delay10ms(10);
            bSubPhase=0;
            status=READY;
        }
    }

    return status;
}
#endif
#if TUNE_FES
BYTE tune_fes(void)
{
BYTE    status=BUSY;
//BYTE    temp0=0;
    switch(bSubPhase)
    {
    case 0:
        if(fDVDDisc) 
           InitPA4DVD();
        else if(fCDRW) InitPA4RW();
            else InitPA4CD();
        if(fDVDDual)
            {
            WrSSI(SIGR, dlSIGR);
            WrSSI(FTGR, dlFTGR);
            WrSSI(CDR,  dlCDR);
            WrSSI(FBCR, dlFBCR);
            WrSSI(FCCR, dlFCCR);
            }            
        LDOn();
        WrCoeff(KFSRCH,0x1200); //
                    
        WrDSP(FACTION,0x10);            //move down

        ibServoSubTimer=50;
        bSubPhase++;
        break;

    case 1:
        if(!ibServoSubTimer)
        {
            WrDSP(INITR,0x01);

            WrDSP(FACTION,0x28);        //move up,start disc ID
            ibServoSubTimer=50;
            bSubPhase++;
        }
        break;

    case 2:
        if(!ibServoSubTimer)
        {
            WrDSP(FACTION,0x00);
            Delay10ms(10);
            bSubPhase=0;
            status=READY;
        }
    }

    return status;
}
#endif

#if TEST_SDRAM
#define fBadSdram fTOC
void TestSDRAM(void)
{

BYTE mm,nn;
BYTE kk;
	fBadSdram=0;
    WrReg(0x2f,0x00);
    WrReg(0x2a,0);
    WrReg(0x2b,0);
    WrReg(0x2c,0);
    for(nn=0;nn<1;nn++)
    for(mm=0;mm<100;mm++)
    for(kk=0;kk<100;kk++)
        {
        WrReg(0x2d,nn);
        WrReg(0x2e,mm);
        
        WrReg(0x30,kk);
        while( (RdReg(0x2f)&0x01) !=01 );

        WrReg(0x2d,kk);
        WrReg(0x2e,kk+128);
        
        WrReg(0x30,kk);
        while( (RdReg(0x2f)&0x01) !=01 );
        
        }
    
    WrReg(0x2a,0);
    WrReg(0x2b,0);
    WrReg(0x2c,0);
    for(nn=0;nn<1;nn++)
    for(mm=0;mm<100;mm++)
    for(kk=0;kk<100;kk++)
        {
        RdReg(0x30);
        while( (RdReg(0x2f)&0x01) !=01 );
        if(RdReg(0x2d) != nn) fBadSdram=1;
        if(RdReg(0x2e) != mm) fBadSdram=1;

        RdReg(0x30);
        while( (RdReg(0x2f)&0x01) !=01 );
        if(RdReg(0x2d) != kk)  fBadSdram=1;
        if(RdReg(0x2e) != kk+128)  fBadSdram=1;
        if(fBadSdram) break;
        }
    while(fBadSdram);
}
#endif
/*-----------------------------------------------------------------------------
 Function:  doing focusing gain adjustment
 Input:     -
 Output:    -
-----------------------------------------------------------------------------*/
void FocGainAdj(void)
{
#if LOOPGAIN_SW
    WrCoeff(KFCAL,0x2000);
    if(fDVDDual)
        WrDSP(FGC,0x85);	//  V1.1  0x84---v1.0
    else if(fDVDDisc)
        WrDSP(FGC,0x84); 	// V1.0
    else if(fCDRW)
        WrDSP(FGC,0x89); 	// V1.0
    else
        WrDSP(FGC,0x8b);	// V1.0
#endif        
}

/*-----------------------------------------------------------------------------
 Function:  turn on focusing servo
 Input:     -
 Output:    -
-----------------------------------------------------------------------------*/
BYTE FocusOn(void)
{
BYTE    status=BUSY;

    switch(bSUSubPhase)
    {
    case 0:
        InitFocus();
        if(fDVDDual&&fTOC)
        {
            WrDSP(LGAINSW,0x01);//1a04a02m chane
            //1b02a03j Delay10ms(20);
            bSUSubPhase++;
            fS0=fS1=0;
        }
        else
            bSUSubPhase+=2;
        break;

    case 1:
        TP_BYTE_0=RdStatus(CMD_COMP,200);//lgainsw
        if(TP_BYTE_0==READY)
            bSUSubPhase++;
        else if(TP_BYTE_0==ERROR)
            bSUSubPhase--;
        break;

    case 2:
        LDOn();
        SpindleOn();
        WrDSP(FACTION,0x10);
        if(!fTOC)              //1b02a03j***    
            ibServoSubTimer=30;
        else                   
            ibServoSubTimer=18;//1b02a03j&&&    
        bSUSubPhase++;
        break;
//R1606_COM_01***
    case 3:
        if(!ibServoSubTimer)
        {
//			fAutoAdj=0;
            bSUSubPhase++;
            fS0=fS1=0;
            if(fAutoAdj)
                OffsetAdj();
            else if(fCDRW||(fDVDDual&&(fLayerNumber||!fTOC) ))//1b02a16j
                goto CDRW_RETRY;    
            else
                bSUSubPhase++;
        }
        break;

    case 4:
        if(RdStatus(CMD_COMP,200)!=BUSY)//offset adjust
        {
            if(fCDRW||(fDVDDual&&(fLayerNumber||!fTOC)))//1b02a16j chane
        	{
CDRW_RETRY:        	    
        		WrDSP(FACTION,0x18);	
        		ibServoSubTimer=50;
        		bSUSubPhase++;
        	}
        	else
        	    bSUSubPhase+=2;
        }	    
        break;
	case 5:
		if(!ibServoSubTimer)
        	bSUSubPhase++;
		break;
    case 6:
        if(fCDRW||(fDVDDual&&(fLayerNumber||!fTOC))) //1b02a16j chane
            WrDSP(FACTION,0x14);        
        else        
            WrDSP(FACTION,0x1C);//1a04a02m&&& chane
        if(!fTOC)               //1b02a03j***    
            ibServoSubTimer=70;
        else                    //1b02a03j
            ibServoSubTimer=55; //1b02a03j
        bSUSubPhase++;
        break;

    case 7://R1606_COM_01&&&
        if(RdReg(SVO_STATUS)&FOCUS_OK)
        {
            bSUSubPhase=0;
            status=READY;
        }
        else if(!ibServoSubTimer)
        {
            bSUSubPhase=0;
            status=ERROR;
        }
    }

    return status;
}

/*-----------------------------------------------------------------------------
 Function:  -
 Input:     -
 Output:    -
-----------------------------------------------------------------------------*/
void InitFocus(void)
{
BYTE    ftgr;

    WrReg(PLLEN,0x08);
    WrReg(ACT,0x00);
    WrDSP(PLLSET,0x01);
    WrDSP(CAV_CLV,0x00);
    WrDSP(TSET,0x06);	//0x07
    WrCoeff(TOK,0x0296);

    if(fDVDDisc)
    {
        if(fDVDDual)
            ftgr=dlFTGR;
        else
            ftgr=dFTGR;

        WrDSP(SPEED,0x01);
    }
    else
    {
        if(fCDRW)
            ftgr=cwFTGR;
        else
            ftgr=cFTGR;
        WrDSP(SPEED,0x03);
    }

    if(fTOC)
    {
        SledIn();
        Delay1ms(50);	// 15 ---hanyc
        SledOut();
        Delay1ms(20);	// 15 ---hanyc
    }
    else
    {
        SledOut();
        //Delay1ms(60);			//2423a01j***
        if(fDVDDisc)
        	{
	          if(fDVDDual)
	          {
	               if(!bRetryTimes)
	                         Delay1ms(30);
	               else
	                         Delay1ms(5);
	          }
	          else
	        	Delay1ms(30);
        	}
        else
        {   
        	if(!bRetryTimes)              
            		Delay1ms(10);	//10
        	else        
            		Delay1ms(15);	//15
        } 				//2423a01j&&&
    }
    SledOff();

    WrSSI(FTGR,ftgr);
}

/*-----------------------------------------------------------------------------
 Function:  -
 Input:     -
 Output:    -
-----------------------------------------------------------------------------*/
void InitPA4CD(void)
{
    WrSSI(FCCR,cFCCR);
    WrSSI(FBCR,cFBCR);
    WrSSI(SIGR,cSIGR);
    WrSSI(RFCR,cRFCR);
    WrSSI(FTGR,cFTGR);
    WrSSI(TRCR,cTRCR);
    WrSSI(MRCR,cMRCR);
    WrSSI(CAR,cCAR);
    WrSSI(CBR,cCBR);
    WrSSI(CDR,cCDR);
    WrSSI(CER,cCER);
}

/*-----------------------------------------------------------------------------
 Function:  -
 Input:     -
 Output:    -
-----------------------------------------------------------------------------*/
void InitPA4RW(void)
{
    WrSSI(FCCR,cwFCCR);
    WrSSI(FBCR,cwFBCR);
    WrSSI(SIGR,cwSIGR);
    WrSSI(RFCR,cwRFCR);
    WrSSI(FTGR,cwFTGR);
    WrSSI(TRCR,cwTRCR);
    WrSSI(MRCR,cwMRCR);
    WrSSI(CAR,cwCAR);
    WrSSI(CBR,cwCBR);
    WrSSI(CDR,cwCDR);
    WrSSI(CER,cwCER);
}

/*-----------------------------------------------------------------------------
 Function:  -
 Input:     -
 Output:    -
-----------------------------------------------------------------------------*/
void InitPA4DVD(void)
{
    
    WrSSI(FCCR,dFCCR);
    WrSSI(FBCR,dFBCR);
    WrSSI(SIGR,dSIGR);
    WrSSI(RFCR,dRFCR);
    WrSSI(FTGR,dFTGR);
    WrSSI(TRCR,dTRCR);
    WrSSI(MRCR,dMRCR);
    WrSSI(CAR,dCAR);
    WrSSI(CBR,dCBR);
    WrSSI(CDR,dCDR);
    WrSSI(CER,dCER);
}

/*-----------------------------------------------------------------------------
 Function:  -
 Input:     -
 Output:    -
-----------------------------------------------------------------------------*/
#if HOP3001
void InitPA4ID(void)
{
    WrSSI(FCCR,0x00);
    WrSSI(FBCR,0x00);
    WrSSI(SIGR,0x07);
    WrSSI(RFCR,0xf0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -