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