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

📄 smc.h

📁 TELECHIPS MP3解决方案UMS实现源代码
💻 H
字号:
/**************************************************************************************
 *
 * TELECHIPS Co.
 * 
 * 3rd floor Heung-A 70-1 Samsung-dong, KangNam-ku, Seoul, Korea
 * ====================================================================================
 *
 * Name:        Hyun-Chul Hong
 * Phone:       82-2-3443-6792
 * E-mail:      hchong@telechips.com
 *
 * FILE NAME:   DRIVE.H
 *
 * DESCRIPTION:
 *       This is a Header File for function related with Smart Media Card
 *
 *
 * FILE HISTORY:
 * 	Date: 2002.07.18	Start source coding		By Hyunchul Hong
 *
 *
 *
 **************************************************************************************/
#ifndef		_SMC_H_
#define		_SMC_H_

#ifdef	SMC_ONLY
#define	SMC_EXT
#else
#define	SMC_EXT extern
#endif


//**********************************************************
//*
//*		Definition SMC Error Code
//*
//**********************************************************

typedef	unsigned int	SMC_ERROR;


//**********************************************************
//*
//*		Definition CONSTANT or TYPEDEF
//*
//**********************************************************
typedef unsigned char	smc_u8;
typedef unsigned int	smc_u16;
typedef unsigned long	smc_u32;


//**********************************************************
//*
//*		Definition LCD Handler for SMC_FILESYSTEM
//*
//**********************************************************
typedef void (*SMC_LCD_Display_Handler)( unsigned int SMC_DrvNo, unsigned int STATUS_CODE, unsigned long WParam );

#define SMC_DRV_FORMAT_PROCESS		0
#define SMC_FS_UNUSEDBLOCK_START	1
#define SMC_FS_UNUSEDBLOCK_STOP		2
#define SMC_FS_GETSIZE_START		3
#define SMC_FS_GETSIZE_STOP			4


//**********************************************************
//*
//*		Definition about SMC Media
//*
//**********************************************************

// General	
#ifndef DISABLE
#define DISABLE			0
#endif
#ifndef ENABLE
#define	ENABLE			1
#endif
#ifndef FALSE
#define FALSE			0
#endif
#ifndef TRUE
#define TRUE			1
#endif

// Support Media Type
#define MAX_SUPPORT_SMC_MEDIA	7
#define	SMC_8M			0
#define	SMC_16M			1
#define	SMC_32M			2	
#define	SMC_64M			3
#define	SMC_128M		4	
#define	SMC_128MS2K		5	
#define	SMC_256MS2K		6	

#if defined(MMC_INCLUDE)
#define	MAX_SMC_DRIVE					1			// NFL+MMC
#else
#define	MAX_SMC_DRIVE					2			// MFL+SMC
#endif

#define	MAX_MULTIS_NAND_DRIVE			2			// Support Multiples of Multi NAND FLASH Drive
#define	MAX_PAGE_SIZE					528			// Support Buffer Size of accessing a page of SMC	// 512+16
#define	LPT_TABLE_BLOCKS_PER_ONEPAGE	50			// Block Numbers in one page
#define	MAX_LPT_TABLE_BLOCKSIZE			11			// MAX:16384BLOCKS/50=>328/32 = 11
#define MAX_BP_START_GETEMPTYBLOCK		16			// 256M[16Zone]

// Level of checking a invalid block
#define	CHECK_QUICK_LEVEL			0
#define	CHECK_LOW_LEVEL				1

#define	ECC_OFF						0
#define	ECC_ON						1
#define	DISABLE_WRITE_MARK			2

#define	LPT_TABLE_SYSCODE			0x5A
#define	LPT_TABLE_SPARE_SYSCODE		0x5B
//#define LPT_VIRTUAL_TABLE_SYSCODE	0x5C
#define	LPT_TABLE1_SYSDATA			0x5A00
#define	LPT_TABLE1_SPARE_SYSDATA	0x5B00
//#define LPT_VIRTUAL_TABLE_SYSDATA	0x5C00

