📄 servo.c
字号:
/*=============================================================================
* 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 + -