📄 mass_fscompat.c
字号:
#include "tcc730.h"
#include "SMC.H"
#include "SMC_FS.H"
#include "SMC_FILE.H"
#if defined(MMC_INCLUDE)
#include "mmc_fs.h"
#include "mmc_io.h"
#endif
#if defined(DEBUG) || defined(MMC_DEBUG)
#include "mmc_debug.h"
#endif
#include "filesystem.h"
#include "mass_common.h"
#include "GENLIB.H"
///////////////////////////////////////////////////////////////////////////////
#if defined(DEBUG) || defined(MMC_DEBUG)
#define STATIC
#else
#define STATIC static
#endif
#ifndef UNREFERENCED_PARAMETER
#define UNREFERENCED_PARAMETER(__param) ((__param) = (__param))
#endif
#if !defined(__MMC_DEBUG_H__)
// defined in "mmc_debug.h"
#define MMC_ASSERT(__expr)
#define MMC_BREAK()
#define MMC_BREAK_EX(__expr)
#endif
///////////////////////////////////////////////////////////////////////////////
#pragma memory=data_seg(TCC730_INTERNAL)
unsigned char eSmErr;
unsigned char drv_no;
uword SpBlock = 0;
uword SpCluster = 0;
int g_ActiveDrive = 0;
int g_nCoderHandle = 0;
static TCC73_LCD_Display_Handler g_FormatCallback = 0;
TypeFileInfo FileInfo;
TypeDriveInfoBox DrvInfo[MAX_DRIVE];
ubyte gTempBuf[528];
ubyte gTempBuf2[512];
#pragma memory=default
//=============================================================================
//=
//= Filsystem Commmon Routine For MMC
//=
//=============================================================================
#if defined(MMC_INCLUDE)
int TCC730_MMC_ConvertErrorCode(int nMMCErrCode);
int TCC730_MMC_ReadIdTag3 (int nIndex, MPX_IDTAG3_INFO* lpIdTag3Info, MPX_TYPE_INFO* lpTypeInfo);
int TCC730_MMC_DecoderInit (int* lpnHandle, int nFileIndex, int nMode, unsigned long dwBufferStart);
int TCC730_MMC_MoveToDecoder(int nHandle,
unsigned long dwMoveCount,
int nMode,
unsigned long dwBufferStart,
unsigned long dwBufferEnd,
MMC_BOOL bResetBuffer,
volatile unsigned long* lpdwWritePtr,
volatile unsigned int* lpnReadCountPtr);
int TCC730_MMC_ReadOnePage (int nHandle, void* lpPageBuffer, void* lpBuffer);
int TCC730_MMC_EncoderInit (CONST_FAKE char lpszName[8],
CONST_FAKE char lpszExt[3],
int* lpnHandle,
unsigned long dwBufferStart);
int TCC730_MMC_MoveFromEncoder(int nHandle, unsigned long dwMoveCount, MMC_BOOL bSilent);
int TCC730_MMC_EncoderClose (int nHandle);
int TCC730_MMC_GetEncodeFileNum(int* lpnFileNum);
#endif
//=============================================================================
//=
//= Filsystem Commmon Routine For SMC Media
//=
//=============================================================================
int TCC730_SMC_ConvertErrorCode( int nSMCErrCode );
//=============================================================================
//=
//= Filsystem Commmon Error Definition
//=
//=============================================================================
typedef struct
{
int nMediaErr;
int nFileSysErr;
} COMPAT_ERROR;
#if defined(MMC_INCLUDE)
static const COMPAT_ERROR MMCErrCodeMap[20] = {
{MMC_ERR_UNKNOWN, ERR_INTERNAL},
{MMC_ERR_INVALID_FILESYS, ERR_INVALID_MBR},
{MMC_ERR_ILLEGAL_COMMAND, ERR_INVALID_PARAM},
{MMC_ERR_COMMAND_CRC, ERR_ECC},
{MMC_ERR_PARAM, ERR_INVALID_PARAM},
{MMC_ERR_DATA_CRC, ERR_ECC},
{MMC_ERR_PROTECT, ERR_LOCKED},
{MMC_ERR_INVALID_CARD, ERR_CARD_NOT_DETECTED},
{MMC_ERR_IO, ERR_FLASH_STATUS},
{MMC_ERR_HANDLE_EXHAUST, ERR_FILE_OPENED},
{MMC_ERR_ENTRY_EXHAUST, ERR_NO_EMPTY_ENTRY},
{MMC_ERR_PARAMETER, ERR_INVALID_PARAM},
{MMC_ERR_FILE_NOT_FOUND, ERR_FILE_NOT_EXIST},
{MMC_ERR_FILE_ALREADY_EXIST, ERR_FILE_EXIST},
{MMC_ERR_EOF, ERR_EOF},
{MMC_ERR_READONLY, ERR_NOT_PERMITTED},
{MMC_ERR_UNSUPPORT, ERR_INVALID_PARAM},
{MMC_ERR_DISKFULL, ERR_OUT_OF_MEMORY},
{MMC_ERR_OUTOF_RULE, ERR_INVALID_PARAM},
{0, ERR_INTERNAL}
};
#endif
static const COMPAT_ERROR SMCErrCodeMap[20] = {
{SMC_ERR_UNKNOWN, ERR_INTERNAL},
{SMC_ERR_INVALID_FILESYS, ERR_INVALID_MBR},
{SMC_ERR_ILLEGAL_COMMAND, ERR_INVALID_PARAM},
{SMC_ERR_COMMAND_CRC, ERR_ECC},
{SMC_ERR_PARAM, ERR_INVALID_PARAM},
{SMC_ERR_DATA_CRC, ERR_ECC},
{SMC_ERR_PROTECT, ERR_LOCKED},
{SMC_ERR_INVALID_CARD, ERR_CARD_NOT_DETECTED},
{SMC_ERR_IO, ERR_FLASH_STATUS},
{SMC_ERR_HANDLE_EXHAUST, ERR_FILE_OPENED},
{SMC_ERR_ENTRY_EXHAUST, ERR_NO_EMPTY_ENTRY},
{SMC_ERR_PARAMETER, ERR_INVALID_PARAM},
{SMC_ERR_FILE_NOT_FOUND, ERR_FILE_NOT_EXIST},
{SMC_ERR_FILE_ALREADY_EXIST, ERR_FILE_EXIST},
{SMC_ERR_EOF, ERR_EOF},
{SMC_ERR_READONLY, ERR_NOT_PERMITTED},
{SMC_ERR_UNSUPPORT, ERR_INVALID_PARAM},
{SMC_ERR_DISKFULL, ERR_OUT_OF_MEMORY},
{SMC_ERR_OUTOF_RULE, ERR_INVALID_PARAM},
{0, ERR_INTERNAL}
};
/*************************************************************************************
*
*
*
* FILESYSTEM FUNCTION Combinded NFL+MMC or NFL+SMC FS Driver
*
*
*
*************************************************************************************/
void TCC730_InitialDriveInfo(uword drive)
{
TCC730_ZeroMemory(&DrvInfo[drive], sizeof(DrvInfo[0]));
if ( drive == DRIVE_NFL ) SMC_DRV_Init();
#if defined(MMC_INCLUDE)
if ( drive == DRIVE_MMC ) TCC730_MMC_InitPort();
#else
if ( drive == DRIVE_SMC ) SMC_DRV_Init();
#endif
}
void TCC730_UpdateInfo(uword drive)
{
unsigned long FreeSizeSector;
unsigned long UsedSizeSector;
unsigned int wDataSave;
wDataSave = PLL0DATA; // Format Speed Up
PLL0DATA = (2443 - 2) << 2; // 80MHz
PLL0CON = 5;
while ( !(PLL0CON&0x02) ) {;}; // Wait until PLLO lock detect signal
switch(drive)
{
#if defined(MMC_INCLUDE)
case DRIVE_MMC : DrvInfo[drive].TotalBlockNum = TCC730_MMC_GetDiskSectors()/32;
DrvInfo[drive].UseBlockNum = TCC730_MMC_GetDiskUsedSectors(gTempBuf)/32;
DrvInfo[drive].TotalFileNum = TCC730_MMC_GetTotalFileNum(gTempBuf);
break;
#else
case DRIVE_SMC :
#endif
case DRIVE_NFL : SMC_FS_GetFreeAndUsedSectorSize( drive,&FreeSizeSector,&UsedSizeSector,gTempBuf );
DrvInfo[drive].TotalBlockNum = (FreeSizeSector+UsedSizeSector)/32;
DrvInfo[drive].UseBlockNum = UsedSizeSector/32;
DrvInfo[drive].TotalFileNum = SMC_MPX_GetTotalFileNum(drive,gTempBuf);
break;
default : ;
}
PLL0DATA = wDataSave;
PLL0CON = 5;
while ( !(PLL0CON&0x02) ) {;}; // Wait until PLLO lock detect signal
}
//=============================================================================
// The FileSys Initialize function was abused at prevous version
// So, ResetFileSystem() function newly created
// Added by Jincheol Hong, 2002/10/09
//=============================================================================
int TCC730_ResetFileSystem(uword drive)
{
int nErr;
switch(drive)
{
#if defined(MMC_INCLUDE)
case DRIVE_MMC : nErr = TCC730_MMC_InitFileSystem(gTempBuf);
if (nErr != MMC_ERR_IO) DrvInfo[drive].IO_flag = INITIALIZED;
if (nErr != 0) return TCC730_MMC_ConvertErrorCode(nErr);
DrvInfo[drive].FAT_flag = INITIALIZED;
TCC730_UpdateInfo(drive);
break;
#else
case DRIVE_SMC :
#endif
case DRIVE_NFL : nErr = SMC_MPX_InitFileSystem(drive,gTempBuf);
if ( nErr != SMC_ERR_IO ) DrvInfo[drive].IO_flag = INITIALIZED;
if (nErr != 0) return TCC730_SMC_ConvertErrorCode(nErr);
DrvInfo[drive].FAT_flag = INITIALIZED;
TCC730_UpdateInfo(drive);
break;
default : return ERR_CARD_NOT_DETECTED;
}
return SM_OK;
}
ubyte TCC730_FILE_SYSTEM_Init(uword drive)
{
int nErr;
switch(drive)
{
#if defined(MMC_INCLUDE)
case DRIVE_MMC : if (DrvInfo[drive].IO_flag != INITIALIZED)
{
if ( (nErr=TCC730_ResetFileSystem((int)drive)) != SM_OK ) return (ubyte)nErr;
}
else TCC730_UpdateInfo(drive);
break;
#else
case DRIVE_SMC :
#endif
case DRIVE_NFL : if (DrvInfo[drive].IO_flag != INITIALIZED)
{
if ( (nErr=TCC730_ResetFileSystem((int)drive)) != SM_OK ) return (ubyte)nErr;
}
else TCC730_UpdateInfo(drive);
break;
default : return ERR_CARD_NOT_DETECTED;
}
return SM_OK;
}
ubyte File_Close(void)
{
#if defined(MMC_INCLUDE)
MMC_FILE_HANDLE_INFO MMC_fhi;
#endif
int nTempHandle;
nTempHandle = g_nCoderHandle;
switch(g_ActiveDrive)
{
#if defined(MMC_INCLUDE)
case DRIVE_MMC : g_nCoderHandle = -1;
if (nTempHandle > 0 && TCC730_MMC_GetOpenFileInfo(nTempHandle, &MMC_fhi) != 0)
break;
if ((MMC_fhi.nFlags & MMC_FILE_FLAG_CREATED) && MMC_fhi.dwFileSize == 0)
{
TCC730_MMC_DeleteOpenFile(nTempHandle, gTempBuf);
MMC_ASSERT(DrvInfo[DRIVE_MMC].TotalFileNum > 0);
if (DrvInfo[DRIVE_MMC].TotalFileNum > 0)
DrvInfo[DRIVE_MMC].TotalFileNum--;
}
else
{
TCC730_MMC_CloseFile(nTempHandle, gTempBuf);
}
break;
#else
case DRIVE_SMC :
#endif
case DRIVE_NFL : if ( SMC_FILE_GetSizeFile( g_nCoderHandle ) == 0 )
{
if (DrvInfo[DRIVE_NFL].TotalFileNum > 0) --DrvInfo[DRIVE_NFL].TotalFileNum;
}
SMC_MPX_CloseFile( g_nCoderHandle,gTempBuf );
g_nCoderHandle = -1;
break;
default : return ERR_CARD_NOT_DETECTED;
}
return SM_OK;
}
ubyte Get_File_Info(uword drive, uword index, TypeFileInfo* lpInfo)
{
SMC_FILE_INFO SMC_fi;
#if defined(MMC_INCLUDE)
MMC_FILE_INFO MMC_fi;
#endif
switch(drive)
{
#if defined(MMC_INCLUDE)
case DRIVE_MMC : if (TCC730_MMC_GetFileInfoByIndex( index,&MMC_fi,gTempBuf ) != MMC_ERR_NOERROR) return ERR_FILE_NOT_EXIST;
lpInfo->Size.nWord[0] = (SWAP32(MMC_fi.entry.dwFileSize) & 0xffff0000) >> 16;
lpInfo->Size.nWord[1] = (SWAP32(MMC_fi.entry.dwFileSize) & 0x0000ffff);
lpInfo->Cluster = SWAP16(MMC_fi.entry.wStartClusterLo);
lpInfo->Attr = MMC_fi.entry.bAttrib;
TCC730_CopyMemory( lpInfo->Name, &MMC_fi.entry.szShortName[0],8 );
TCC730_CopyMemory( lpInfo->Ext, &MMC_fi.entry.szShortName[8],3 );
lpInfo->Time = 0;
lpInfo->Date = 0;
if (lpInfo->Name[0] == 0x05)
lpInfo->Name[0] = (char)0xe5;
break;
#else
case DRIVE_SMC :
#endif
case DRIVE_NFL : if ( SMC_MPX_GetFileInfoByIndex( drive,index,&SMC_fi,gTempBuf ) != SMC_ERR_NOERROR) return ERR_FILE_NOT_EXIST;
lpInfo->Size.nWord[0] = ( SMC_fi.Entry.FileSize & 0xffff0000 ) >> 16;
lpInfo->Size.nWord[1] = ( SMC_fi.Entry.FileSize & 0x0000ffff );
lpInfo->Cluster = SMC_fi.FstClus;
lpInfo->Attr = SMC_fi.Entry.Attrib;
TCC730_CopyMemory( lpInfo->Name, &SMC_fi.Entry.ShortName[0],8 );
TCC730_CopyMemory( lpInfo->Ext, &SMC_fi.Entry.ShortName[8],3 );
lpInfo->Time = 0;
lpInfo->Date = 0;
break;
default : return ERR_CARD_NOT_DETECTED;
}
return SM_OK;
}
ubyte TCC730_ReadIDTag3(uword drive,uword file_index)
{
MPX_IDTAG3_INFO idtag3;
MPX_TYPE_INFO type;
int nError;
unsigned int wDataSave;
wDataSave = PLL0DATA; // Format Speed Up
PLL0DATA = (1953 - 2) << 2; // 64MHz
PLL0CON = 5;
while ( !(PLL0CON&0x02) ) {;}; // Wait until PLLO lock detect signal
FileInfo.IDTAG_Flag = 0;
TCC730_ZeroMemory(FileInfo.Title, 30);
TCC730_ZeroMemory(FileInfo.Artist, 30);
TCC730_ZeroMemory(FileInfo.Album, 30);
TCC730_ZeroMemory(FileInfo.Year, 4);
TCC730_ZeroMemory(FileInfo.Comment, 30);
FileInfo.Genre = 0;
idtag3.lpszTitle = FileInfo.Title;
idtag3.lpszArtist = FileInfo.Artist;
idtag3.lpszAlbum = FileInfo.Album;
idtag3.lpszYear = FileInfo.Year;
idtag3.lpszComment = FileInfo.Comment;
switch(drive)
{
#if defined(MMC_INCLUDE)
case DRIVE_MMC :
nError = TCC730_MMC_ReadIdTag3(file_index, &idtag3, &type);
if (nError != 0)
nError = TCC730_MMC_ConvertErrorCode(nError);
break;
#else
case DRIVE_SMC :
#endif
case DRIVE_NFL :
nError = SMC_MPX_ReadIdTag3( drive,file_index,&idtag3,&type );
if (nError != 0)
nError = TCC730_SMC_ConvertErrorCode(nError);
break;
default :
nError = SM_OK;
}
FileInfo.IDTAG_Flag = (unsigned char)idtag3.nFlags;
FileInfo.Genre = (unsigned char)idtag3.nGenre;
FileInfo.Type = type.nType;
FileInfo.Frame_Header = type.dwFrameHeader;
// FileInfo.MPEG_Version = type.nMpegVer;
// FileInfo.Layer = type.nLayer;
// FileInfo.Bit_Rate = type.nBitrate;
// FileInfo.Sampling_Freq = type.nSamplingFreq;
PLL0DATA = wDataSave;
PLL0CON = 5;
while ( !(PLL0CON&0x02) ) {;}; // Wait until PLLO lock detect signal
return nError;
}
///////////////////////////////////////////////////////////////////////////////
//
//
//
///////////////////////////////////////////////////////////////////////////////
ubyte TCC730_Decoder_Init(uword drive,uword File_Num,ubyte mode,long buffer_start)
{
if (g_nCoderHandle > 0) (void)File_Close();
switch(drive)
{
#if defined(MMC_INCLUDE)
case DRIVE_MMC : TCC730_MMC_DecoderInit( &g_nCoderHandle,File_Num,mode,buffer_start );
g_ActiveDrive = drive;
break;
#else
case DRIVE_SMC :
#endif
case DRIVE_NFL : SMC_MPX_DecoderInit( drive,(unsigned int*)&g_nCoderHandle,File_Num,mode,buffer_start,gTempBuf );
g_ActiveDrive = drive;
break;
default : return ERR_CARD_NOT_DETECTED;
}
return SM_OK;
}
ubyte SMC_to_Decoder(uword drive, long n, ubyte mode,long buffer_start,long buffer_end,ubyte end_file,volatile unsigned long* writing_ptr,volatile uword *read_count_addr)
{
/* mode = ?
0 = REW
1 = FF
2 = reserved
3 = PLAY
4 = PAUSE
*/
switch(drive)
{
#if defined(MMC_INCLUDE)
case DRIVE_MMC : TCC730_MMC_MoveToDecoder( g_nCoderHandle,n,mode,buffer_start,buffer_end,
end_file,writing_ptr,read_count_addr);
break;
#else
case DRIVE_SMC :
#endif
case DRIVE_NFL : SMC_MPX_MoveToDecoder( g_nCoderHandle,n,mode,buffer_start,buffer_end,
end_file,writing_ptr,read_count_addr,gTempBuf);
break;
default : return ERR_CARD_NOT_DETECTED;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -