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

📄 servo.c

📁 车载电子影音系统dvd播放系统原程序代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    __bCurrentIF=BITSTREAM_CDIF ;
    __bServoAutoCtrl=FALSE;
    __dwTimeTorelence = 5 ;             // TCC171

    __bSERVOErrMsg = SERVO_ERROR_CMD ;
        
        
#ifdef  SUPPORT_DVD_T //Kevin1.24aDVD_T, restore TOC in INITIAL_PowerONStatus() (SERVO_Seek() will not read multisession TOC) 
    if (__bReduceSTBtoDVDtime) 
    {
        W99AV_RestoreTOC();  
        return TRUE;
    }
#endif //#ifdef  SUPPORT_DVD_T        
        
        
    //UDE_ClearPacket () ; //LJY2.31, remove UDE_ClearPacket
    aPacket[0] = 0x01;  // paramater length is 1
    aPacket[1] = UDE_COMMAND_GETTOC ;     //UDE : GetTOC Command
    aPacket[2] = 0xff;  // paramater

    UDE_SendPacket ((aPacket+1)) ;
    // LJY275, for multi-session begin
    do{
        
        bSession_end = 0x00;
        // TCC276, timeout for TOC, need to be 10s here if last session isn't closed.
        _dwTimeOut = UDE_TIMEOUT_READTOC ;           
        // RXD data: Command_Acknowledge (0x8?, ?:UDE return number)
        bRxd=UDE_WaitCmdFinish();
        bNum=bRxd & 0x7f;
        if(!(bRxd & 0x80))      // jyliu 1016
        {
#ifdef SUPPORT_PRINTF      
            printf("TOC_Cmd_Ack_Err (%x)",bRxd);
#endif        
            if(bRxd == 0x5A) 
                break;
            else 
                goto GO_ERROR;
        }
        bLength = bNum;
#ifdef SUPPORT_PRINTF    
        printf("\nTOC_Num_of_Entries: %x (%x,%x)",bLength,_bUDEData[0],_bUDEData[1]);
#endif
        for (bNum=0; bNum < bLength ; bNum++)
        {
            _dwTimeOut = UDE_TIMEOUT_READTOC ;           // TCC276, this place need long or 99 tracks will fail.
            // RXD data: Command_Acknowledge (0x8?, ?:UDE return number)
            _bSERVOTmp2=UDE_WaitCmdFinish();
            if (_bSERVOTmp2 != 0x85)
            {
#ifdef SUPPORT_PRINTF          
                printf("TOC_Struct_Cmd_Ack_Length_Err (%x)",_bSERVOTmp2);
#endif
                goto GO_ERROR;
            }
//            _bSERVOTmp2 &= 0x7f;
            //Read UDE return Value (Num of TOC Entries)
            _dwTimeOut = UDE_TIMEOUT_NORMAL ;            // TCC276, timeout for result code
            if (!UDE_ReadData(_bUDEData, 5))
            {
#ifdef SUPPORT_PRINTF          
                printf("\nTOC_Struct_Cmd_Return_Err");
#endif             
            }
        
            if (_bUDEData[1] <= 99)
            {
//LJY1.00, share TOC buffer with servo
#ifndef TOC_SHARE
                bRxd = _bUDEData[1] - 1 ;
                _trk_TOC[bRxd].Ctl = _bUDEData[0] ;
                _trk_TOC[bRxd].Trk = _bUDEData[1] ;
                _trk_TOC[bRxd].Min = _bUDEData[2] ;
                _trk_TOC[bRxd].Sec = _bUDEData[3] ;
                _trk_TOC[bRxd].Frm = _bUDEData[4] ;
#endif

#ifdef SUPPORT_PRINTF    
		bRxd = _bUDEData[1] - 1 ;  //LJY1.00, for showing TOC        
                printf ("\n[Track: %u], [Ctrl: %u], [Min: %u], [Sec: %u], [Frm: %u]", _trk_TOC[bRxd].Trk, _trk_TOC[bRxd].Ctl, 
                _trk_TOC[bRxd].Min, _trk_TOC[bRxd].Sec, _trk_TOC[bRxd].Frm) ;
#endif              
                if(bTrackLastSession == _bUDEData[1])
///                    __dwSectorLastSession = _MSFtoHSG (_bUDEData[2], _bUDEData[3], _bUDEData[4]);
                    __dwSectorLastSession = COMUTL_MSFtoHSG ( MAKE_MSF(_bUDEData[2], _bUDEData[3], _bUDEData[4])) ;
            }
            else if (_bUDEData[1] == 0xA0)
            {
                bTrackLastSession = _bUDEData[2];
                _bLastSession = _bUDEData[4];
                if((_bLastSession > 99) ||(_bLastSession== 0)) 
                    _bLastSession = 1;
                _sessioninfo_TOC [_bLastSession-1].bFirstTrack = _bUDEData[2];
                if(_bUDEData[4] == 1) 
                    _bFirstTrack = _bUDEData [2] ;
                // TCC276, get disc type here
                switch ( _bUDEData[3] )
                {
                    case 00:
                        _bSERVODiscType = DISC_TYPE_CDDA;
                        break;
                    case 10:
                        _bSERVODiscType = DISC_TYPE_CDI;
                        break;
                    case 20:
                        _bSERVODiscType = DISC_TYPE_VCD;
                        break;
                    default:
                        break;
                }   // switch
            }
            else if (_bUDEData[1] == 0xA1)
            {
                bSession_end = _bUDEData[4];
                _sessioninfo_TOC [_bLastSession-1].bLastTrack = _bUDEData[2];
                _bLastTrack = _bUDEData [2] ;
            }
            else if (_bUDEData[1] == 0xA2)
            {
///                _sessioninfo_TOC [_bLastSession-1].dwLeadOutPos = _MSFtoHSG (_bUDEData[2], _bUDEData[3], _bUDEData[4]);
                _sessioninfo_TOC [_bLastSession-1].dwLeadOutPos = COMUTL_MSFtoHSG ( MAKE_MSF(_bUDEData[2], _bUDEData[3], _bUDEData[4])) ;
            }   
        }
    }while(bSession_end != 0xFF);
    _dwTimeOut = UDE_TIMEOUT_NORMAL ;            // TCC276, timeout for result code
    // RXD data: Result_Code (0x00)
    _bSERVOTmp2=UDE_WaitCmdFinish();
    if (_bSERVOTmp2 != 0x00)
    {
#ifdef SUPPORT_PRINTF       
        printf("\nTOC_Cmd_Result_Err (%x)",_bSERVOTmp2);
#endif        
        goto GO_ERROR;
    }
    __bSERVOErrMsg = SERVO_ERROR_NONE ;
