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

📄 runin.c

📁 一个完整DVDROM代码(使用日立PICKUP)
💻 C
字号:
/*=============================================================================
* Copyright (C) 2001 Acer Labs, Inc. All Rights Reserved.
*
* File:         RUNIN.C
*
* Contents:     -
*
* History:
*   04/18/2001  develop 5705
******************************************************************************/
#include <reg52.h>
#include "typedef.h"
#include "defs.h"
#include "extern.h"
#include "function.h"
#include "bufalloc.h" //1828a01j
#include "macro.h"
#include "regdef.h"
BYTE idata bBurnInTimes=0;                  //[runin]***

/*-----------------------------------------------------------------------------
 Function:  doing burnin (life test) or gitter measure
 Input:     -
 Output:    -
-----------------------------------------------------------------------------*/
void RuninState(void)
{
	if(!fRuninJ)
    {
        fDisSleep=1;

        if(fMaster)
			BurnIn();
		else
        {   //gitter measure mode
            while(1)
            {
                ChkEject();
                ServoState();
            }
        }
    }
}

/*-----------------------------------------------------------------------------
 Function:  gitter measure mode
 Input:     -
 Output:    -
-----------------------------------------------------------------------------*/
void ChkEject(void)
{
    if(!fDVDDisc && (ibCurrentSpeed!=0x01) && (bServoState==MONITOR_STATE))
    {   //set CD cav 1XS
        SetSpeed(1);
        fDisRdQ=1;
    }

    if(fEjectPressed&&fTOC)
    {
        fEjectPressed=0;
        fTrayDir=~fTrayDir;
        bBOFCount++;
        switch(bBOFCount)
        {
        case 1:
            if(fDVDDisc)
                Seek(0x03,0x01,0x45);
            else
            {
                if(ibCurrentSpeed!=0x04)
                    SetSpeed(4);

                fDisRdQ=0;
                Seek(0x00,0x08,0x3a);
            }
            break;

        case 2:
            if(fDVDDisc)
                Seek(0x0f,0x7f,0x43);
            else
            {
                if(ibCurrentSpeed!=0x04)
                    SetSpeed(4);

                fDisRdQ=0;
                Seek(0x12,0x0a,0x40);
            }
            break;

        case 3:
            if(fDVDDisc)
                Seek(0x25,0x34,0x6c);
            else
            {
                if(ibCurrentSpeed!=0x04)
                    SetSpeed(4);

                fDisRdQ=0;
                Seek(0x2a,0x0d,0x2f);
            }
            break;

        default:
            fEjectPressed=1;
            fTrayDir=~fTrayDir;
            bBOFCount=0;
        }
    }
}

/*-----------------------------------------------------------------------------
 Function:  life test
 Input:     -
 Output:    -
-----------------------------------------------------------------------------*/
void BurnIn(void)
{
BYTE    i;
    switch(bBOFPhase)
    {
    case 0://tray out
        if(bBOFCount)
        {
            if(bServoState==MONITOR_STATE)
            {
                bBOFCount=1;
                bBOFPhase=2;
                return;
            }
            else if(bServoState!=IDLE_STATE)
            {
                iwHostCmdTimer=400;
                return;
            }
            else if(iwHostCmdTimer)
                return;
        }

        for(i=1;i<12;i++)
            bCommandPacket[i]=0;

        bCommandPacket[0]=0x1B;        //ATAPI start stop unit
        bCommandPacket[4]=0x02;        //tray out

        StartStopUnit();
        bBOFPhase=1;
        break;

    case 1://tray in
        if(bBOFCount>10)
        {
            bBOFPhase=0xFF;
            return;
        }
        else if(bServoState!=IDLE_STATE)
        {
            iwHostCmdTimer=400;
        }
        else if(!iwHostCmdTimer)
        {
            for(i=1;i<12;i++)
                bCommandPacket[i]=0;

            bCommandPacket[0]=0x1B;    //ATAPI start stop unit
            bCommandPacket[4]=0x03;    //tray in

            StartStopUnit();
            bBOFCount++;
            bBOFPhase=0;
        }
        break;

    case 2://check sum
        if(bBOFCount%2)
        {
            TP_DWORD_0=((ilLeadOut-200)/2)*(bBOFCount/4)+100;

            for(i=1;i<12;i++)
                bCommandPacket[i]=0;

            bCommandPacket[0]=0x28;
            bCommandPacket[3]=TP_BYTE_1;
            bCommandPacket[4]=TP_BYTE_2;
            bCommandPacket[8]=0x01;
            fRead10Exed=0;
            fReadCDExed=0;
            iwHostCmdTimer=CMD_TIMEOUT;
            Read10();
            bBOFCount++;
        }
        else
        {
            TP_BYTE_0=CheckSum();
            if(TP_BYTE_0==READY)
                bBOFCount++;
            else if(TP_BYTE_0==ERROR)
            {
                while(1)
                {
                    LED=0;
                    Delay10ms(10);
                    LED=1;
                    Delay10ms(10);
                    LED=0;
                    Delay10ms(10);
                    LED=1;
                    Delay10ms(100);
                }
            }
        }

        if(bBOFCount>12)
        {
            bBOFCount=0;
            bBOFPhase=0xFF;
        }
        break;

    case 3://random seek
        TP_DWORD_0+=Q.Min*1127+Q.Sec*Q.Frm*1139+Q.AMin*Q.ASec+Q.AFrm+0x00100000;
        while(TP_DWORD_0>ilLeadOut-100){TP_DWORD_0-=(ilLeadOut-100);}

        for(i=1;i<12;i++)
            bCommandPacket[i]=0;

        bCommandPacket[0]=0x2B;
        bCommandPacket[3]=TP_BYTE_1;
        bCommandPacket[4]=TP_BYTE_2;
        bCommandPacket[5]=TP_BYTE_3;

        iwHostCmdTimer=CMD_TIMEOUT;
        HostSeek();
        bBOFCount++;
        if(bBOFCount>100)
        {
            bBOFCount=0;
            bBOFPhase=0xFF;
        }
        break;

    case 0xFF:
    default:
        break;

    }
}

/*-----------------------------------------------------------------------------
 Function:  -
 Input:     -
 Output:    -
-----------------------------------------------------------------------------*/
BYTE CheckSum(void)
{
    TP_BYTE_0=RdReg(URLSCNT);
    TP_BYTE_1=RdReg(LRLSCNT);
    if(TP_WORD_0>=200)
    {
        if(fDVDDisc)
            return RdDVDChkSum();
        else
            return RdCDChkSum();
    }
    else
        return BUSY;
}

/*-----------------------------------------------------------------------------
 Function:  -
 Input:     -
 Output:    -
-----------------------------------------------------------------------------*/
BYTE RdCDChkSum(void)
{
    TP_WORD_1=0;                        //use for sum of data

    SetAddressReg(4);                   //read from 4~2047
    for(TP_WORD_2=0;TP_WORD_2<1022;TP_WORD_2++)
    {
        RdReg(UP_TRIG);
        while(!(RdReg(UPCTL)&0x01));
        TP_BYTE_0=RdReg(UUPDATA);
        TP_BYTE_1=RdReg(LUPDATA);
        TP_WORD_1+=TP_WORD_0;
    }

    SetAddressReg(CD_PROGRAM_ADDRESS); //1828a01j
    RdReg(UP_TRIG);
    while(!(RdReg(UPCTL)&0x01));
    TP_BYTE_0=RdReg(UUPDATA);
    TP_BYTE_1=RdReg(LUPDATA);
    TP_WORD_1+=TP_WORD_0;

    SetAddressReg(413698);
    RdReg(UP_TRIG);
    while(!(RdReg(UPCTL)&0x01));
    TP_BYTE_0=RdReg(UUPDATA);
    TP_BYTE_1=RdReg(LUPDATA);
    TP_WORD_1+=TP_WORD_0;

    if(!(bBOFCount%4))
        iwLastHIPtr=TP_WORD_1;
    else if(TP_WORD_1!=iwLastHIPtr)
        return ERROR;

    return READY;
}

/*-----------------------------------------------------------------------------
 Function:  -
 Input:     -
 Output:    -
 Note:      1sector = 12row * 172column
-----------------------------------------------------------------------------*/
BYTE RdDVDChkSum(void)
{
    TP_WORD_1=0;                        //use for sum of data
    TP_BYTE_4=0;                        //use for row
    TP_BYTE_5=0;                        //use for column
    TP_BYTE_6=0;                        //use for sector

    WrReg(UPCTL,0x14);
    for(TP_BYTE_6=0;TP_BYTE_6<200;TP_BYTE_6++)
    {
        for(TP_BYTE_4=0;TP_BYTE_4<12;TP_BYTE_4++)
        {
            for(TP_BYTE_5=0;TP_BYTE_5<172;TP_BYTE_5+=2)
            {
                WrReg(UUPPTR,0);        //sector hi
                WrReg(LUPPTR,TP_BYTE_6);//sector lo
                WrReg(UPROW,TP_BYTE_4);
                WrReg(UPCOL,TP_BYTE_5);
                RdReg(UP_TRIG);
                while(!(RdReg(UPCTL)&0x01));

                if(!((TP_BYTE_4==0)&&(TP_BYTE_4<12)) && !((TP_BYTE_4==11)&&(TP_BYTE_5>167)))
                {   //ID IED CPRMAI 12 bytes, EDC 4 bytes
                    TP_BYTE_0=RdReg(UUPDATA);
                    TP_BYTE_1=RdReg(LUPDATA);
                    TP_WORD_1+=TP_WORD_0;
                }
            }
        }
    }

    if(!(bBOFCount%4))
        iwLastHIPtr=TP_WORD_1;
    else if(TP_WORD_1!=iwLastHIPtr)
        return ERROR;

    return READY;
}

⌨️ 快捷键说明

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