#define VIRTUAL_FAT1_SYSCODE		0xD9
#define VIRTUAL_FAT1_SYSDATA		0xFFFF
#define VIRTUAL_FAT1_BYTE0			0xFF
#define VIRTUAL_FAT1_BYTE1			0xFF

#define USA_EMPTY_SECTOR_DATA1		0xAA			// [514] User Status Area
#define USA_EMPTY_SECTOR_DATA2		0x55			// [515] User Status Area
#define USA_EMPTY_SECTOR_STATUS		0xA5			// [516] User Status Area

#define USA_USED_SECTOR_DATA1		0x88			// [514] User Status Area
#define USA_USED_SECTOR_DATA2		0x11			// [515] User Status Area
#define USA_USED_SECTOR_STATUS		0x81			// [516] User Status Area

// SMC Card Check Port
#define IS_SMC_EXISTENT()	((PORTE&0x08)==0)		

//======================================================================
// Prepare Unicode Area ( 140Block [ 128*32*512 = 2097512 ] 128+12Block for Spare) [ 140*32*512 = 2293760 ]
// 0		BLOCK [ Signature ]
// 1~XXX	BLOCK [ Font Data ]
//======================================================================
#define	UNICODE_RESERVED_BYTE_SIZE		2293760

// Temporary shared Area
#define BUFFER_MAKE_LPT					((unsigned char*) 0x220000)		// Size 2000
#define BUFFER_ERASE_UNUSEDBLOCK		((unsigned int*)  0x220000)		// Size 1024 

// Speed Up
#define SPEED_UPCLK1					1953		//64MHZ
#define SPEED_UPCLK2					1953		//64MHZ

//**********************************************************
//*
//*		Struct about SMC Media
//*
//**********************************************************
#pragma	packed on									// To align struct by 1byte

struct _SMC_RealMedia_Dev
{
	unsigned int		CpV;			// Cylinder Per Volume
	unsigned int		HpC;			// Head Per Cylinder
	unsigned int		SpH;			// Sector Per Head 
	unsigned long int	allS;   		// All Sector Size
	unsigned int		PBpV;   		// Physical all Block Number  
	unsigned int		LBpV;   		// Logical all Block Number  
	unsigned int		PpB;    		// Page Number Per Block
	unsigned int		szP;			// Page Size
	unsigned int		Spare;			// Spare Size
	unsigned long		EndPageAddr;	// End Page Address
	unsigned int		PageSize;		// Page+Spare Size
};



struct	_SMC_DrvInfo
{
	
	struct _SMC_RealMedia_Dev	DevInfo;			// Media Info

	unsigned int				IO_Status;			// IO Status
	unsigned int				LPT_TABLE_Status;
	unsigned int				LPT_TABLE_Size;
	unsigned int				LPT_TABLE_PBlock[MAX_LPT_TABLE_BLOCKSIZE];
	unsigned int				LPT_TABLE_PBlock_Spare[MAX_LPT_TABLE_BLOCKSIZE];
//	unsigned int				LPT_Virtual_TABLE_PBlock[MAX_LPT_TABLE_BLOCKSIZE];
	
	unsigned int				Removable;
	unsigned int				Start_CS_Media;	

	unsigned int				Mutiple_Support;
	unsigned int				Num_Available_Multi_NAND;
	unsigned int				Media_Type[MAX_MULTIS_NAND_DRIVE];
	unsigned int				Media_CS_Order[MAX_MULTIS_NAND_DRIVE];	
	unsigned long				Multi_Bound_Addr[MAX_MULTIS_NAND_DRIVE];

	unsigned int				Max_Zone;
	unsigned int				BPStart_GetEmptyBlock[MAX_BP_START_GETEMPTYBLOCK];

	unsigned int				VirtualLPT_Used;
	unsigned int				VirtualLPT_LBAAddr;
	unsigned int				VirtualLPT_PBlockAddr;
	unsigned int				VirtualLPT_IsWrite;
	
	unsigned int				Write_Protected;

};


struct	_LPT_Cache
{
	
	unsigned long				Addr;
	unsigned int				Usable;
	unsigned int				Changed;
	unsigned char				Data[2*LPT_TABLE_BLOCKS_PER_ONEPAGE];
};	

struct	_MultiWrite
{
	unsigned int				IsMultiWriting;
	unsigned long				WriteSectorSize;	
	unsigned int				NewPBNo;
	unsigned int				OldPBNo;
	unsigned int				CurPageNo;
};	

struct	_UniFont
{
	unsigned int				Usable;
	unsigned int				LinkBlock;
};
	
#pragma	packed off
//**********************************************************
//*
//*		Global Variables
//*
//**********************************************************
#pragma	memory=data_seg(TCC730_INTERNAL)


SMC_EXT struct _SMC_DrvInfo		SMC_DrvInfo[MAX_SMC_DRIVE];
SMC_EXT struct _LPT_Cache		SMC_LPTCache[MAX_SMC_DRIVE];
SMC_EXT struct _MultiWrite		SMC_MultiWrite[MAX_SMC_DRIVE];
SMC_EXT struct _UniFont			SMC_UnicodeFONT;
 
SMC_EXT	SMC_LCD_Display_Handler CALLBACK_LcdDisplaySMC;

#pragma memory=default
//**********************************************************
//*
//*		Definition FUNCTION
//*
//**********************************************************

//===============================================
//=		SMC_Drv.C
//===============================================

extern SMC_ERROR	SMC_DRV_ReadSector( smc_u16 SMC_DrvNo, smc_u32 LBA_Addr, smc_u8* Read_Buffer );
extern SMC_ERROR	SMC_DRV_ReadMultiSectorStart( smc_u16 SMC_DrvNo, smc_u32 LBA_Addr );
extern SMC_ERROR	SMC_DRV_ReadMultiSectorStop( smc_u16 SMC_DrvNo );
extern SMC_ERROR	SMC_DRV_WriteSector( smc_u16 SMC_DrvNo, smc_u32 LBA_Addr, smc_u8* Write_Buffer );
extern SMC_ERROR	SMC_DRV_WriteMultiSectorStart( smc_u16 SMC_DrvNo, smc_u32 LBA_Addr, smc_u32 Size );
extern SMC_ERROR	SMC_DRV_WriteMultiSectorStop( smc_u16 SMC_DrvNo );
extern SMC_ERROR	SMC_DRV_GetPageAddrOfLBAAddr( smc_u16 SMC_DrvNo, smc_u32 LBA_Addr, smc_u32* Page_AddrtoLBA );
extern SMC_ERROR	SMC_DRV_GetIsExistMedia( smc_u16 SMC_DrvNo );
extern void			SMC_DRV_GetCapacityOfMedia( smc_u16 SMC_DrvNo, smc_u32* BlockNum, smc_u16* BlockSize );
extern void			SMC_DRV_GetCHSOfMedia( smc_u16 SMC_DrvNo, smc_u16* Cylinder, smc_u16* Head, smc_u16* SectorNum, smc_u16* SectorSize );
extern unsigned int	SMC_DRV_GetPpBOfMedia( smc_u16 SMC_DrvNo );
extern unsigned int	SMC_DRV_GetMediaType( smc_u16 SMC_DrvNo );

extern SMC_ERROR	SMC_DRV_FormatMedia( smc_u16 SMC_DrvNo, smc_u16 Mode, smc_u8* Sector_Buffer );
extern SMC_ERROR	SMC_DRV_EraseUnUsedBlock( smc_u16 SMC_DrvNo, smc_u32 LBA_Addr, smc_u16 SecPerClus,
											  smc_u16* IsUsedClusArray, smc_u8* Buffer );

extern SMC_ERROR	SMC_DRV_Init( void );
extern SMC_ERROR	SMC_DRV_InitDrive( smc_u16 SMC_DrvNo );
extern SMC_ERROR	SMC_DRV_IsInited( smc_u16 SMC_DrvNo );
extern SMC_ERROR	SMC_DRV_Get_StatusOfDrvIO( smc_u16 SMC_DrvNo );
extern SMC_ERROR	SMC_DRV_WriteCISBlock( smc_u16 SMC_DrvNo, smc_u16 BlkNo, smc_u8* Sector_Buffer );
extern SMC_ERROR	SMC_DRV_MarkOfDoneEraseUnUsedBlock( smc_u16 SMC_DrvNo, smc_u16 BlkNo, smc_u8* Sector_Buffer );
extern SMC_ERROR	SMC_DRV_MarkOfNeedEraseUnUsedBlock( smc_u16 SMC_DrvNo, smc_u16 BlkNo );
extern SMC_ERROR	SMC_DRV_GetIsMarkOfDoneEraseUnUsedBlock( smc_u16 SMC_DrvNo, smc_u16 BlkNo );
extern SMC_ERROR	SMC_DRV_MakeLPTTable( smc_u16 SMC_DrvNo );
extern SMC_ERROR	SMC_DRV_ChangeLPTCache( smc_u16 SMC_DrvNo, smc_u32 LBA_Addr );
extern SMC_ERROR	SMC_DRV_FlushLPTCache( smc_u16 SMC_DrvNo );
extern SMC_ERROR	SMC_DRV_SearchLPTTable( smc_u16 SMC_DrvNo );
extern SMC_ERROR	SMC_DRV_EnableVirtualLPTCache( smc_u16 SMC_DrvNo );
extern SMC_ERROR	SMC_DRV_DisableVirtualLPTCache( smc_u16 SMC_DrvNo );

extern SMC_ERROR	SMC_DRV_GetEmptyPBlockInZONE( smc_u16 SMC_DrvNo, smc_u16 Zone, smc_u16* PBlock_No );
extern SMC_ERROR	SMC_DRV_GetEmptyPBlock( smc_u16 SMC_DrvNo, smc_u16 Start_PBNo, smc_u16 End_PBNo, smc_u16 Check_Level, smc_u16* PBlock_No, smc_u8* Sector_Buffer );
extern SMC_ERROR	SMC_DRV_Get_PBlockOfLBlock( smc_u16 SMC_DrvNo, smc_u16 LBlock_No, smc_u16* PBlock_No );
extern SMC_ERROR	SMC_DRV_CheckPBlockStatus( smc_u16 SMC_DrvNo, smc_u16 Block_Addr, smc_u16 Check_Level, smc_u8* Sector_Buffer );
extern SMC_ERROR	SMC_DRV_CheckEmptyBAAOfPBlock( smc_u16 SMC_DrvNo, smc_u16 Block_Addr );
extern SMC_ERROR	SMC_DRV_GetBAA( smc_u16 SMC_DrvNo, smc_u16 PBlock_No, smc_u16* BAA );
extern unsigned int	SMC_DRV_ConvertToBAA( smc_u16 BlkNo );
extern SMC_ERROR	SMC_DRV_Mark_BAA( smc_u16 SMC_DrvNo, smc_u16 PBlock_No, smc_u16 BlkNo );
extern SMC_ERROR	SMC_DRV_MarkBADBlock( smc_u16 SMC_DrvNo, smc_u16 Block_Addr );
extern SMC_ERROR	SMC_DRV_MarkSYSTEMBlock( smc_u16 SMC_DrvNo, smc_u16 Block_Addr, smc_u16 SYSTEM_CODE, smc_u16 SYSTEM_DATA );
extern SMC_ERROR	SMC_DRV_ReadyBlockForVirtualFAT1( smc_u16 SMC_DrvNo, smc_u16 FAT1_Size, smc_u8* FileInfo, smc_u16 FileInfoSize, smc_u8* Sector_Buffer );
extern SMC_ERROR	SMC_DRV_EraseBlockForVirtualFAT1( smc_u16 SMC_DrvNo, smc_u8* Sector_Buffer );
extern SMC_ERROR	SMC_DRV_WriteFATContentToVirtualFAT1( smc_u16 SMC_DrvNo, smc_u16 FatStartSector, smc_u8* FatData, smc_u8* Sector_Buffer );
extern SMC_ERROR	SMC_DRV_ReadFATContentFromVirtualFAT1( smc_u16 SMC_DrvNo, smc_u16 FatSector, smc_u8* FatData, smc_u8* Sector_Buffer );
extern SMC_ERROR	SMC_DRV_UpdateFileInfoInVirtualFAT1( smc_u16 SMC_DrvNo, smc_u8* FileInfo, smc_u16 FileInfoSize, smc_u8* Sector_Buffer );