//    if (_trk_TOC[0].Ctl == 0x01)   // CDDA
    if (_bSERVODiscType != DISC_TYPE_CDI)
    {
        if (!(_trk_TOC[0].Ctl & 0x40))   // TCC173, treat non-DATA 1st track as CDDA
        {
            _bSERVODiscType = DISC_TYPE_CDDA ;
        }
        // wyc.279-3, when TOC return CDDA but track1 is data, F/W will directly change disc type to VCD type.
        else
        {
            if (_bSERVODiscType == DISC_TYPE_CDDA)
                _bSERVODiscType = DISC_TYPE_VCD;
        }
    }
#ifdef  SUPPORT_DVD_T
    //Kevin1.24a, must backup TOC immediately after TOC is read, 'cause _sessioninfo_TOC & _trk_TOC memory is shared with file manager user data via __bPool
    W99AV_BackupTOC();
#endif
    return TRUE;
    
GO_ERROR:
    
    return ERROR;
}

// ***********************************************************************
//  Function    :   SERVO_Stop
//  Description :   Used to stop the dvd-rom
//  Arguments   :   None.
//  Return      :   TRUE/FALSE
//  Side Effect :
// ***********************************************************************
BIT  SERVO_Stop()
{
    gbServoRunning = FALSE ;
    //  TCC041, for RAITE/Mediatek stop->play has problem
    if (!__btPowerDown)
        return TRUE ;

    // TCC104, must wait stable for stop command to take effect.
    //LJY1.05, no need to wait stable for power-down, servo will close tray automatically.
    //    _WaitStable (WAITSTABLE_NOT_SHOW_INFO) ;
    #ifdef YHTANG_DEBUG
		_printf("\n servo.c do servo stop");
    #endif
    // TCC170, let atapi enter stop mode.
    SERVO_PowerMode (SERVO_POWER_STOP) ;

    return TRUE ;
}

// ***********************************************************************
//  Function    :   SERVO_PowerMode
//  Description :   Used to let cd/dvd-rom enter power down mode
//  Arguments   :   bMode :
//                  SERVO_POWER_STOP : Enter stop state
//                  SERVO_POWER_IDLE : Enter idle state
//                  SERVO_POWER_STANDBY : Enter standby mode
//                  SERVO_POWER_SLEEP : Enter sleep mode
//  Return      :   TRUE/FALSE
//  Side Effect :
// ***********************************************************************
BIT SERVO_PowerMode (BYTE bMode)
{
    // TCC274j, 420 doesn't support start command yet
    if (bMode == SERVO_POWER_START)
        return TRUE ;
        
    // TCC274, power management command support
    // W99420 now support stop and sleep mode.
    //UDE_ClearPacket () ; //LJY2.31, remove UDE_ClearPacket
    aPacket[0] = 0x01 ;    // one paramater
    aPacket[1] = UDE_COMMAND_POWERMANAGEMENT ;    // power mode
    if (bMode == SERVO_POWER_SLEEP)
        aPacket[2] = 0x01 ;     // enter sleep mode
    else
        aPacket[2] = 0x00 ;     // enter stop mode
                
    if (UDE_SendUDECmd(aPacket) != TRUE)
         return ERROR;
    return TRUE ;
}

// LJY275e
// ***********************************************************************
//  Function    :   SERVO_GetServoDebugInfo
//  Description :   Used to get servo debug information
//  Arguments   :   None
//  Return      :   version number
//  Side Effect :
// ***********************************************************************
BIT SERVO_GetServoDebugInfo (BYTE bItem, WORD wAddr, WORD wData)
{
    //UDE_ClearPacket () ; //LJY2.31, remove UDE_ClearPacket

    if(bItem > 99) 
        return ERROR;
    aPacket[1] = UDE_COMMAND_GETSERVODEBUGINFO;
    switch(bItem)
    {
        case GET_FW_VERSION:
            aPacket[0] = 0x01;    // 1 paramater
            aPacket[1] = UDE_COMMAND_GETSERVOINFO;
            aPacket[2] = GETFWVERSION;
            if (!UDE_SendUDECmd (aPacket)) 
                return ERROR;
            else
            {
                //LJY1.07, per D500 Andy's request
                /*
                COMUTL_BYTE2HexStr((__bMsgString+6), _bUDEData[0]);   // Andy test
                COMUTL_BYTE2HexStr((__bMsgString+8), _bUDEData[1]);   // Andy test
                COMUTL_BYTE2HexStr((__bMsgString+10), _bUDEData[2]);  // Andy test
                COMUTL_BYTE2HexStr((__bMsgString+12), _bUDEData[3]);  // Andy test
                */
                //LJY1.26, per 05262004 servo code
                COMUTL_BYTE2HexStr((__bMsgString+0), _bUDEData[0]);   // Andy test
                COMUTL_BYTE2HexStr((__bMsgString+3), _bUDEData[1]);   // Andy test
                COMUTL_BYTE2HexStr((__bMsgString+5), _bUDEData[2]);   // Andy test
                COMUTL_BYTE2HexStr((__bMsgString+7), _bUDEData[3]);  // Andy test
                COMUTL_BYTE2HexStr((__bMsgString+9), _bUDEData[4]);  // Andy test
                COMUTL_BYTE2HexStr((__bMsgString+11), _bUDEData[5]);  // Andy test  // CCY, test                
                
            }
            break;
        case READ_420_REG:
        case READ_3721_REG:
                aPacket[0] = 0x03;    // 3 paramaters
                aPacket[2] = bItem+SERVO_CMD_OFFSET;
                aPacket[3] = HIBYTE(wAddr);
                aPacket[4] = LOBYTE(wAddr);
                if (!UDE_SendUDECmd (aPacket)) 
                    return ERROR;
                else
                {
                    COMUTL_BYTE2HexStr((__bMsgString+10), _bUDEData[0]);   // Andy test
                    COMUTL_BYTE2HexStr((__bMsgString+12), _bUDEData[1]);   // Andy test
                }
                break;
        case WRITE_420_REG:
        case WRITE_3721_REG:
                aPacket[0] = 0x05;    // 5 paramaters
                aPacket[2] = bItem+SERVO_CMD_OFFSET;
                aPacket[3] = HIBYTE(wAddr);
                aPacket[4] = LOBYTE(wAddr);
                aPacket[5] = HIBYTE(wData);
                aPacket[6] = LOBYTE(wData);       
                if (!UDE_SendUDECmd (aPacket)) 
                    return ERROR;
                else 
                //LJY2.31,use CT_strcpy to replace strcpy to reduce code size
                    CT_strcpy ((char *)__bMsgString, "Written..."); 
                break;
        case DEBUG_PIPO:
        case GET_PIPO:
                // Andy test start
                aPacket[0] = 0x03;    // 3 paramaters
                aPacket[2] = bItem+SERVO_CMD_OFFSET;
                aPacket[3] = HIBYTE(wAddr);
                aPacket[4] = LOBYTE(wAddr);
                if (!UDE_SendUDECmd (aPacket)) 
                    return ERROR;
                else
                {
                    __bMsgString[12] = 'O';
                    __bMsgString[13] = 'K';
                }
                // Andy test end
                break;
        default:
            if(bItem > 0x3F) 
                return ERROR;
            aPacket[0] = 0x01;    // 1 paramater
            aPacket[2] = bItem+SERVO_CMD_OFFSET;
            if(UDE_SendUDECmd (aPacket))
                {
                    __bMsgString[12] = 'O';   // Andy test
                    __bMsgString[13] = 'K';   // Andy test
                }
            else
                {
                    __bMsgString[11] = 'E';   // Andy test
                    __bMsgString[12] = 'R';   // Andy test
                    __bMsgString[13] = 'R';   // Andy test
                }
            break;          
    }
    return TRUE;
}

// ***********************************************************************
//  Function    :   SERVO_ReadSectors
//  Description :   Used to set the range of the sectors you want to read
//  Arguments   :   None.
//  Return      :   TRUE/FALSE
//  Side Effect :
// ***********************************************************************
BIT SERVO_ReadSectors(DWORD dwStartPos, DWORD dwEndPos)
{
    if ( ! SERVO_SetSectors ( dwStartPos, dwEndPos ) )  // ** TCH0.27;
        return FALSE;

    // ** DVD-TCH0.20;
    if ( SERVO_Monitor () )
        return TRUE;

    return  SERVO_Monitor ();  // Try One more
    // ** DVD-TCH0.20;
}

// **********************************************************
// ** TCH0.27; begin...
//  *********************************************************************

⌨️ 快捷键说明

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