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

📄 mass_fscompat.c

📁 TELECHIPS MP3解决方案UMS实现源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -