📄 smc.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 + -