📄 sm.h
字号:
/*
*********************************************************************************************************
* File : Sm.H
* Contents :
*
* $Date : 09/18/06 Kimi v0.1
* $Date : 10/18/06 Kimi v0.2
* $Date : 11/02/06 Kimi v1.0
*
* Copyright (c) 2006 Fameg, Inc. All rights reserved
*********************************************************************************************************
*/
#ifndef __SM_H__
#define __SM_H__
#include "fs7805.h"
#include "fs7805regs.h"
#include <string.h>
/*
*********************************************************************************************************
* LOCAL MACRO PROTOTYPES
*********************************************************************************************************
*/
// Flash cycle
#define FLASH_3CYCLE 0x40 // Not used
#define FLASH_4CYCLE 0x60 // Not used
// CIS Block
#define CIS1_OFFSET 0 // Not used
#define CIS2_OFFSET 256 // Not used
#define CIS_HEADER_SIZE 10 // Not used
#define CIS_SIZE 0x6f // Not used
#define SM_BLOCK_SEGMENT_SHIFT 10 // 2 ^ 10
#define SM_BLOCK_SEGMENT_MASK 0x3ff // 2 ^ 10 - 1
#define SM_BLOCKS_PER_SEGMENT ((UINT16)1 << SM_BLOCK_SEGMENT_SHIFT)
// 2 ^ 10
#define SM_MAX_CHIPS_PER_DEVICE 16
#define SM_MAX_SEGMENTS_PER_CHIP 8
#define SM_MAX_SEGMENTS_PER_DEVICE (SM_MAX_CHIPS_PER_DEVICE * SM_MAX_SEGMENTS_PER_CHIP)
#define SM_USER_BLOCKS_PER_SEGMENT 1000 // Logical blocks per segment
#ifdef SM_FAST
#define SM_BLOCK_TAB_TAG_SIZE 2 // Size of block table (in segment)
#else
#define SM_BLOCK_TAB_TAG_SIZE 1 // Size of block table (in segment)
#endif
#define SM_BLOCK_TAB_SIZE (SM_BLOCKS_PER_SEGMENT * SM_BLOCK_TAB_TAG_SIZE)
#define SM_FREE_TAB_SIZE ((SM_BLOCKS_PER_SEGMENT >> 3) * SM_BLOCK_TAB_TAG_SIZE)
#define FLASH_READ 0x00
#define FLASH_PROG_EX 0x01
#define FLASH_READ_EX 0x02
#define FLASH_READ_ID 0x03
#define FLASH_READ_STS 0x04
#define FLASH_PROG 0x05
#define FLASH_ERASE 0x06
#define FLASH_READ_NEXT_DATA 0x07
#define FLASH_PROG_NEXT_DATA 0x08
#define FLASH_CP 0x10
#define FLASH_CP_PROG 0x11
#define FLASH_PAD 0x20
#define FLASH_RESET 0x40
#define FLASH_ADDR0 0
#define FLASH_ADDR1 1
#define FLASH_ADDR2 2
#define FLASH_ADDR3 3
#define FLASH_ADDR4 4
#define FLASH_RSV0 0x00
#define FLASH_RSV1 0x01
#define FLASH_RSV2 0x02
#define FLASH_RSV3 0x03
#define DATA_STS 0x04
#define BLOCK_STS 0x05
#define BLOCK_ADDR1_H 0x06
#define BLOCK_ADDR1_L 0x07
#define SM_ECC2_2 0x08
#define SM_ECC2_1 0x09
#define SM_ECC2_0 0x0a
#define BLOCK_ADDR2_H 0x0b
#define BLOCK_ADDR2_L 0x0c
#define SM_ECC1_2 0x0d
#define SM_ECC1_1 0x0e
#define SM_ECC1_0 0x0f
#define SM_ECC4_2 0x18
#define SM_ECC4_1 0x19
#define SM_ECC4_0 0x1a
#define SM_ECC3_2 0x1d
#define SM_ECC3_1 0x1e
#define SM_ECC3_0 0x1f
#define SM_ECC6_2 0x28
#define SM_ECC6_1 0x29
#define SM_ECC6_0 0x2a
#define SM_ECC5_2 0x2d
#define SM_ECC5_1 0x2e
#define SM_ECC5_0 0x2f
#define SM_ECC8_2 0x38
#define SM_ECC8_1 0x39
#define SM_ECC8_0 0x3a
#define SM_ECC7_2 0x3d
#define SM_ECC7_1 0x3e
#define SM_ECC7_0 0x3f
#define SmClrHw() // Not used
#define SmWriteProtect() 0
#define SmCardExist() // Not used
#define SmPowerOn()
#define SmPowerOff()
//----------------------------------------------------------------------------
// Description:
// Caculate the gap needed to translate SM logical block address to
// mapping table address
//----------------------------------------------------------------------------
#define SmLog2TabAddrGap(Addr) ((Addr / SM_USER_BLOCKS_PER_SEGMENT) * \
(SM_BLOCKS_PER_SEGMENT - SM_USER_BLOCKS_PER_SEGMENT))
//----------------------------------------------------------------------------
// Description:
// Set the buffer address for the followed FLASH access
//----------------------------------------------------------------------------
#define SmSetBufferAddr(Addr)
#define SmFifoAddr
#define PLANE_NUMBER 1
/*
*********************************************************************************************************
* DATA TYPES
*********************************************************************************************************
*/
// Structure of smart media device ID table
typedef struct
{
BYTE DeviceId; // Device ID, unique, keyword
BYTE PagesShift; // Pages per block, in bit shift
BYTE BlocksShift; // Physical blocks per chip, in bit shift
UINT16 AvailableBlocks; // Logical available blocks per chip
UINT16 PageSize; // Page size in bytes
bool Is16Bit; // Running on 16-bit mode
bool Is2Cmds; // 2 CLE commands Flash
} TDeviceTab;
/*
*********************************************************************************************************
* STATIC VARIABLE PROTOTYPES
*********************************************************************************************************
*/
// Mapping table
static xdata UINT16 SmBlockTab[SM_BLOCK_TAB_SIZE];
// Logical to physical block mapping table per segment
static xdata BYTE SmFreeTab[SM_FREE_TAB_SIZE];
// Physical block free table per segment, bit mapping table
static xdata bool SmCleanPage[MAX_PAGES_PER_BLOCK];
// Flag array to show if pages of working in destination block
static xdata UINT16 SmFreeBlockPtr[SM_MAX_SEGMENTS_PER_DEVICE];
// Free physical block pointer for each segment
// Information for Windows Mass Storage Protocol
static xdata UINT32 SmAvailableSectors; // Available sectors(pages) of single on-board FLASH chip
// Available block and chip relationship
static xdata UINT16 SmAvailableBlocks; // Available blocks of single on-board FLASH chip
// Block and chip relationship
static xdata BYTE SmBlocksPerChipShift; // Physical blocks per chip, in bit shift of single on-board FLASH chip
// Page and chip relationship
static xdata BYTE SmPagesPerChipShift; // Physical pages per chip, in bit shift of single on-board FLASH chip
static xdata UINT32 SmChipPageMask; // Mask of page address bits out of single on-board FLASH chip
// Page and block relationship
static xdata BYTE SmPagesPerBlock; // Pages per block of current FLASH chip
static idata BYTE SmPage2BlockShift; // Bit shift to convert page address to block address
static idata BYTE SmBlockPageMask; // Mask of page addres bits out of block address
// Block and segment relationship
#define SmBlock2SegShift SM_BLOCK_SEGMENT_SHIFT // Bit shift to convert block address to segment
#define SmBlockSegMask SM_BLOCK_SEGMENT_MASK // Mask of block address bits
#define SmBlocksPerSeg SM_BLOCKS_PER_SEGMENT // Number of blocks per segment
#define TabSegment1Base SM_BLOCKS_PER_SEGMENT // Segment Base address of Mapping table for Segment which is not zero
static idata BYTE SmBlockTabSeg; // Current block mapping table segment
static idata UINT16 SmSrcBlock; // Physical working source block for FLASH write
static idata UINT16 SmDestBlock; // Physical working destination block for FLASH write
static idata UINT16 SmSrcBlockLog; // Logical working source block for FLASH write
static xdata BYTE SmDeviceIndex; // The current FLASH chip index for SmDeviceTab
static xdata UINT32 SmDeviceLastPage; // Last page of the device
// Following variables must be set before calling SmReadSector() and
// SmWriteSector(). They complete the mechanism of error handling.
static BYTE SmJustWrite = 0;
static idata bool SmNeedSetExtra;
static idata STATUS SmCmdStatus;
static xdata BYTE SmMaxChipsPerDevice;
static BYTE ReadyBusy;
static idata UINT16 SegmentBase;
#define SegmentTop SM_BLOCKS_PER_SEGMENT
// Smart media device ID table
// DeviceId, PagesShift, BlocksShift, AvailableBlocks, PageSize, Is16Bit, Is2Cmds
code TDeviceTab SmDeviceTab[] = {
// Samsung
{0xf1, 6, 10, 1000, 0x800, false, false}, // 1Gb K9F1G08U0A
{0xda, 6, 11, 2000, 0x800, false, false}, // 2Gb K9F2G08U0M
{0xdc, 6, 12, 4000, 0x800, false, false}, // 8Gb K9W8G08U1M
// 4Gb K9K4G08U0M
// End of Table
{0x00, 0, 0, 0, 0, false, false}
};
BYTE ChunkCounter = 0; // To split page into 512(Bytes) chunks.
// Must be initial 0 to prevent SmFlushPrefetch()
static idata STATUS SmMediaStatus = STATUS_NO_MEDIA;
/*
static code BYTE CIS_INFO[] = { // Not support
0x01, 0x03, 0xd9, 0x01, 0xff, 0x18, 0x02, 0xdf, 0x01, 0x20
};
#ifdef PREFETCH // Not support
static UINT32 PrefetchPage; // Page to be prefetch or has been prefetched
static bit bPrefetchPage; // Page has been prefetched
#endif
#define SmFifoAddr // Deleted
UINT SmSrcBlockTab; // Deleted
static BYTE FlashCycle; // Not used
static xdata UINT16 SmCISBlock; // Not support
*/
/*
*********************************************************************************************************
* STATIC FUNCTION PROTOTYPES
*********************************************************************************************************
*/
static void SmSetBlockExtra (UINT16 BlockAddr);
static void SmSetFlashAddr (UINT32 Page);
static STATUS SmFlashCmd (BYTE Cmd);
static BYTE SmReadId (void);
static BYTE SmReadStatus (void);
static STATUS SmReadPage (UINT32 Page);
static STATUS SmWritePage (UINT32 Page);
static void SmMarkInvalidBlock (UINT16 Block);
static STATUS SmEraseBlock (UINT16 Block);
static UINT16 SmLog2PhyBlock (UINT16 LogBlockSeg);
static void SmUpdateBlockTab (UINT16 LogBlock, UINT16 PhyBlock);
static UINT16 SmGetAddr (void);
static UINT16 SmReadBlockAddr (UINT16 Block);
static UINT16 SmAllocateBlock (BYTE Segment);
static void SmFreeBlock (UINT16 Block);
static void SmReadBlockTab (BYTE Segment);
static STATUS SmCopyBlock (UINT16 SrcBlock, UINT16 DestBlock, TCOPY_MODE Mode);
static STATUS SmRepairBlock (void);
static STATUS SmPadPage (BYTE p);
/*
static void SmFlushPrefetch (void);
static void SearchCIS (void);
static void SmReset (void);
#ifdef PREFETCH
static STATUS SmWaitCmd (void);
static STATUS SmReadPagePrefetch (UINT32 Page);
#endif
*/
/*
*********************************************************************************************************
* EXTERN VARIABLE PROTOTYPES
*********************************************************************************************************
*/
extern bit SmFlushFlag;
extern UINT32 SectorStart;
extern xdata TDeviceInfo DeviceInfo;
/*
*********************************************************************************************************
* EXTERN FUNCTION PROTOTYPES
*********************************************************************************************************
*/
extern void NanD_Command (INT8U command);
extern void NanD_Address (INT8U address);
extern BYTE NanD_Read (void);
extern void Nand_ReadSector (void);
extern void Nand_WriteSector (void);
extern void Nand_ReadSpare (void);
extern void Nand_WriteSpare (void);
extern bool EvenParity (UINT16 Data);
/*
*********************************************************************************************************
* GLOBAL VARIABLE PROTOTYPES
*********************************************************************************************************
*/
xdata BYTE FlashAddress[5];
xdata BYTE FlashSts;
xdata BYTE FlashId[5];
xdata BYTE SmFlushTimer = 0;
xdata BYTE SpareArea[HEADER_SIZE];
BYTE PageIndex;
/*
*********************************************************************************************************
* GLOBAL FUNCTION PROTOTYPES
*********************************************************************************************************
*/
STATUS SmReadNextSector (void);
STATUS SmWriteNextSector (void);
STATUS SmFlushBlock (void);
STATUS SmReadSector (void);
STATUS SmWriteSector (void);
void SmMediaChange (void);
void SmStart (void);
void SmEject (void);
STATUS SmQueryDevice (void);
void SmSuspend (void);
void SmResume (void);
void SmInit (void);
void SmSelectChip (BYTE Chip);
void SmEraseAll (void);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -