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

📄 sm.h

📁 Falsh 读写的demo
💻 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 + -