extern SMC_ERROR	SMC_DRV_ReadPage( smc_u16 SMC_DrvNo, smc_u32 PPage_Addr, smc_u8* PageBuffer, smc_u8* SpareBuffer );
extern SMC_ERROR	SMC_DRV_ReadUserSizePage( smc_u16 SMC_DrvNo, smc_u32 PPage_Addr, smc_u16 Col_Addr, smc_u8* Read_Buffer, smc_u16 Read_Size );
extern SMC_ERROR	SMC_DRV_ReadSpare( smc_u16 SMC_DrvNo, smc_u32 PPage_Addr,smc_u8* Read_SpareBuffer );
extern SMC_ERROR	SMC_DRV_WritePage( smc_u16 SMC_DrvNo, smc_u32 PPage_Addr, smc_u8* PageBuffer, smc_u8* SpareBuffer, smc_u16 ECC_On );
extern SMC_ERROR	SMC_DRV_WriteUserSizePage( smc_u16 SMC_DrvNo, smc_u32 PPage_Addr, smc_u16 Col_Addr, smc_u8* Write_Buffer, smc_u16 Write_Bytes );
extern SMC_ERROR	SMC_DRV_EraseBlock( smc_u16 SMC_DrvNo, smc_u16 Block_Addr );
extern SMC_ERROR	SMC_DRV_GetRealPageAddrOfNAND( smc_u16 SMC_DrvNo, smc_u32 Page_Addr, smc_u32* Get_RealPageAddr, smc_u16* Get_ChipOrder );

extern SMC_ERROR	SMC_DRV_GetIsUnicodeFont( smc_u8* Sector_Buffer );
extern SMC_ERROR	SMC_DRV_LoadUnicodeFont( unsigned int UniCode, unsigned char* UniFont, unsigned int Size );
extern void			SMC_DRV_SetSMC_LCD_Display_Handler( SMC_LCD_Display_Handler LCD_CallBackRoutine );

//===============================================
//=		SMC_Io.S
//===============================================
extern SMC_ERROR	SMC_IO_Init( void );
extern SMC_ERROR	SMC_IO_Reset( smc_u16 ChipNo );
extern SMC_ERROR	SMC_IO_ReadID( smc_u16 ChipNo, smc_u8* Read_ID, smc_u16 Read_Size );
extern SMC_ERROR	SMC_IO_ReadPage( smc_u16 ChipNo, smc_u16 ChipType, smc_u32 PageAddr, smc_u8* PageBuffer, smc_u8* SpareBuffer );
extern SMC_ERROR	SMC_IO_ReadUserSizePage( smc_u16 ChipNo,smc_u16 ChipType,smc_u32 PageAddr,smc_u16 ColumnAddr,smc_u8* Read_Buffer,smc_u16 Read_Bytes );
extern SMC_ERROR	SMC_IO_ReadSpare( smc_u16 ChipNo,smc_u16 ChipType,smc_u32 PageAddr,smc_u8* Read_SpareBuffer );
extern SMC_ERROR	SMC_IO_WritePage( smc_u16 ChipNo,smc_u16 ChipType,smc_u32 PageAddr,smc_u8* PageBuffer,smc_u8* SpareBuffer,smc_u16 SSFDC_ECC );
extern SMC_ERROR	SMC_IO_WriteUserSizePage( smc_u16 ChipNo,smc_u16 ChipType,smc_u32 PageAddr,smc_u16 ColumnAddr,smc_u8* Write_Buffer,smc_u16 Write_Bytes );
extern SMC_ERROR	SMC_IO_EraseBlock( smc_u16 ChipNo,smc_u16 ChipType,smc_u32 PageAddrtoBlock );


#endif

⌨️ 快捷键说明

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