📄 discinfo.c
字号:
/*************** MTK CONFIDENTIAL & COPYRIGHTED ****************/
/*************** ****************/
/*************** $Modtime:: 05/06/30 9:12a $ ****************/
/*************** $Revision:: 16 $ ****************/
/*************** ****************/
/*************** Description : Disc Info relative ****************/
/*************** routines used for ****************/
/*************** Channel decoder ****************/
/*************** ****************/
/*************** Company : MediaTek Inc. ****************/
/*************** Programmer : Joseph Lin ****************/
/*************** Yih-Shin Weng ****************/
/**********************************************************************/
#define _C_DISCINFO_
#include "general.h"
#pragma NOAREGS
/***************************************************************************
Function : BIT fgDIReadDiscInfo(void)
Dsecription : Call from :
main();
ATAPIStartStop()
Read TOC when 1.) Reset
2.) New Dis
3.) Start Unit
Read TOC is Done Over Here !!
Also Set Disc Speed !!
Parameter : None
Return : TRUE - read successfully
FALSE - the reading was interrupted
***************************************************************************/
BIT fgDIReadDiscInfo(void)
{
WORD wIdx;
BIT fgSuccess = FALSE;
_fgReadDiscInfo = TRUE; // Servo is Reading Disc Information
_bCDVDStatus = ST_READ_TOC; // reading toc
_bTotalSen = 0; // Reset _bTotalSen
#ifdef VCD_SPEED_ON_M2F2
_bVCDPlaying = FALSE; // VCD playing
#endif
if (fgGetMediaType()) // get DISC type
{
#ifdef SUPPORT_DVDRAM_FAMILY
WriteBLK(RW_NBLK, _wTotalBlk); // Total Block Numbers
WriteBLKC(RW_BCL, _wTotalBlk - 17); // Set Buffer Bound
#endif
if (_fgDiskIsDVD) // DVD
{
ChangeToDVD(); // Change to DVD Mode
_bMaxSpeed = MAX_DVD_SPEED; // Pre-set : Normal Data at Max Speed
WriteDEC(RW_SEEKLMT, DVD_SEEK_LIMIT); // Servo Read Error Sectors Limit
fgSuccess = fgDIBuildDVDTOC(); // Read DVD Lead in area and Build TOC
}
else // CD
{
ChangeToCD(); // Change to CD Mode
_bMaxSpeed = MAX_CD_SPEED; // Pre-set : Normal Data at Max Speed
WriteDEC(RW_SEEKLMT, CD_SEEK_LIMIT); // Servo Read Error Sectors Limit
fgSuccess = fgDIReadTOC(); // Read TOC
DIBuildDiscMap(); // Build Disc Map of Track Format
}
if (!fgSuccess)
{
_bTotalSen = 0;
}
}
if (_bTotalSen) // Disc Present & Read TOC OK
{
if (!_fgDiskIsDVD)
{
// Audio Disc : All Tracks are Audio, No Data Track.
// CD+ Disc : Take As Audio Disc
// ENHANCECD Disc : Take As Audio Disc
wIdx = 6; // Point To TOC Record
// Check For CD+ Disc
if ((_bDiscType != CDI_DISC) && (_bDiscType != CDXA_DISC) &&
((bReadTOCMem(wIdx + 1) & 0x40) == 0))
{
// Reports Data Tracks Included --> Data Tracks After Audio Tracks
if (_fgHaveData)
{
_bMaxSpeed = CDPLUS_SPEED; // CD+ Fixed at 8x Speed
_bDiscType = CDPLUS_DISC;
}
// Hidden Data Track Exists --> Data Tracks Before Audio Tracks
else if ((bReadTOCMem(wIdx + 3) != 0x00) ||
(bReadTOCMem(wIdx + 4) != 0x02) ||
(bReadTOCMem(wIdx + 5) != 0x00))
{
_bMaxSpeed = ENHANCECD_SPEED; // Enhance CD Fixed at 8x Speed
_bDiscType = ENHANCECD_DISC;
}
else
{
_bMaxSpeed = CDDA_SPEED; // CDDA CD
_bDiscType = CDDA_DISC;
}
}
if ((_bDiscType == CDI_DISC) || (_bDiscType == CDXA_DISC))
{
// Save CD-ROM BLOCK LENGTH To System Ram
#ifdef VCD_CDR_SPEED
if (_fgDiskIsCDRW || _fgDiskIsCDR)
{
_bMaxSpeed = VCD_CDR_SPEED; // CD-I & VCD on Lower Speed
}
else
#endif
#ifdef VCD_SPEED_ON_M2F2
_bMaxSpeed = MAX_CD_SPEED; // Keep in CDROM Speed
#else
_bMaxSpeed = VCD_SPEED; // CD-I & VCD on Lower Speed
#endif
}
#ifdef LIMIT_CDRW_SPEED
if (_fgDiskIsCDRW)
{
// Audio Disc, CD PLUS Disc, Enhanced CD
if (_bDiscType & 0xC0)
{
_bMaxSpeed = CDDA_SPEED; // CD-RW Audio at 8x Speed
}
else
{
_bMaxSpeed = CDRW_SPEED; // CD-RW Data at 12x Speed
}
}
#endif
if (_fgHaveAudio)
{
#ifdef SUPPORT_DTS_CD
_fgDTSCD = fgChkDTSCD();
if (_fgDTSCD) // DTS CD or not
{
WriteTOCMem(3, bReadTOCMem(3) | 0x04);
}
#endif
#ifdef SUPPORT_CD_TEXT
GetCDText();
#endif
}
#ifdef SUPPORT_CDI
if ((_bDiscType == CDI_DISC) || (_bDiscType == CDXA_DISC))
{
WriteTOCMem(3, bReadTOCMem(3) | 0x08);
}
#endif
// It can be marked if servo & decoder co-use the same flag _fgMultiSen
// if (_fgMultiSen)
// {
// SRVSetExtraType(EXTRA_MULTI_SESSION); // set extra DISC type
// }
// Reset some variables
_fgPktWrite = FALSE;
_fgMethod2 = FALSE;
}
else // DVD Disc
{
_bDiscType = DVDROM_DISC;
#ifdef SUPPORT_DVDRAM_FAMILY
if (_fgDiskIsDVDRAM)
{
_bDiscType = DVDRAM_DISC;
_bMaxSpeed = (_fgDiskIsDVDRAM2 ?
MAX_RAMV2_SPEED : MAX_RAMV1_SPEED);
}
else
#endif
if (_fgDiskIsDVDR)
{
_bMaxSpeed = MAX_DVDR_SPEED;
}
else if (_fgDiskIsDVDRW)
{
_bMaxSpeed = (_fgDiskIsDVDMRW ?
MAX_DVDMRW_SPEED : MAX_DVDPRW_SPEED);
}
else if (_fgTwoLayer) // Dual-Layer
{
_bMaxSpeed = MAX_TWO_DVD_SPEED;
}
}
if (_fgDiskIsDVD)
{
bLoByte(wIdx) = DT_DVD_DISC;
}
else if (_fgDiskIsCDRW)
{
bLoByte(wIdx) = DT_CDRW_DISC;
}
#ifdef SUPPORT_DVDRAM_FAMILY
else if (_fgDiskIsDVDRAM)
{
bLoByte(wIdx) = DT_DVDRAM_DISC;
}
#endif
else if (_fgDiskIsDVDR)
{
bLoByte(wIdx) = DT_DVDR_DISC;
}
else if (_fgDiskIsDVDRW)
{
bLoByte(wIdx) = DT_DVDRW_DISC;
}
else
{
bLoByte(wIdx) = DT_CDROM_DISC;
}
WriteTOCMem(0, bLoByte(wIdx));
_bOptimumSpeed = _bMaxSpeed; // Initialize Read Init Speed
_fgPause = TRUE;
#ifdef SEEK_ADJUSTABLE
_cSeekOffset = INIT_SEEKOFFSET; // Reset Seek Offset when Disc Changed
#else
_cSeekOffset = FIXED_SEEKOFFSET; // Reset Seek Offset when Disc Changed
#endif
LEDOn(); // Turn On LED When Disc Present
}
else // No Disc
{
#ifdef AUDIO_IN_EN
if (fgIsFuncAin())
{
MSRVFree();
}
else
#endif
{
MSRVStop(); // No Disc, Stop Motor
}
WriteTOCMem(0, DT_NO_DISC); // store disc type
LEDOff(); // Turn Off Ready or Busy LED
// Media Not Present, goto STANDBY mode
// But for player, this can't be done directly
}
_fgSkipSrvStart = FALSE; // Clear _fgSkipSrvStart
_bCDVDStatus = ST_READY; // initial status
_fgReadDiscInfo = FALSE; // Servo is Reading TOC
_wPauseTimer = 0;
return (fgSuccess);
}
/***************************************************************************
Function : BIT fgDIReadTOC(void)
Dsecription : DIReadTOC SUBROUTINES
Unity with hex format expect CONTROL_ADDRESS field
OUTPUT : READ TOC DATA AND SETUP IN MEMORY
CALL BY : DIReadDiscInfo() ONLY !!
Parameter : None
Return : TRUE - read successfully
FALSE - the reading was interrupted
***************************************************************************/
// Reads the whole TOC Data from Servo to the TOC memory.
BIT fgDIReadTOC(void)
{
WORD wIdx;
_fgHaveAudio = FALSE; // No Audio Track
_fgHaveData = FALSE; // No Data Track
_fgMultiSen = FALSE; // Default NOT Multi-Session
wIdx = 6; // Track Index Pointer
_bTotalSen = 1; // First Session
#ifdef SUPPORT_DACD
_dMaxLBA = 150;
#endif
_dPrevSessAddr = 0;
wIdx = wReadTOC(wIdx); // Reads TOC
if (_fgAbort)
{
wIdx = 6; // Points to Head of TOC Table
_bTotalSen = 0; // TOC is Invalid
_fgMultiSen = FALSE; // Ignore Any Subsequent Session
_bPlayerStatus = PLAYER_READY;
}
if (_bPlayerStatus != PLAYER_READY)
{
wIdx = 6; // Track Index Pointer
_bTotalSen = 1; // First Session
wIdx = wReadTOC(wIdx); // Read Once More if Read Failed
if ((_bPlayerStatus != PLAYER_READY) || (_fgAbort))
{
wIdx = 6; // Points to Head of TOC Table
_bTotalSen = 0; // TOC is Invalid
}
}
while (_testbit_(_fgMultiSen)) // Multi-Session
{
_bTotalSen++; // Next Session
wIdx = wReadTOC(wIdx); // Reads TOC of Next Session
if (_bPlayerStatus != PLAYER_READY)
{
_bTotalSen--; // Abandon This Session
break;
}
if (_fgAbort)
{
wIdx = 6; // Points to Head of TOC Table
_bTotalSen = 0; // TOC is Invalid
_fgMultiSen = FALSE; // Ignore Any Subsequent Session
}
}
if (_bTotalSen > 1)
{
_fgMultiSen = TRUE;
}
else
{
_fgMultiSen = FALSE; // Ignore Any Subsequent Session
}
// Total Track Count
WriteTOCMem(1, _bLastTNo - _bFirstTNo + 1);
WriteTOCMem(2, _bTotalSen); // Total Session Count
// ATE and DTE bits
bLoByte(wIdx) = (_fgHaveAudio? 2:0) + (_fgHaveData? 1:0);
WriteTOCMem(3, bLoByte(wIdx));
return (!_fgAbort);
}
// Disc Key Addresses
WORD code pwDiscKeyAddr[10] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004,
0x026C, 0x026D, 0x026E, 0x026F, 0x0270
};
#ifdef SUPPORT_DVD_AUDIO
// CPPM Key Address
WORD code pwCPPMKeyAddr[8] = {
0x0050, 0x0051, 0x0052, 0x0053,
0x0054, 0x0055, 0x0056, 0x0057
};
#endif
/***************************************************************************
Function : BIT fgDIBuildDVDTOC(void)
Dsecription : Build a DVD Lead In Area Table
Parameter : None
Return : TRUE - read successfully
FALSE - the reading was interrupted
***************************************************************************/
BIT fgDIBuildDVDTOC(void)
{
BYTE bCnt, _bEmptyFlag ;
WORD wBAddr;
#if 1 // VCPS_SUPPORT
BYTE bVcpsDisc;
#endif
_fgHaveAudio = FALSE; // No Audio Track
_fgHaveData = FALSE; // No Data Track
_fgMultiSen = FALSE; // Default NOT Multi-Session
_bTotalSen = 1; // First Session
_bVRDiscFlag = _bEmptyFlag = FALSE; //
_bSeekLayer = SEEK_LAYER0; // Read Lead in at layer0
/* Jacob: init the data offset */
_dwDataAreaOfst = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -