[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/interface/driver/storage/DrvFlash.h b/mcu/interface/driver/storage/DrvFlash.h
new file mode 100644
index 0000000..8da1fb5
--- /dev/null
+++ b/mcu/interface/driver/storage/DrvFlash.h
@@ -0,0 +1,879 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ *  FlashConf.C
+ *
+ * Project:
+ * --------
+ *  MAUI
+ *
+ * Description:
+ * ------------
+ *  This file is used to configure flash device for FAT.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+#ifndef DRVFLASH_H
+#define DRVFLASH_H
+
+/*---------------------------------------------
+ * Included Header Files
+ *---------------------------------------------*/
+
+#include "fs_type.h"
+#include "kal_general_types.h"
+#include "kal_public_defs.h"
+#include "kal_internal_api.h"
+#include "fs_gprot.h"
+
+// default turn on FDM4 enhancement
+#define __NOR_FDM_4_FLIPPING_TOLERABLE__
+
+#ifdef FLASH_DISKDRV_DEBUG
+#define __fs_packed_prefix
+#define __fs_packed_postfix
+#endif
+
+// MTD driver
+#define REGION_NUM 8
+#define NON_BLOCK_STATUS  (0x8) //4 bit pattern for version check
+
+//FOR FDM5
+#define INVALID_BLOCK_ID 0xffff
+#define INVALID_TABLE_ID 0xffff
+#define INVALID_LOGICAL_NUM 0xffffff
+#define INVALID_NOR_ADDR 0xffffffff
+#define INVALID_PHY_PAGE 0xffffffff
+#define INVALID_ENTRY 0xffff
+
+//FOR FDM4
+#define INVALID_BLOCK_INDEX   0xFFFFFFFF
+#define INVALID_SECTOR_INDEX  0xFFFFFFFF
+#define INVALID_ERASE_COUNT   0x00FFFFFF // we only have 24 bits
+#define MAX_ERASE_COUNT       (INVALID_ERASE_COUNT-1)
+
+/* Global defines */
+#define SPARE_RESERVED_RATIO                    (10)
+#define MINIMUM_SPARE_AMOUNT                    (2)
+#define SLEEP_MODE_SPARE_AMOUNT                 (4)
+#define GC_THRESHOLD_DIVISION                   (3)
+#define GC_THRESHOLD_GAP                        (1)
+#define RESERVED_SECTOR_FOR_MINIMUM_SPARE_SPACE (4) ///< The number of additional reserved sectors if erase queue size is set to the minimum value (2)
+#define RESERVED_SECTOR_FOR_REPEATE_POWER_LOSS_DURING_RECLAIM (6) ///< The number of additional reserved sectors if erase queue size is set to the minimum value (2)
+#define MINIMUM_SYSTEM_DRIVE_RESERVE_BLOCK      (3) ///< minimum System Drive Reserved Blocks (unit: block)
+
+/******** RESULT for Single Bank ************/
+#define RESULT_FLASH_DONE (1)
+#define RESULT_FLASH_BUSY (0)
+#define RESULT_FLASH_FAIL (-1)
+
+#ifndef __MTK_TARGET__
+#pragma pack(1)
+#endif
+typedef __fs_packed_prefix struct {
+   kal_uint32 TotalBlocks;
+   kal_uint32 BlockSize[REGION_NUM];
+   kal_uint32 AvailInRegion[REGION_NUM];       ///< empty and the number of blocks in erase queue
+   kal_uint32 RegionBlocks[REGION_NUM];
+   kal_uint32 ActualRegionNum;
+   WORD  PageSize;
+   kal_uint32 baseUnlockBlock;                 ///< Add because FOTA need to unlock different region in INTEL flash
+   kal_uint32 endUnlockBlock;                  ///< Add because FOTA need to unlock different region in INTEL flash
+} __fs_packed_postfix NOR_MTD_FlashInfo;
+#ifndef __MTK_TARGET__
+#pragma pack()
+#endif
+
+/* add ONE_BYTE_ALIGN_ADS keyword to this struct so that it won't violate ARM's ADS compiler rule.
+ * No need, since this structure is included into another ONE_BYTE_ALIGN_ADS structure in pointer form
+ */
+typedef struct {
+   int     (* MountDevice)  (void * DriveData, void * Info);
+   int     (* ShutDown)     (void * DriveData);
+   void *  (* MapWindow)    (void * DriveData, kal_uint32 BlockIndex, kal_uint32 WindowIndex);
+   int     (* EraseBlock)   (void * DriveData, kal_uint32 BlockIndex);
+   int     (* ProgramData)  (void * DriveData, void * Address, void * Data, UINT Length);
+   int     (*NonBlockEraseBlock) (void * DriveData, kal_uint32  BlockIndex); /* Added by Eric */
+   int     (*CheckDeviceReady)   (void * DriveData, kal_uint32 BlockIndex); /* Added by Eric */
+   int     (*SuspendErase)       (void * DriveData, kal_uint32 BlockIndex); /* Added by Eric */
+   int     (*ResumeErase)        (void * DriveData, kal_uint32 BlockIndex); /* Added by Eric */
+   int     (*BlankCheck)             (void * DriveData, kal_uint32 BlockIndex);
+   int     (*OTPAccess)           (void * DriveData, int accesstype, UINT Offset, void * BufferPtr, UINT Length);
+   int     (*OTPQueryLength)      (void * DriveData, UINT *Length);
+   int     (*LockEraseBlkAddr)         (void * DriveData, void *Address,UINT Action);
+   kal_bool (*IsEraseSuspended)     (void * DriveData, kal_uint32 BlockIndex);
+   int     (*IOCtrl)        (void * DriveData, UINT CtrlAction, void * CtrlData); // For device IO control
+   //mtk03694 : this is a new API for WAT chip, because we have NO forced suspend & resume function.
+   //                 So if someone use direct read while the flash is erasing or programing, the value will be wrong.
+   #ifdef __LTE_RAT__
+   int     (* ReadData)  (void * DriveData, void * Address, void * Data, UINT Length);      
+   #endif
+} NOR_MTD_Driver;
+
+/*LockEraseBlkAddr Action*/
+#define ACTION_UNLOCK 0
+#define ACTION_LOCK 1
+#define ACTION_ERASE 2
+
+
+// This is the file MTD for testing only
+
+typedef struct {
+   const  char * FileName;
+   kal_uint32  FileSize;
+   kal_uint32  BlockSize;
+   kal_uint32  WindowSize;
+   HANDLE H;
+   BYTE * BaseAddr;
+   void * CurrAddr;
+} NORMtdFileData;
+
+
+// Flash Info
+typedef struct {
+   kal_uint32 BlockSize;
+   kal_uint32 RegionBlocks;
+} FlashRegionInfo;
+#define EndRegionInfo  {0, 0}
+
+typedef struct {
+   kal_uint32 BankSize;
+   kal_uint32 Banks;
+} FlashBankInfo;
+#define EndBankInfo  {0, 0}
+
+// Erase block Info
+/* add ONE_BYTE_ALIGN_ADS keyword to this struct so that it won't violate ARM's ADS compiler rule.
+ * No need, since this structure is included into another ONE_BYTE_ALIGN_ADS structure in pointer form
+ */
+typedef struct {
+   kal_uint32 BlockIndex;
+   kal_uint32 EraseCount;
+} NOR_EraseInfo;
+
+
+typedef struct {
+   kal_uint32  Signature;
+   BYTE * BaseAddr;
+   kal_semid          DeviceLock;       // The device lock that keeps driver resource consistent
+   kal_taskid         DeviceLockOwner;  // The owner of the deivce lock
+   kal_int8           DeviceLockDepth;  // The depth of the deivce lock
+
+   FlashRegionInfo * RegionInfo;
+   BYTE * CurrAddr;
+   FlashBankInfo *BankInfo;
+   BYTE * CurrBankAddr;
+   kal_uint32 CurrBankSize;
+   BYTE * CurrPollAddr;
+#ifndef __MTK_TARGET__
+   const char        *FileName;
+   void              *flash_device;
+   BYTE              *rootMTDcache;
+   BYTE              *MTDcache;
+   kal_uint32             first;
+   kal_uint32             last_WinAddr;
+   kal_uint32             last_region;
+#endif
+} NOR_Flash_MTD_Data;
+
+#ifndef __MTK_TARGET__
+   #ifndef FLASH_DISKDRV_DEBUG
+      #define MakeMtdFlashData(a, b)   0x0, 0x000000, b, NULL, "..\\..\\fs\\flash_device.img", NULL, NULL, NULL
+   #else
+      #define MakeMtdFlashData(a, b)   0x0, 0x000000, b, NULL, "..\\flash_device.img", NULL, NULL, NULL
+   #endif
+#else
+#define MakeMtdFlashData(a, b)   a, b, NULL
+#endif
+
+/* Multi-sector Protection Entry */
+#ifndef __MTK_TARGET__
+#pragma pack(1)
+#endif
+
+
+typedef __fs_packed_prefix struct {
+   kal_uint32 LogicalSectorID;
+   kal_uint32 PysicalSectorID_new;
+}__fs_packed_postfix MS_ENTRY;
+
+
+
+// Flash driver's data
+typedef __fs_packed_prefix struct NOR_FLASH_DRV_Data{
+   kal_uint32    TotalFATSectors;        ///< Total number of FAT sectors in flash (i.e., TotalPhysicalSectors - reserved sectors)
+   NOR_MTD_Driver *MTDDriver;       ///< MTD driver
+   void    *MTDData;                ///< MTD data
+   WORD    *AvailSectorsInBlock;    ///< The number of SECTOR_AVAIL in each block
+   WORD    *ValidSectorsInBlock;    ///< The number of valid sectors (not SECTOR_AVAIL && not SECTOR_DELETED)
+   NOR_MTD_FlashInfo FlashInfo;     ///< Flash information
+   kal_uint32    HeaderSize[REGION_NUM]; ///< Size (bytes) from the beginning of a block address to the first data sector (i.e., contains both block and sector headers)
+   kal_uint32    SectorsPerBlock[REGION_NUM];    ///< Number of "physical" sectors (exclude sectors for header) in each block of the same region
+   kal_uint32    ActiveBlock;            ///< Current active block ID
+   kal_uint32    ReclaimEraseCount;      ///< Erase count of the reclaimed block
+   kal_uint32    ReclaimBlockID;         ///< Block ID of the reclaimed block
+   kal_uint32    TotalPhysicalSectors;   ///< Total number of "physical" sector (exclude sectors for header) in flash. (For each region, TotalPhysicalSectors += RegionBlocks[region] * SectorsPerBlock[region])
+   kal_uint32    PartitionSectors;       ///< Size of the first FAT partition (unit: sectors)
+   kal_uint32    GCThreshold;            ///< GC threshold for Multi-Bank (2 maximum block + sectors for MSP)
+   kal_uint32    AvailSectors;           ///< Total SECTOR_AVAIL sectors in flash (of course, exclude sectors for headers)
+   kal_uint32    DeletedSectors;         ///< The number of deleted sectors in system (Increased in DeletePhysicalSector, MountDevice, ResumeSectorStates)
+   kal_uint32    StartSector;            ///< Start "logical sector ID" for write or marking to process
+   kal_uint32    Sectors;                ///< Total number of logical sectors to be updated (set in MarkToProcess)
+   kal_uint32    SectorsLeft;            ///< The number of logical sectors left to be updated. i.e., The number of sectors whose update bit is set. (set in MarkToProcess and be decreased in MarkProcessed)
+   kal_uint32    BLOCKID_OFFSET;         ///< Block offset, calculated by MaxSectorsPerBlock
+   kal_uint32    SECTORIDX_MASK;         ///< Mask for retrieve sector index inside a block
+   kal_uint32    PHY_SECTOR_OFFSET;      ///< Offset for retriving first 7 bits of PhysicalSector (i.e., Block offset + Local sector offset - 7)
+
+   kal_uint32    MSTABLE_ENTRY_NUM;
+   kal_uint32    MS_count;               ///< The number of valid entries in MS Entry Table
+   MS_ENTRY *MSEntryTable;
+   BYTE    *SectorMap;              ///< Sector map, built in MountDevice
+   BYTE    *Buffer;                 ///< FDM Buffer: SIBLEY(1024 bytes) / Others (512 bytes), used when source data is located in the same bank (ESB, movee sectors in ReclaimBlock_pre...)
+
+   void (*CompleteErase)(struct NOR_FLASH_DRV_Data * D);
+
+   kal_uint32    RegionMaxBlock;         ///< (The first) region ID which contains blocks that have maximum number of sectors (to not let such block is selected as active block when the block is the only one left in this region, which makes Program Fail handle properly)
+   
+   void    (*ProgramFailHandle)  (struct NOR_FLASH_DRV_Data * D);
+   void    (*ReclaimBlock_post)  (struct NOR_FLASH_DRV_Data * D);
+
+
+   WORD     SystemDriveReservedUnits;   ///< The number of reserved unit (1 unit = 0.5 block), default size = 6 (NOR_SYSTEM_DRIVE_RESERVED_BLOCK * 2)
+
+   kal_bool    ProgramFailRetry;
+
+   
+
+}__fs_packed_postfix NOR_FLASH_DRV_Data;
+
+#ifdef __MTK_TARGET__
+
+extern kal_mutexid fdm_reclaim_mutex;
+extern kal_eventgrpid  nor_egid;
+#define NOR_BRECL_EVENT 0x1
+#define NOR_FRECL_EVENT 0x2
+#define NOR_DMAN_EVENT 0x4
+
+#endif
+
+/* Flash Bank Info */
+typedef struct {
+   kal_uint32 BankSize;
+   kal_uint32 Banks;
+} NORBankInfo;
+#define EndBankInfo  {0, 0}
+
+/* Flash Layout Info */
+typedef struct {
+   kal_uint32 TotalLSMT;
+   kal_uint32 BlkSize;
+   kal_uint32 PageSize;
+   NORBankInfo *BankInfo;
+   WORD TblEntrys;
+   WORD TotalBlks;
+} NORLayoutInfo;
+
+typedef struct {
+   kal_uint32  Signature;
+   BYTE * BaseAddr;
+   kal_semid          DeviceLock;       // The device lock that protects driver resource 
+   kal_taskid         DeviceLockOwner;  // The owner of the deivce lock
+   kal_int8           DeviceLockDepth;  // The depth of the deivce lock
+
+   NORLayoutInfo * LayoutInfo;
+#ifndef __MTK_TARGET__
+   const char        *FileName;
+   void              *flash_device;
+   BYTE              *rootMTDcache;
+   BYTE              *MTDcache;
+   kal_uint32             modify;                    //first time, don't need to write to file
+   kal_uint32             last_WinAddr;    // next address calling mapwindow
+   kal_uint32             last_region;        //next region calling mapwindow
+#endif
+} NOR_MTD_DATA;
+
+typedef __fs_packed_prefix struct
+{
+   kal_uint32 MSCount;
+   kal_uint32 *LogPageID;
+   WORD *NewEntryID;
+   WORD *OldEntryID;
+}__fs_packed_postfix MS_TABLE;
+
+typedef __fs_packed_prefix struct {
+   WORD LogBlkID;
+   WORD TblIDInBlk;
+}__fs_packed_postfix LSMGEntry;
+
+//flash driver data for FDM5.0
+typedef __fs_packed_prefix struct {
+   kal_uint32    TotalFATSectors;
+   NOR_MTD_Driver * MTDDriver;
+   void *      MTDData;
+   int  (* DiscardSectors) (void * DriveData, UINT Sector, UINT Sectors);
+   void (*ReclaimBlock) (void* DriveData, kal_bool isBackground);
+   kal_uint32    SecondPartitionSectors;
+   kal_uint32    HeaderSize[2];  //HeaderSize[0]: data block header size
+                                        //HeaderSize[1]: table block header size
+   kal_uint32    *InvalidEntryInTblBlk; //valid entry in table block
+   kal_uint32    TotalAvail[2];   // TotalAvail[0]: total available pages in data block
+                                         //TotalAvail[0]: total available tables in table block
+                                         //not include empty block (2 spare block)
+   kal_uint32    TotalInvalid[2]; // TotalInvalid[0]: total invalid pages in data block
+                                        //TotalInvalid[0]: total invalid tables in table block
+   kal_uint32    ReclHighThreshold[2]; //unit ReclHighThreshold[0]: Pages ReclHighThreshold[1]: Tables
+   kal_uint32    ReclLowThreshold[2];
+   kal_uint32    SystemThreshold[2];
+   kal_bool   NeedResumeFlag;
+   kal_bool   NeedFRecl;
+   LSMGEntry    *LSMG;            // logical sector mapping group table
+   WORD      ReclType;
+   WORD      *LBM;              //logical block mapping table
+   WORD      *AvailInBlk;     //available page in data block, available table in table block
+   WORD      *InvalidInBlk;     //valid  page in data block, valid table in table block
+   WORD      ActiveBlk[2];    // ActiveBlk[0]: active data block
+                                        //ActiveBlk[1]: active table block
+   WORD      ReclLogBlkID;  //ReclLogBlkID == INVALID_BLOCK_ID means no block need reclamation
+   WORD      ErasingPhyBlk;
+   WORD      ReclToPhyBlkID;
+   WORD      ReclFromPhyBlkID;
+   WORD      PageSizeShift;
+   WORD      BlkIDShift;
+   WORD      TblSizeShift;
+   WORD      TblIDShift;
+   WORD      PagesPerBlk;
+   WORD      TblsPerBlk;
+   WORD      TblBlks;
+   WORD      SetTblBlks;
+   WORD      DataBlks;
+   kal_uint32 MSTABLE_ENTRY_NUM;
+   MS_TABLE  MSTable;
+   BYTE      *Buffer;
+   BYTE      *CopyBuffer;
+}__fs_packed_postfix NOR_FTL_DATA;
+
+
+#ifndef __MTK_TARGET__
+#pragma pack()
+#endif
+
+typedef struct {
+   kal_uint32 Blocks;
+   kal_uint32 BlockSize;
+   kal_uint32 EraseCountMax;
+   kal_uint32 EraseCountMin;
+   kal_uint32 EraseCountAverage;
+   kal_uint32 SectorsInUse;
+   kal_uint32 SectorsDeleted;
+   kal_uint32 SectorsAvail;
+} NORFlashInfo;
+
+/* Definition for power loss test */
+#if defined(FLASH_DISKDRV_DEBUG) && defined(POWERLOSS_TEST)
+#include <setjmp.h>
+extern jmp_buf mark;
+extern int Test_CD_Value;
+#ifndef __NOR_FDM5__
+enum
+{
+/* 1*/WriteSector_SECTOR_WRITING = 1,
+/* 2*/WriteSector_SECTOR_WRITTEN,
+/* 3*/WriteSector_SECTOR_DELETED,
+/* 4*/WriteSector_SECTOR_VALID,
+/* 5*/WriteSector_SECTOR_MS_WRITTEN,
+/* 6*/ReclaimBlock_pre_BLOCK_RECLAIM,
+/* 7*/ReclaimBlock_pre_BLOCK_VIRGINE,
+/* 8*/ReclaimBlock_post_BLOCK_EMPTY,
+/* 9*/SetActiveBlock_BLOCK_FULL,
+/*10*/SetActiveBlock_BLOCK_ACTIVE,
+/*11*/ResumeSectorStates_SECTOR_MS_BEINGVALIDATED,
+/*12*/WriteSector_SECTOR_MOVING,
+/*13*/WriteSectors_Validate_MS_Sector
+};
+
+#define TEST_POINT(a)\
+   {\
+      switch(a)\
+      {\
+         case WriteSector_SECTOR_MS_WRITTEN:\
+         case ReclaimBlock_pre_BLOCK_RECLAIM:\
+         case ReclaimBlock_pre_BLOCK_VIRGINE:\
+         case ReclaimBlock_post_BLOCK_EMPTY:\
+         case SetActiveBlock_BLOCK_FULL:\
+         case SetActiveBlock_BLOCK_ACTIVE:\
+         case WriteSectors_Validate_MS_Sector:\
+            Test_CD_Value -= 50;\
+            break;\
+         case ResumeSectorStates_SECTOR_MS_BEINGVALIDATED:\
+            Test_CD_Value -= 50;\
+            break;\
+         default:\
+            Test_CD_Value--;\
+            break;\
+       }\
+      if(Test_CD_Value <= 0)\
+         longjmp(mark, a);\
+   }
+#else /*FDM5*/
+enum
+{
+/* 1*/ReclaimBlock_MARK_BLOCK_RECLAIM = 1,
+/* 2*/ReclaimBlock_MARK_BLOCK_COPYING,
+/* 3*/ReclaimBlock_TABLE_BLOCK_COPYING,
+/* 4*/ReclaimBlock_DATA_BLOCK_COPYING,
+/* 5*/ReclaimBlock_MARK_BLOCK_ERASING,
+/* 6*/ReclaimBlock_AFTER_ERASED,
+/* 7*/CopyTable_MARK_COPYING,
+/* 8*/CopyTable_MARK_ALLOCATING,
+/* 9*/CopyTable_MARK_VALID,
+/*10*/WritePage_MARK_TABLE_ENTRY_WRITING,
+/*11*/WritePage_MARK_TABLE_ENTRY_WRITTEN,
+/*12*/WritePage_MARK_PAGE_VALID,
+/*13*/WritePage_MARD_TABLE_ENTRY_MS_WRITING,
+/*14*/WritePage_MARD_TABLE_ENTRY_MS_BEGIN_VALID,
+/*15*/SetActiveBlock_BLOCK_FULL,
+/*16*/SetActiveBlock_BLOCK_ACTIVE
+};
+
+
+#define TEST_POINT(a)\
+   {\
+      switch(a)\
+      {\
+         case ReclaimBlock_MARK_BLOCK_RECLAIM:\
+         case ReclaimBlock_MARK_BLOCK_COPYING:\
+         case ReclaimBlock_TABLE_BLOCK_COPYING:\
+         case ReclaimBlock_DATA_BLOCK_COPYING:\
+         case ReclaimBlock_MARK_BLOCK_ERASING:\
+		 case ReclaimBlock_AFTER_ERASED:\
+		 case CopyTable_MARK_COPYING:\
+		 case CopyTable_MARK_ALLOCATING:\
+		 case CopyTable_MARK_VALID:\
+		 case WritePage_MARK_TABLE_ENTRY_WRITING:\
+		 case WritePage_MARK_TABLE_ENTRY_WRITTEN:\
+		 case WritePage_MARK_PAGE_VALID:\
+		 case WritePage_MARD_TABLE_ENTRY_MS_WRITING:\
+		 case WritePage_MARD_TABLE_ENTRY_MS_BEGIN_VALID:\
+		 case SetActiveBlock_BLOCK_FULL:\
+		 case SetActiveBlock_BLOCK_ACTIVE:\
+            Test_CD_Value -= 50;\
+            break;\
+         default:\
+            Test_CD_Value--;\
+            break;\
+       }\
+      if(Test_CD_Value <= 0)\
+         longjmp(mark, a);\
+   }
+#endif /*__NOR_FDM5__*/
+#define START_POINT  setjmp(mark)
+#else
+#define TEST_POINT(a)
+#define START_POINT
+#endif /* FLASH_DISKDRV_DEBUG */
+
+
+/* Function Prototype */
+int NOR_MountDevice(void * DriveData, int DeviceNumber, int DeviceType, kal_uint32 Flags);
+int NOR_ShutDown(void * DriveData);
+int NOR_ReadSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int NOR_WriteSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int NOR_MediaChanged(void * DriveData);
+int NOR_DiscardSectors(void * DriveData, kal_uint32 Sector, UINT Sectors);
+int NOR_GetDiskGeometry(void * DriveData, FS_PartitionRecord * DiskGeometry, BYTE * MediaDescriptor);
+int NOR_LowLevelFormat(void * DriveData, const char * DeviceName, FS_FormatCallback Progress, kal_uint32 Flags);
+int NOR_NonBlockWriteSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int NOR_RecoverableWriteSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int NOR_ResumeSectorStates(void * DriveData);
+
+int SIB_MountDevice(void * DriveData, int DeviceNumber, int DeviceType, kal_uint32 Flags);
+int SIB_ReadSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int SIB_WriteSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int SIB_DiscardSectors(void * DriveData, kal_uint32 Sector, UINT Sectors);
+int SIB_GetDiskGeometry(void * DriveData, FS_PartitionRecord * DiskGeometry, BYTE * MediaDescriptor);
+int SIB_LowLevelFormat(void * DriveData, const char * DeviceName, FS_FormatCallback Progress, kal_uint32 Flags);
+int SIB_NonBlockWriteSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int SIB_RecoverableWriteSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int SIB_ResumeSectorStates(void * DriveData);
+
+int nNOR_MountDevice(void * DriveData, int DeviceNumber, int DeviceType, kal_uint32 Flags);
+int nNOR_ReadSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int nNOR_WriteSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int nNOR_MediaChanged(void * DriveData);
+int nNOR_DiscardSectors(void * DriveData, kal_uint32 Sector, UINT Sectors);
+int nNOR_LowLevelFormat(void * DriveData, const char * DeviceName, FS_FormatCallback Progress, kal_uint32 Flags);
+int nNOR_NonBlockWriteSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int nNOR_RecoverableWriteSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int nNOR_ResumeSectorStates(void * DriveData);
+void nNOR_ReclaimBlock(void* DriveData, kal_bool isBackground);
+
+int nSIB_MountDevice(void * DriveData, int DeviceNumber, int DeviceType, kal_uint32 Flags);
+int nSIB_ReadSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int nSIB_WriteSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int nSIB_DiscardSectors(void * DriveData, kal_uint32 Sector, UINT Sectors);
+int nGetDiskGeometry(void * DriveData, FS_PartitionRecord * DiskGeometry, BYTE * MediaDescriptor);
+int nSIB_LowLevelFormat(void * DriveData, const char * DeviceName, FS_FormatCallback Progress, kal_uint32 Flags);
+int nSIB_NonBlockWriteSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int nSIB_RecoverableWriteSectors(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int nSIB_ResumeSectorStates(void * DriveData);
+void nSIB_ReclaimBlock(void* DriveData, kal_bool isBackground);
+int nShutDown(void * DriveData);
+
+int NOR_MountDevice_ext(void * DriveData, int DeviceNumber, int DeviceType, kal_uint32 Flags);
+int NOR_ShutDown_ext(void * DriveData);
+int NOR_ReadSectors_ext(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int NOR_WriteSectors_ext(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int NOR_MediaChanged_ext(void * DriveData);
+int NOR_DiscardSectors_ext(void * DriveData, kal_uint32 Sector, UINT Sectors);
+int NOR_GetDiskGeometry_ext(void * DriveData, FS_PartitionRecord * DiskGeometry, BYTE * MediaDescriptor);
+int NOR_LowLevelFormat_ext(void * DriveData, const char * DeviceName, FS_FormatCallback Progress, kal_uint32 Flags);
+int NOR_NonBlockWriteSectors_ext(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int NOR_RecoverableWriteSectors_ext(void * DriveData, kal_uint32 Sector, UINT Sectors, void * Buffer);
+int NOR_ResumeSectorStates_ext(void * DriveData);
+
+int OTPAccess(void * DriveData, int accesstype, UINT Offset, void * BufferPtr, UINT Length);
+int OTPQueryLength(void * DriveData, UINT *Length);
+
+
+// internal function for different version of FDM
+
+extern void MB_CompleteErase(NOR_FLASH_DRV_Data * D);
+
+
+   extern void FDM_LOCK(void);
+   extern void FDM_UNLOCK(void);
+   #define retriveFDMLock FDM_LOCK
+   #define releaseFDMLock FDM_UNLOCK  
+
+
+
+
+
+
+
+
+#if (defined __UBL__) || (defined __FUE__)
+   #define NORFDM_EXT_ASSERT(expr, e1, e2, e3) EXT_ASSERT(expr, e1, e2, e3)
+   #define NORFDM_ASSERT(expr) ASSERT(expr)
+#else
+   extern kal_uint32 NOR_FDM_Get_current_PC(void);
+   #define NORFDM_EXT_ASSERT(expr, e1, e2, e3) {if(!(expr)) {kal_fatal_error_handler(KAL_ERROR_FILESYS_NOR_FDM_INTERNAL_FAILED,  NOR_FDM_Get_current_PC());}}
+   #if defined(DEBUG_KAL)
+      #define NORFDM_ASSERT(x) {if(!(x)) {kal_fatal_error_handler(KAL_ERROR_FILESYS_NOR_FDM_INTERNAL_FAILED, NOR_FDM_Get_current_PC());}}
+   #else
+      #define NORFDM_ASSERT(x)
+   #endif
+#endif // __UBL__ || __FUE__
+
+
+#if defined(__MTK_TARGET__)
+#if defined(__UBL__) || defined(__FUE__)
+#define __nor_section_RAM             __attribute__ ((section ("INTERNCODE")))
+#define __nor_section_SECOND_PART     __attribute__ ((section ("SECOND_PART")))
+#define __nor_section_EMIINITCODE     __attribute__ ((section ("EMIINITCODE")))    
+#else // __MTK_TARGET__ && !(__UBL__ ||__FUE__) && !__SINGLE_BANK_NOR_FLASH_SUPPORT__
+#define __nor_section_RAM
+#define __nor_section_SECOND_PART
+#define __nor_section_EMIINITCODE
+#endif
+#else //!__MTK_TARGET__
+/* Reserve for  MoDIS */
+#define __nor_section_RAM
+#define __nor_section_SECOND_PART
+#define __nor_section_EMIINITCODE
+#endif //__MTK_TARGET__
+
+
+#endif   /* !DRVFLASH_H */
diff --git a/mcu/interface/driver/storage/DrvFlash_UT.h b/mcu/interface/driver/storage/DrvFlash_UT.h
new file mode 100644
index 0000000..dd3c6b2
--- /dev/null
+++ b/mcu/interface/driver/storage/DrvFlash_UT.h
@@ -0,0 +1,235 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2010
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ *  DrvFlash_UT.C
+ *
+ * Project:
+ * --------
+ *  MAUI
+ *
+ * Description:
+ * ------------
+ *  This file is used to configure NOR FDM unit test processure.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+Forbidden to use kal_internal_api.h and tst_ltlcom.h in modules other than KAL.
+
+[Check-in branch]
+MAUI
+MSBB_II_DEV
+
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+#ifndef DRVFLASH_UT_H
+#define DRVFLASH_UT_H
+
+//---------------------------------------------//
+// Included Header Files                       //
+//---------------------------------------------//
+
+#if defined(__MTK_INTERNAL__)
+#include "task_config.h"
+#endif //__MTK_INTERNAL__
+
+#include "kal_debug.h"
+
+//---------------------------------------------//
+// NOR FDM UT Test Item                        //
+//---------------------------------------------//
+typedef enum {
+   NOR_FDM_UT_RW_STRESS = 0,
+   NOR_FDM_UT_AUTO,
+   NOR_FDM_UT_AUTO_16HR,
+   NOR_FDM_UT_NORMAL_POWER_ON_OFF,
+   NOR_FDM_UT_RANDOM_POWER_LOSS,
+   NOR_FDM_UT_BUSY_POWER_LOSS,
+   NOR_FDM_UT_CFI,
+   NOR_FDM_UT_PROFILING,                
+   NOR_FDM_UT_ATE,
+   NOR_FDM_UT_BOOTROM,
+   NOR_FDM_UT_OTP,
+   NOR_FDM_UT_API,
+   NOR_MTD_UT_MEMORY_SLT,
+   NOR_MTD_UT_DEVICE_TEST
+} NOR_FDM_UT_Code;
+
+                                        
+//----------------------------------------------//
+// NOR FDM UT Test Variable Declaration         //
+//----------------------------------------------//
+
+extern kal_bool nor_fdm_dbg_enable; //declare in nor_test.c
+
+//-------------------------------------------------------
+// NOR Debug Trace Function/Macro
+//-------------------------------------------------------
+
+// NOR_TST_SYS_TRACE
+// basic_log
+// log_printf
+
+extern void dbg_print(char *fmt,...);
+
+// Define Catcher System Trace Macro for Internal Project
+// Remove IDLER task trace due to kal_change_priority is deprecated. 
+#if 0 //defined(__MTK_INTERNAL__)
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#else // !__MTK_INTERNAL__
+   #define NOR_TST_SYS_TRACE(str, ...)
+#endif //__MTK_INTERNAL__
+
+
+// Define UART Trace Macro
+#if defined(LOGGING)
+   #define basic_log(str, ...) do{\
+         kal_sprintf(dbg_text, str, ##__VA_ARGS__);\
+         dbg_print(dbg_text);\
+      }while(0)
+#else
+   #define basic_log(str, ...)
+#endif // LOGGINE || (__NOR_FLASH_HARDWARE_TEST__ && __MAUI_BASIC__)
+
+// Define UART Trace Macro in Basic Load
+   #define basic_printf(str, ...)
+   #define basic_print(str)
+
+// Define UART Trace Macro if LOGGING is defined
+#if defined(LOGGING)
+   #define log_printf  basic_log
+#else //!LOGGING
+   #define log_printf(str, ...)
+#endif // LOGGING
+
+
+
+
+//----------------------------------------------//
+// MT6280 NOR FDM AUTO Test Macros         //
+//----------------------------------------------//
+
+//MT6280 has no RTC to do AUTO test count. Therefore, numeric counter is written to NV Register to record count.
+
+
+#endif   /* !DRVFLASH_UT_H */
diff --git a/mcu/interface/driver/storage/NAND_DAL.h b/mcu/interface/driver/storage/NAND_DAL.h
new file mode 100644
index 0000000..d6df82d
--- /dev/null
+++ b/mcu/interface/driver/storage/NAND_DAL.h
@@ -0,0 +1,168 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ *  NAND_DAL.H
+ *
+ * Project:
+ * --------
+ *   MOLY
+ *
+ * Description:
+ * ------------
+ *   This is a NAND Flash Device Abstraction Layer file.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ *              HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+#ifndef NAND_DAL_H
+#define NAND_DAL_H
+
+/****************************
+ * Include Header Files     *
+ ****************************/
+#if defined(__DOWNLOAD_AGENT__) 
+#include "NAND_DA_internal.h"
+#include "NAND_DAL_internal.h"
+#endif
+#include "fota_error.h"
+// Add for RHR
+// RHR Remove    #include "kal_non_specific_general_types.h"
+#include "kal_general_types.h"
+// Add for RHR
+/*******************************************************************************
+ *  Operation error code for NFB functions
+ *******************************************************************************/
+#define ERROR_NFB_SUCCESS             (ERROR_FOTA_SUCCESS)
+#define ERROR_NFB_READ                (ERROR_FOTA_READ)
+#define ERROR_NFB_PROGRAM             (ERROR_FOTA_PROGRAM)
+#define ERROR_NFB_ERASE               (ERROR_FOTA_ERASE)
+#define ERROR_NFB_BAD_BLOCK           (ERROR_FOTA_BAD_BLOCK)
+#define ERROR_NFB_CHECKSUM            (ERROR_FOTA_NFB_CHECKSUM)
+#define ERROR_NFB_ECC_CORRECTED       (ERROR_FOTA_ECC_CORRECTED)
+#define ERROR_NFB_INVALID_PARAMETER	  (ERROR_FOTA_INVALID_PARAMETER)
+#define ERROR_NFB_NOT_INITIALIZED     (ERROR_FOTA_NOT_INITIALIZED)
+#define ERROR_NFB_CUSTOMIZATION       (ERROR_FOTA_CUSTOMIZATION)
+#define ERROR_NFB_MASK                (0x80000000)
+
+/**************************************
+ * Returns:     FS_NO_ERROR
+ *              FS_NAND_DEVICE_NOT_SUPPORTED
+ *              FS_FLASH_MOUNT_ERROR
+ *************************************/
+kal_int32 DAL_init (void);
+kal_uint32 DAL_GetBlockSize(void);
+kal_uint32 DAL_GetPageSize(void);
+kal_bool NANDsanitycheck_Factory(void);
+
+typedef enum
+{
+	NFB_READ_PAGE_ONLY_WITH_ECC = 0,
+	NFB_READ_PAGE_ONLY_WITHOUT_ECC,
+	NFB_READ_SPARE_ONLY_WITHOUT_ECC,
+	NFB_READ_PAGE_SPARE_WITHOUT_ECC,
+	NFB_READ_PAGE_FLAG_END
+}NFB_ReadPage_t;
+
+#ifdef _NAND_FLASH_BOOTING_
+
+int NFB_ProgramPhysicalPage(kal_uint32 PhyBlock, kal_uint32 PhyPage, void * Data, kal_bool DALRemap);
+
+int NFB_ProgramPhysicalSpare(kal_uint32 PhyBlock, kal_uint32 PhyPage, void * Data, kal_bool chksum, kal_bool DALRemap);
+
+int NFB_ErasePhysicalBlock(kal_uint32 PhyBlock, kal_bool DALRemap);
+
+int	NFB_MarkBadBlock(kal_uint32 PhyBlock, kal_bool DALRemap);
+
+int	NFB_ProgramPhysicalPageWithSpare(kal_uint32 PhyBlock, kal_uint32 PhyPage, void *Data, void *Spare, kal_bool DALRemap);
+
+kal_int32 NFB_ReadPhysicalPage(kal_uint32 PhyBlock, kal_uint32 PhyPage, void * Data);
+
+int NFB_ReadPhysicalSpare(kal_uint32 PhyBlock, kal_uint32 PhyPage, void * Data, kal_bool chksum);
+
+#if defined(__DOWNLOAD_AGENT__)
+int NFB_ForceEraseBlock(kal_uint32 PhyBlock, kal_bool DALRemap);
+kal_int32 NFB_ReadPhysicalPageSpareECC(kal_uint32 PhyBlock, kal_uint32 PhyPage, void * Data, void *Spare, NFB_ReadPage_t flag);
+kal_int32 NFB_GetFlashInfo(NFB_FLASH_INFO* flash_info_p);
+kal_uint32 NFB_HB_init(void * BufferPtr, kal_uint32 Length, kal_bool Scramble);
+kal_uint32 NFB_HB_QueryBlock(kal_uint32 Block, kal_uint32 QueryType);
+kal_uint32 NFB_HB_UpdateBadBlock(kal_uint32 phyBlock);
+kal_uint32 NFB_HB_WriteBack();
+#endif
+
+#if defined(__UBL__)
+kal_int32 NFB_SyncFlashInfo(void* flash_info_p, kal_uint32 len);
+#endif
+
+#if defined(__FOTA_DM__)
+kal_int32 NFB_ReadPhysicalPageWithSpare(kal_uint32 PhyBlock, kal_uint32 PhyPage, kal_uint8* Data);
+#endif // defined(__FOTA_DM__)
+
+kal_int32 NFB_CheckGoodBlock(kal_uint32 Block);
+
+kal_int32 NFB_CheckGoodBlock2(kal_uint32 Block, kal_bool DALRemap);
+
+kal_int32 demp_CheckGoodBlock(kal_uint32 Block);
+
+kal_int32 demp_ReadPhysicalPage(kal_uint32 PhyBlock, kal_uint32 PhyPage, void * Data);
+
+#endif //_NAND_FLASH_BOOTING_
+
+#endif /*NAND_DAL_H*/
diff --git a/mcu/interface/driver/storage/NAND_FDM.h b/mcu/interface/driver/storage/NAND_FDM.h
new file mode 100644
index 0000000..5d0520d
--- /dev/null
+++ b/mcu/interface/driver/storage/NAND_FDM.h
@@ -0,0 +1,1364 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ *  NAND_FDM.h
+ *
+ * Project:
+ * --------
+ *   MAUI
+ *
+ * Description:
+ * ------------
+ *   This is a NAND FDM header file
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ *              HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+
+#ifndef NAND_FDM_H
+#define NAND_FDM_H
+
+
+/*******************************************************************************
+ * Include Header Files
+ * FLASH_DISKDRV_DEBUG indicates simulation environment
+ *******************************************************************************/
+#ifdef __MTK_TARGET__ //Keneng
+#include "flash_opt.h"
+#endif
+#if defined(FLASH_DISKDRV_DEBUG) && !defined(__MTK_TARGET__)
+   #include <stdio.h>
+   #include <stdlib.h>
+   #include <assert.h>
+#else
+// RHR Remove        #include "kal_release.h"
+#endif
+
+// RHR Remove     #include <string.h>
+// Add for RHR
+    #include "fs_type.h"
+// RHR Remove     #include "kal_non_specific_general_types.h"
+    #include "kal_general_types.h"
+// Add for RHR
+/*******************************************************************************
+ * Compiler definition
+ *******************************************************************************/
+#if defined(__MTK_TARGET__)
+	#ifdef __DYNAMIC_SWITCH_CACHEABILITY__
+	   	#if defined (__ARMCC_VERSION)
+	   	#define __nandfdm_cache_align(x)   __attribute__ ((aligned(x), zero_init, section ("DYNAMICCACHEABLEZI_C")))
+	 	  #elif defined (__GNUC__)
+			#define __nandfdm_cache_align(x)   __attribute__ ((aligned(x), section ("DYNAMICCACHEABLEZI_C")))
+	    #endif /* ARMCC , GNUC */
+	  	
+	#else
+		#define __nandfdm_cache_align(x)
+	#endif
+#else /* __MTK_TARGET__ */
+	#define __nandfdm_cache_align(x)
+#endif /* __MTK_TARGET__ */
+
+/*******************************************************************************
+ * parameter definition
+ *******************************************************************************/
+
+//#define POWERLOSS_TEST             // power recovery test in simulation
+//#define ERROR_HANDLING_TEST   // error handling test in simulation
+#define DDWORD_INVALID           ((kal_uint64)~0)
+#define DWORD_INVALID            0xFFFFFFFF
+#define WORD_INVALID             0xFFFF
+#define BYTE_INVALID             0xFF
+#define FDM_ERROR                1
+#define FDM_NO_ERROR             0
+
+/* Public drive size customization constraints */
+#define NAND_MINIMUM_PARTITION_SIZE     (400)
+#define MAX_DATA_SIZE            		2048	// Max NAND page size used for MMU.
+
+#if defined(__NAND_FDM_50__)
+
+#include "NAND_MTD_FDM50_internal.h"
+#include "NAND_DAL.h"
+#include "NAND_DAL_internal.h"
+
+
+
+// If support RAW disk
+#define RAW_DISK_INDEX      5
+
+#define NUM_ACTIVESLOT			5
+#define NUM_ACTIVESECT			4		// This number should be one less than NUM_ACTIVESLOT because need to consider the power-loss.
+
+// Block mark in spare area.
+#define BM_LBM					0x6688
+#define BM_PMT					0x8866
+#define BM_NONBMR				0xf0d0
+#define BM_BRMT					0x0d0f
+#define BM_FDM4XCTL				0xf00f
+#define BRMT_FDM52      0x5200
+#define BM_RAW          0x7264 // Raw disk, rd
+
+// Newest data location.
+#define SOURCEDATA_NONBMR		0
+#define SOURCEDATA_BMR			1
+#define SOURCEDATA_DATA			2
+
+#define R_SHIFT					10		// Region shift bit number.
+#define LSMT_SECTORNUM			5		// 2K for LSMT and 512 for active block information.
+#define LSMT_SIZE		        1024
+#define BRMT_SIZE				256		// The number of entries in BRMT load into RAM one time.
+#define PMT_SIZE				512		// The number of entries in PMT.
+#define NUM_OF_ZONES			8
+#define NUM_OF_BANK				8
+#define NUM_OF_REGION			8		//** Max number of regions per zone. This is used to save LSMT block address.
+#define PSECTION_NUM_R			1024
+#define LSECTION_NUM_R			1010
+#define NUM_ERASE_QUEUE			14
+#define BMR_THRESHOLD			16
+
+#define LSMT_EMPTY				0x8000
+#define LSMT_NOT_EMPTY			0x7fff
+#define LSMT_NOT_REMAP			0x4000
+#define LSMT_REMAP				0xbfff
+#define LSMT_SS					0x3000
+#define LSMT_VALID				0x0800
+#define LSMT_PSA				0x07ff
+
+
+#define NONBMR_INVALID					0
+#define NONBMR_ONLYVALID_AFTER_BMRLAST	1
+#define NONBMR_VALID					2
+
+#ifdef __MTK_TARGET__
+#include <ex_public.h>
+#endif
+
+
+// Structure definition for FDM
+
+typedef struct
+{
+	kal_uint16	LSectionAddr;
+	kal_uint16	BMR_PSection;
+	kal_uint16	BMR_LastPage;
+	kal_uint16	NonBMR_PSection;
+	kal_uint16	NonBMR_LastPage;
+	kal_uint16	NonBMR_TablePage;
+	kal_uint16	NumNoUse;
+} ACTIVE_INFO;
+
+typedef struct
+{
+	kal_uint16	PSectionAddr;
+	kal_uint16	EmptyPageAddr;
+	kal_uint8	CurActive;
+} PMT_INFO;
+
+typedef struct
+{
+	kal_uint32    	total_FAT_sectors;     // total sectors that FAT can use
+	kal_uint32    	partition_sectors;     // partiton sectors that FAT can use
+} FAT_INFO;
+
+typedef struct
+{
+	kal_uint16	PSect;
+	kal_uint16	Page;
+} LSMT_INFO;
+
+typedef struct
+{
+	kal_uint16	SectionBuf[16];
+	kal_uint8	Head;
+	kal_uint8	Tail;
+} ERASE_QUEUE;
+
+
+
+typedef struct
+{
+	kal_uint8				Zone;
+	kal_uint8				NewZone;
+	kal_uint8				Region;
+	kal_uint8				NewRegion;
+	kal_uint16				LSect;
+	kal_uint16				PSect;
+	kal_uint16				LPage;
+	kal_uint16				PPage;
+} ADDR_INFO;
+
+typedef struct
+{
+	kal_uint16				LSectAddr;
+	kal_uint16				NumCycles;
+} WEAR_INFO;
+
+#if defined(__NANDFDM_TOTAL_BBM__)
+
+typedef union _FDMTABLE {
+    struct {
+    	kal_uint32	Sector[1024];
+    } All;
+    struct {
+		kal_uint16	LSM[LSMT_SIZE];     // Map logical to physical block.
+		kal_uint16	PMT[PMT_SIZE];		// Map logical to physical page. Need to enlarge in case of MLC+interleave+2P (128*2*2)
+//		kal_uint16	BRMT[BRMT_SIZE];	// Map bad block into good block in replacement area.
+		kal_uint16	RESERVRD[BRMT_SIZE];	// Map bad block into good block in replacement area.
+		kal_uint16	Buffer[256];		// Temp buffer.
+    } T;
+    struct {
+    	kal_uint16	BRMT[2048];			// Low level format use. One time 4K write for future 4K page flash.
+    } A;
+    struct {
+    	kal_uint8	Sector[8][512];
+    } S;
+} FDM_TABLE;
+
+typedef struct
+{
+	kal_uint8	  RegionNum;
+	kal_uint16	LSectionNum;
+	kal_uint16	PSectionNumLastR;
+	kal_uint16	LSectionNumLastR;
+	kal_uint16	RegionInitMask;
+	LSMT_INFO	  LSMT[NUM_OF_REGION];
+} ZONE_INFO;
+
+typedef struct
+{
+  kal_bool        ParameterReady;
+  kal_bool	      NoReplace;
+  kal_uint16      BRMT_Addr;
+  kal_uint16      BRMT_LastPSection;             // Global , must be (0x8000|xxxx)
+  kal_uint16      ReplaceBeginSection;            // Global , must be (0x8000|xxxx)
+  kal_uint16      ReplaceBlockBegin[NUM_OF_BANK]; // Global , must be (0x8000|xxxx)
+  kal_uint16      CurSectorInRAM;
+  kal_uint16      LastPage;
+  kal_uint16	    BRMT_Table[BRMT_SIZE];	// Map bad block into good block in replacement area.
+} BBM_BRMT_INFO;
+
+typedef struct
+{
+	kal_uint8				PageNumInBuffer;
+	kal_uint8 				CurActive;
+  kal_bool        NeedRebuildAll;
+	kal_bool				WriteProtect;
+	kal_bool				PMTInRAMModified;
+	kal_bool				NewActive;
+	kal_uint16     			TotalPSectionNum;
+	ERASE_QUEUE				EraseQueue;
+	ZONE_INFO				ZoneInfo[NUM_OF_ZONES];
+	ACTIVE_INFO				ActiveInfo[NUM_ACTIVESLOT];
+	FDM_TABLE				FDMTable;
+	PMT_INFO				PMTInfo;
+	WEAR_INFO				WearInfo;
+	kal_uint16				DATA_PSection;
+	kal_uint16				DataBank[NUM_OF_BANK];
+	kal_uint16				NewBank[NUM_OF_BANK];
+	kal_uint16				BMRBank[NUM_OF_BANK];
+	kal_uint16				NonBMRBank[NUM_OF_BANK];
+	kal_uint16				NewPSect;
+	kal_uint16				ActiveOrder;
+#if defined(__NANDFDM_MULTI_INSTANCE__)
+	kal_uint8 				DiskIndex;
+	kal_bool				is_mount;
+#endif // defined(__NANDFDM_MULTI_INSTANCE__)
+} NANDFDM5_DATA;
+
+#else // defined(__NANDFDM_TOTAL_BBM__)
+typedef union _FDMTABLE {
+    struct {
+    	kal_uint32	Sector[1024];
+    } All;
+    struct {
+		kal_uint16	LSM[LSMT_SIZE];     // Map logical to physical block.
+		kal_uint16	PMT[PMT_SIZE];		// Map logical to physical page. Need to enlarge in case of MLC+interleave+2P (128*2*2)
+		kal_uint16	BRMT[BRMT_SIZE];	// Map bad block into good block in replacement area.
+		kal_uint16	Buffer[256];		// Temp buffer.
+    } T;
+    struct {
+    	kal_uint16	BRMT[2048];			// Low level format use. One time 4K write for future 4K page flash.
+    } A;
+    struct {
+    	kal_uint8	Sector[8][512];
+    } S;
+} FDM_TABLE;
+
+typedef struct
+{
+	kal_uint16	BRMT_Addr[NUM_OF_ZONES];
+	kal_uint16	ReplaceBlockBegin[NUM_OF_BANK];
+	kal_uint16	CurSectorInRAM;
+	kal_uint16  LastPage[NUM_OF_ZONES];
+} BRMT_INFO;
+
+typedef struct
+{
+	kal_uint16	LSectionNum;
+	kal_bool	NoReplace;
+	kal_uint8	ReplaceBeginRegion;
+	kal_uint16	ReplaceBeginSection;
+	kal_uint16	PSectionNumLastR;
+	kal_uint16	LSectionNumLastR;
+	kal_uint8	RegionNum;
+	kal_uint16	RegionInitMask;
+	LSMT_INFO	LSMT[NUM_OF_REGION];
+} ZONE_INFO;
+
+typedef struct
+{
+	kal_uint8				PageNumInBuffer;
+	kal_uint8 				CurActive;
+	kal_bool				WriteProtect;
+	kal_bool				PMTInRAMModified;
+	kal_bool				NewActive;
+	kal_uint16     			TotalPSectionNum;
+	ERASE_QUEUE				EraseQueue;
+	ZONE_INFO				ZoneInfo[NUM_OF_ZONES];
+	BRMT_INFO				BRMTInfo;
+	ACTIVE_INFO				ActiveInfo[NUM_ACTIVESLOT];
+	FDM_TABLE				FDMTable;
+	PMT_INFO				PMTInfo;
+	WEAR_INFO				WearInfo;
+	kal_uint16				DATA_PSection;
+	kal_uint16				DataBank[NUM_OF_BANK];
+	kal_uint16				NewBank[NUM_OF_BANK];
+	kal_uint16				BMRBank[NUM_OF_BANK];
+	kal_uint16				NonBMRBank[NUM_OF_BANK];
+	kal_uint16				NewPSect;
+	kal_uint16				ActiveOrder;
+#if defined(__NANDFDM_MULTI_INSTANCE__)
+	kal_uint8 				DiskIndex;
+	kal_bool				is_mount;
+#endif // defined(__NANDFDM_MULTI_INSTANCE__)
+} NANDFDM5_DATA;
+
+#endif // defined(__NANDFDM_TOTAL_BBM__)
+
+typedef struct
+{
+#ifndef __MTK_TARGET__
+	const char				*file_name;
+	void					*flash_device;
+#endif
+//	kal_uint32				*MainBuf;
+//	kal_uint32				*SpareBuf;
+	FAT_INFO				flash_info;
+#if defined(__NANDFDM_MULTI_INSTANCE__)
+	NANDFDM5_DATA 			NAND_FDMData;
+	FLASH_INFO 				FlashInfo;
+	ADDR_INFO 				CurAddr;
+#endif // defined(__NANDFDM_MULTI_INSTANCE__)
+} NAND_FLASH_DRV_DATA;
+
+// FDM I/F function declaration
+
+kal_int32 FDM5_MountDevice		(void * DriveData, int DeviceNumber, int DeviceType, kal_uint32 Flags);
+kal_int32 FDM5_ShutDown			(void * DriveData);
+kal_int32 FDM5_ReadSectors		(void * DriveData, kal_uint32 Sector, kal_uint32 Sectors, void * Data);
+kal_int32 FDM5_WriteSectors		(void * DriveData, kal_uint32 Sector, kal_uint32 Sectors, void * Data);
+kal_int32 FDM5_MediaChanged		(void * DriveData);
+kal_int32 FDM5_DiscardSectors	(void * DriveData, kal_uint32 Sector, kal_uint32 Sectors);
+kal_int32 FDM5_GetDiskGeometry	(void * DriveData, FS_PartitionRecord * DiskGeometry, kal_uint8 * MediaDescriptor);
+kal_int32 FDM5_LowLevelFormat	(void * DriveData, const char * DeviceName, FS_FormatCallback Progress, kal_uint32 Flags);
+int FDM5_CopySectors			(void *DriveData, kal_uint32 SrcSector , kal_uint32 DstSector, kal_uint32 Sectors);
+kal_int32 FDM5_DiskNeedFormat	(void * DriveData);
+kal_int32 FDM5_OTPAccess		(void * DriveData, kal_int32 accesstype, kal_uint32 Offset, void * BufferPtr, kal_uint32 Length);
+kal_int32 FDM5_OTPQueryLength	(void * DriveData, kal_uint32 *LengthPtr);
+kal_int32 FDM5_IOCtrl			(void * DriveData, UINT CtrlAction, void * CtrlData);
+kal_int32 FDM5_LSN2PPN(void * DriveData, kal_uint32 Sector);
+#if defined(_NAND_FLASH_BOOTING_)
+kal_uint32 EraseRawDataItem(kal_uint32 block_idx);
+kal_uint32 ReadRawDataItem(kal_uint32 block_idx, kal_uint32 page_idx, kal_uint32 length, kal_uint8* data_ptr);
+kal_uint32 WriteRawDataItem(kal_uint32 block_idx, kal_uint32 page_idx, kal_uint32 length, kal_uint8* data_ptr);
+#endif //#if defined(_NAND_FLASH_BOOTING_)
+#if defined(__AUDIO_DSP_LOWPOWER__)
+void FDM5_Fill_PSTMap(void * DriveData, FS_NANDPMapQuery *pPSTMapQuery);
+#endif //#if defined(__AUDIO_DSP_LOWPOWER__)
+
+
+
+#else // __NAND_FDM_50__
+
+
+#include "NAND_MTD.h"
+#include "NAND_MTD_internal.h"
+
+
+#if !defined __NFI_VERSION2__
+    #define LSN_INVALID           (DWORD_INVALID)
+#else
+    #define LSN_INVALID           (0x00FFFFFF)
+#endif
+
+
+// FIXME - Remember to rocover correct value check in.
+#define POOL_SIZE                12    // used for non-data blocks in a region (double in first region)
+#define GC_THRESHOLD             25
+#define TRY_TIMES                3
+
+
+#define MAX_REGION_NUM           72    // max disk volumn = 2GB
+#define MAX_PAGES_PER_BLOCK      64
+#define MAX_SECTORS_PER_PAGE     4
+
+#define MAX_PAGE_SIZE            2112
+#define MAX_SPARE_SIZE           64
+#define SECTOR_SIZE              512
+#define MAX_CTRL_LOG_NUM         5   /*Max number of control_log block*/
+/* page size */
+enum
+{
+    PAGE_512,
+    PAGE_2K
+};
+
+/* indicate if write ECC fields while program page */
+enum
+{
+    ECC_SKIP = 0,            // don't program spare area
+    ECC_FIRST_HALF,      // only program first and second ECC fields
+    ECC_SECOND_HALF,     // only program third and fourth ECC fields
+    ECC_WHOLE,            // program whole ECC fields
+    ECC_NFB				// program whole ECC fields in NFB format
+};
+
+
+
+/*******************************************************************************
+ * block/page/sector state ID
+ *******************************************************************************/
+#define BLOCK_EMPTY              0xFF
+#define BLOCK_CONTROL            0xFC
+#define BLOCK_ALLOCATED          0xAF    /*use to avoid double allocate at LocateBlock or LocateEmptyBlock*/
+#define BLOCK_ACTIVE             0xAE
+#define BLOCK_DATA               0xAC
+#define BLOCK_BAD                0x00
+#define BLOCK_NG_CONTROL         0xC3
+#define BLOCK_CTRL_LOG           0xC0    // Old control block, reserve as a record
+#define BLOCK_COPY_DST           0xAA    /*copy destination block*/
+#define BLOCK_MERGE_BMR0         0xA9    /*active merge destination when BMR = 0*/
+#define BLOCK_MERGE_BMR1         0xA8    /*active merge destination when BMR = 1*/
+#define BLOCK_ERASING            0x07    /*Ready to erase*/
+
+#define PAGE_EMPTY               0xFF
+#define PAGE_DATA                0x0F
+#define PAGE_DELETED             0x00
+#define PAGE_LOG                 0x3F   /*For log section - 2007/05/29 Yehudi*/
+
+#define SECTOR_EMPTY             0xFF
+#define SECTOR_DATA              0x0F
+#define SECTOR_CONTROL           0xF0    // control block header
+#define SECTOR_CTRL_LOG          0xC0    // Old control block, reserve as a record
+#define SECTOR_BST               0x33    // block status table
+#define SECTOR_LBM               0xCC    // logical block mapping
+#define SECTOR_SPOT              0x55   // yoda add for reserving spot
+#define SECTOR_DELETED           0x00
+#define SECTOR_LOG               0x3F   /*For log section - 2007/05/29 Yehudi*/
+
+/*******************************************************************************
+ * Macro definition used for code simplification
+ *******************************************************************************/
+#define R_BLOCKS                256   /* Default(Maximun) value of block number of region. REGION_B(b) is the real block number of region(b)*/
+#define B_PAGES                 (D->flash_info.pages_per_block)
+#define P_SECTORS               ((D->flash_info.page_type==PAGE_2K) ? 4 : 1)
+#define DATA_SIZE               ((D->flash_info.page_type==PAGE_2K) ? 2048 : 512)
+#define SPARE_SIZE              ((D->flash_info.page_type==PAGE_2K) ?   64 :  16)
+#define LOG_BLOCKS              ((D->flash_info.page_type==PAGE_2K) ? 3 : 6)    /*Block number of log section - Yehudi*/
+#define PAGE_SIZE               ((DATA_SIZE)+(SPARE_SIZE))
+#define P_SHIFTS                ((D->flash_info.page_type==PAGE_2K) ? 2 : 0)
+
+/* region info */
+#define CUR_R                   (D->region_info.current_region)
+#define BASE_B                  (D->region_info.base_block)
+#define REGION_B(b)             (D->region_info.region_block[(b)])              /*2007/05/26 Yehudi*/
+
+/* control info */
+#define LBM(b)                  (D->control_table.block_mapping[(b)])
+#define BST(b)                  (D->control_table.block_state[(b)])
+#define CNT_PB                  (D->control_info.physical_block)
+
+/* active info */
+#define ACT_LB                  (D->active_info.logical_block)
+#define ACT_PB                  (D->active_info.physical_block)
+#define ACT_LPM(p)              (D->active_info.page_mapping[(p)])
+
+#define IS_VALID_DATA_BLOCK(b)  (LBM(b)!=BYTE_INVALID || (LBM(b)==255 && LBM(255)==b))
+#define IS_INVALID_DATA_BLOCK(b)(LBM(b)==BYTE_INVALID && LBM(255) != b)
+#define SET_FLAG_FOR_PHY255(log_b,phy_b)\
+{\
+if( ((kal_uint8)(phy_b)) == 255)\
+      LBM(255) = (kal_uint8)(log_b);\
+}
+
+#define IS_2K_CNTL_TABLE(half,ptr)\
+   ( ((half)==0) && (((spare_2k*)(ptr))->spare[0].SS == SECTOR_BST)\
+      && (((spare_2k*)(ptr))->spare[1].SS == SECTOR_LBM) )\
+   || ( ((half)==1) && (((spare_2k*)(ptr))->spare[2].SS == SECTOR_BST)\
+      && (((spare_2k*)(ptr))->spare[3].SS == SECTOR_LBM) )
+
+#define IS_2K_CNTL_SPOT(half,ptr)\
+   ( ((half)==0) && (((spare_2k*)(ptr))->spare[0].SS == SECTOR_SPOT))\
+   || ( ((half)==1) && (((spare_2k*)(ptr))->spare[2].SS == SECTOR_SPOT))
+
+#define IS_2K_NEXT_CNTL_TABLE(half,ptr)\
+   ( ((half)==0) && (((spare_2k*)(ptr))->spare[0].SS == SECTOR_EMPTY)\
+      && (((spare_2k*)(ptr))->spare[1].SS == SECTOR_EMPTY) )\
+   || ( ((half)==1) && (((spare_2k*)(ptr))->spare[2].SS == SECTOR_EMPTY)\
+      && (((spare_2k*)(ptr))->spare[3].SS == SECTOR_EMPTY) )
+
+#define IS_512_CNTL_TABLE(spare0,spare1)\
+   spare_512_PS(spare0)==SECTOR_BST && spare_512_PS(spare1)==SECTOR_LBM
+
+#define IS_512_CNTL_SPOT(spare0,spare1)\
+   spare_512_PS(spare0)==SECTOR_SPOT
+
+
+#define IS_512_NEXT_CNTL_TABLE(spare0,spare1)\
+   spare_512_PS(spare0)==SECTOR_EMPTY && spare_512_PS(spare1)==SECTOR_EMPTY
+
+/* MTK FDM signature mark */
+#define BAD_BLOCK_MARK_2K   (0x4242)
+#define BAD_BLOCK_MARK_512  (0x42)
+#define MTK_SIGNATURE_MARK   (0x4B544D)
+#define FDM_SIGNATURE_MARK   (0x4D4446)
+#define FDM_CHECK_MARK_1  (0xF0)
+#define FDM_CHECK_MARK_2  (0x0F)
+#define FDM_NG_CONTROL_BLOCK_MARK  (0x8000)      /*This mark means the correct control block does not exist - Yehudi*/
+
+#define FDM_TABLE_MARK_POSITION         (2)      /*Use by Control Table*/
+
+/* MTK NAND FDM control block header layout */
+#define FDM_CONTROL_BACKUP_POSITION     (256)
+#define FDM_RESERVED_POOL_SIZE_POSITION (64)    /*Reserve 4 byte - Yehudi*/
+#define FDM_VERSION_POSITION (68)               /*Reserve 4 byte - Yehudi*/
+
+//#define FDM_REGION_BLOCK_POSITION (72)          /*Reserve 4 byte - Yehudi*/
+//#define FDM_TIME_INFO_POSITION (76)             /*Reserve 8 byte - Yehudi*/
+//#define FDM_CBLK_PROGRAM_COUNT_POSITION (80)    /*Reserve 4 byte - Yehudi*/
+/*******************************************************************************
+ * structure definition for spare area of 2k/512 page-size
+ *******************************************************************************/
+#ifdef __MTK_TARGET__
+#include <ex_public.h>
+#else
+#define INT_QueryExceptionStatus() (KAL_FALSE)
+
+// pragma is used for specific bytes in a structure
+    #pragma pack(1)
+#endif
+
+typedef struct control_block_header_tag
+{
+    kal_uint8   mtk_fdm_mark[64];
+    kal_uint8   erase_pool_size;    /*position 64*/
+    kal_uint8   reserve1[3];
+    kal_uint16  version_info;       /*position 68*/
+    kal_uint8   reserve2[2];
+    kal_uint16  cur_region_block;   /*position 72*/
+    kal_uint16  next_region_block;  /*position 74*/
+    kal_uint32  create_time;        /*position 76*/
+    kal_uint64  program_count;      /*position 80 (position at 8 byte alignment for PC )*/
+}control_block_header; /*The total size should not over FDM_CONTROL_BACKUP_POSITION - Yehudi*/
+
+#if !defined __NFI_VERSION2__
+    typedef struct spare_2k_component_tag
+    {
+        kal_uint16     BI;               // block info
+        kal_uint8     SS;                // sector state
+        kal_uint8     Reserved0;
+        kal_uint32    LSN;           // logical sector number
+        kal_uint32    ECC;
+        kal_uint16     Reserved;     /*In FDM 4.3, spare[2].Reserved & spare[3].Reserved will put fdm_data_time_info_struct*/
+        kal_uint16     LSN_Chk;
+    } spare_2k_component;
+
+    /* Use spare[3]'s Reserved0 as page state */
+    #define spare_2k_PS(p)          ( ((spare_2k*)(p))->spare[3].Reserved0 )
+    #define spare_2k_LCHK(p, s)     ( ((spare_2k*)(p))->spare[s].LSN_Chk )
+    #define spare_2k_VER(p)         ( ((spare_2k*)(p))->spare[0].LSN_Chk )
+    #define spare_2k_HCHK(p)        ( ((spare_2k*)(p))->spare[0].Reserved0 )
+
+#else
+    typedef struct spare_2k_component_tag
+    {
+        kal_uint16     BI;               // block info
+        kal_uint8     PC;                // Page state/FDM_Chk_MARK
+        kal_uint8     SS;                // sector state
+        kal_uint32    LSN:24;           // logical sector number
+        kal_uint32    LSN_Chk:8;           // logical sector number chksum
+        kal_uint32    ECC[2];
+    } spare_2k_component;
+
+    #define spare_2k_PS(p)          ( ((spare_2k*)(p))->spare[3].PC )
+    #define spare_2k_LCHK(p, s)     ( ((spare_2k*)(p))->spare[s].LSN_Chk )
+    #define spare_2k_HCHK(p)        ( ((spare_2k*)(p))->spare[0].PC )
+
+#endif
+
+typedef struct spare_2k_tag
+{
+    spare_2k_component spare[4];
+} spare_2k;
+
+#if !defined __NFI_VERSION2__
+typedef struct spare_512_tag
+{
+    kal_uint32    ECC;
+    kal_uint8     SS;         // sector state
+    kal_uint8     BI;         // block info
+    kal_uint8     Reserved[4]; /*In FDM 4.3, it will put fdm_data_time_info_struct*/
+    kal_uint16    LSN_Chk;
+    kal_uint32    LSN;        // logical sector number
+} spare_512;
+
+#define spare_512_PS(p)                 ( ((spare_512*)(p))->SS )
+#define spare_512_LCHK(p)               ( ((spare_512*)(p))->LSN_Chk )
+#define spare_512_VER(p)                ( ((spare_512*)(p))->LSN_Chk )
+#define spare_512_HCHK(p)               ( ((spare_512*)(p))->Reserved[0] )
+
+#else
+    typedef struct spare_512_tag
+    {
+        kal_uint32    LSN:24;           // logical sector number
+        kal_uint32    LSN_Chk:8;       // logical sector number chksum
+        kal_uint8     Reserved[1];
+        kal_uint8     BI;              // block info
+        kal_uint8     PC;              // FDM_Chk_MARK
+        kal_uint8     SS;              // sector state
+        kal_uint32    ECC[2];
+    } spare_512;
+
+    #define spare_512_PS(p)                 ( ((spare_512*)(p))->SS )
+    #define spare_512_LCHK(p)               ( ((spare_512*)(p))->LSN_Chk )
+    #define spare_512_HCHK(p)               ( ((spare_512*)(p))->PC )
+
+#endif
+
+#ifndef __MTK_TARGET__
+#pragma pack()
+#endif
+
+/*******************************************************************************
+ * structure definition for driver data
+ *******************************************************************************/
+typedef enum
+{
+  BBMARK_1,	// First and second page of each block.
+  BBMARK_2	// First and last page of each block.
+} BBMARK_STYLE;
+
+typedef struct flash_info_tag
+{
+    kal_uint32    id_data[2];
+    kal_uint16     block_num;            /*total FAT block number, not include log block - Yehudi*/
+    kal_uint8     region_num;
+    kal_uint8     pages_per_block;
+    kal_uint8     page_type;
+    kal_uint8       address_cycle;
+    kal_uint8       io_width;
+    kal_uint8       log_block;           /*block number of log section - Yehudi*/
+    kal_uint16     bad_num;
+    kal_uint32    total_FAT_sectors;     // total sectors that FAT can use
+    kal_uint32    partition_sectors;     // partiton sectors that FAT can use
+    kal_uint32    region_sectors[MAX_REGION_NUM];  // LBB design
+	kal_uint32	  TotalSize;
+	BBMARK_STYLE  BBMarkStyle;
+} flash_info_struct;
+
+
+typedef struct region_info_tag
+{
+
+    kal_uint16     control_block[MAX_REGION_NUM];
+    kal_uint16     region_block[MAX_REGION_NUM+1]; /*block number of the region - Yehudi*/
+    kal_uint32     base_block;
+    /* Adjust to be 4 byte alignment */
+
+    kal_uint8     control_next_index[MAX_REGION_NUM]; // next programmable page
+    kal_uint8     current_region;
+    kal_uint8     erase_pool[MAX_REGION_NUM];   // LBB design
+    kal_uint32    base_LSN;
+    kal_uint32    end_LSN;
+} region_info_struct;
+
+
+typedef struct control_info_tag
+{
+    kal_uint16     physical_block;
+    kal_uint8     next_index; // next programmable page index ?? -- kirk
+    kal_uint8     modified_flag;
+    kal_uint16     version;
+} control_info_struct;
+
+
+typedef struct control_table_tag
+{
+    kal_uint8     block_state[R_BLOCKS];        // physical block state
+    kal_uint8     erase_count[R_BLOCKS];        // erase count of physical block
+    kal_uint8     block_mapping[R_BLOCKS];      // map logical to physical block
+} control_table_struct;
+
+typedef struct ctrl_table_extra_info_tag
+{
+    kal_uint8   reserve1[2];
+    kal_uint8   table_mark;             /* controbl table mark, must at position FDM_TABLE_MARK_POSITION*/
+    kal_uint8   reserve2[9];
+    kal_uint32  create_time;            /*position 12*/
+    kal_uint64  program_count;          /*position 16 (position at 8 byte alignment for PC )*/
+    kal_uint16  active_logical_block;
+    kal_uint16  active_physical_block;
+    kal_uint8   active_bmr_flag;
+    kal_uint8   active_next_index;                            // next programmable page index
+    kal_uint32  code_md5[16/4];        /*position 32: MD5 of BST and LBM, size must match 2rd parameter of CHE_md5_finish() */ /*MAUI_00618203*/
+}ctrl_table_extra_info;
+
+typedef enum
+{
+    CLOSE_REGION_MARK      = 0x20,
+    NORMAL_SHUTDOWN_MARK   = 0x31,
+    MERGEACTIVE_MARK1      = 0x40,
+    MERGEACTIVE_MARK2      = 0x42,
+    MERGEACTIVE_MARK3      = 0x44,
+    RECONSTRUCTED_MARK     = 0x52,
+    COPY_MARK              = 0x60,
+    SPOT_MARK              = 0x62,
+    NONE_MARK              = 0xFF
+} ControblTableMark;
+
+typedef struct active_info_tag
+{
+    kal_uint16     logical_block;                         // logical number of active block
+    kal_uint16     physical_block;                        // physical number of active block
+    kal_uint8     next_index;                            // next programmable page index
+    kal_uint8     bmr_flag;                              // indicate if active block fits block mappingn rule
+    /*kal_uint8     first_page;*/
+    kal_uint8     page_mapping[MAX_PAGES_PER_BLOCK];     // map logical to physical page
+} active_info_struct;
+
+
+typedef struct sequential_info_tag
+{
+    kal_uint16     physical_block; // which physical block this information is for.
+    kal_uint8     last_index;     // The page offset on which the last programming operation is performed.
+} seq_info_struct;
+
+
+typedef struct dup_block_tag
+{
+    kal_uint16 l_block;
+    kal_uint16 p_block;
+} dup_block_struct;
+
+
+typedef  struct
+{
+    NAND_MTD_DRIVER         * MTD;
+
+#ifndef __MTK_TARGET__
+    const char              * file_name;
+    void                    * flash_device;
+#endif
+
+    flash_info_struct        flash_info;
+    region_info_struct       region_info;
+    control_info_struct      control_info;
+    control_table_struct     control_table;
+    active_info_struct       active_info;
+    seq_info_struct          seq_info;
+
+
+    kal_uint32                       buffer[MAX_PAGE_SIZE/sizeof(kal_uint32)];
+    kal_uint32                       spare0[MAX_SPARE_SIZE/sizeof(kal_uint32)];
+    kal_uint32                       spare1[MAX_SPARE_SIZE/sizeof(kal_uint32)];
+    //kal_uint32                     badspare[MAX_SPARE_SIZE/sizeof(kal_uint32)];//TODO: should check whether this is necessary
+
+} NAND_FLASH_DRV_DATA;
+
+typedef struct fdm_global_time_info_tag
+{
+    kal_uint32 Second:6;
+    kal_uint32 Minute:6;
+    kal_uint32 Hour:5;
+    kal_uint32 Day:5;
+    kal_uint32 Month:4;
+    kal_uint32 Year2000:6;
+} fdm_global_time_info_struct;
+
+
+typedef struct fdm_data_time_info_tag
+{
+    kal_uint32 Count:9;
+    kal_uint32 Second:6;
+    kal_uint32 Minute:6;
+    kal_uint32 Hour:5;
+    kal_uint32 Day:5;
+    kal_uint32 Month:1;
+} fdm_data_time_info_struct;
+
+typedef struct fdm_log_section_info_tag
+{
+    kal_uint8     is_init;
+    kal_uint32    log_start_page;
+    kal_uint32    total_page_num;
+    kal_uint32    cur_page;
+    kal_uint64    program_count;  /*position 16 (position at 8 byte alignment for PC simulator) */
+    kal_uint32    buffer[MAX_PAGE_SIZE/sizeof(kal_uint32)];
+    kal_uint32    spare0[MAX_SPARE_SIZE/sizeof(kal_uint32)];
+    kal_uint32    spare1[MAX_SPARE_SIZE/sizeof(kal_uint32)];
+} fdm_log_section_info_struct;
+/*******************************************************************************
+ * Definition for power loss test
+ *******************************************************************************/
+#if defined(FLASH_DISKDRV_DEBUG) && defined(POWERLOSS_TEST)
+
+enum
+{
+    MERGE_ACTIVE = 1,
+    COPY_BLOCK,
+    WRITE_SECTORS,
+    FLUSH_TABLE,
+};
+
+#include <setjmp.h>
+extern jmp_buf mark;
+extern int Test_CD_Value;
+#define TEST_POINT(a)\
+   {\
+      switch(a)\
+      {\
+         case MERGE_ACTIVE:\
+            Test_CD_Value-=1;\
+                break;\
+         case COPY_BLOCK:\
+            Test_CD_Value-=1;\
+                break;\
+         case WRITE_SECTORS:\
+            Test_CD_Value-=1;\
+                break;\
+         case FLUSH_TABLE:\
+            Test_CD_Value-=1;\
+                break;\
+         default:\
+            Test_CD_Value-=1;\
+            break;\
+       }\
+      if(Test_CD_Value <= 0)\
+         longjmp(mark, a);\
+   }
+
+#define START_POINT  setjmp(mark)
+
+#else
+#define TEST_POINT(a)
+#define START_POINT
+#endif
+
+#if defined(FLASH_DISKDRV_DEBUG) && defined(ERROR_HANDLING_TEST)
+
+/* for error handling test */
+
+extern void ProgramPageFailure(kal_int32 times);
+extern void ProgramSpareFailure(kal_int32 times);
+extern void BlockEraseFailure(kal_int32 times);
+extern void ReadPageFailure(kal_int32 times);
+extern void ReadSpareFailure(kal_int32 times);
+
+typedef enum
+{
+    PAGE_WRITE,
+    SPARE_WRITE,
+    PAGE_READ,
+    SPARE_READ,
+    BLOCK_ERASE,
+    TOTAL_OPERATIONS
+} Operation_Type;
+
+typedef enum
+{
+    WRITEDATA_ACTIVE = 0,
+    WRITEDATA_BLOCK,
+    COPY_BLOCK,
+    FLUSH_TABLE,
+    MODIFY_TABLE,
+    MERGE_ACTIVE,
+    DELETE_PAGE,
+    MARK_BAD_BLOCK,
+    DISCARD_SECTOR,
+    INITIALIZE_REGION_DATA,
+    READSECTOR_512,
+    READ_SECTOR_2K,
+    READ_TABLE,
+    READDATA_ACTIVE,
+    READDATA_BLOCK,
+    FIND_CONTROL_BAD_BLOCK,
+    ERASE_BLOCK,
+    FIND_TABLE,
+    BLOCK_BMR,
+    DELETEDATA_ACTIVE,
+    DELETEDATA_BLOCK,
+    POWER_RECOVERY,
+    RECONSTRUCT_TABLE,
+    RESTORE_DD,
+    TOTAL_FUNCTIONS
+} ErrorHandling_TestCase;
+
+typedef struct
+{
+    kal_uint32                triggered;  // test enabled or not
+    kal_uint32                step_id;    // determine which step is allowed to go
+    ErrorHandling_TestCase    case_type;
+    Operation_Type            op_type;
+} test_command;
+
+extern test_command test_item[];
+
+#define TEST_ERROR_ENABLE(function, operation, step)\
+{\
+   test_item[function].triggered = 1;\
+   test_item[function].op_type = operation;\
+   test_item[function].case_type = function;\
+   test_item[function].step_id = step;\
+}
+
+#define TEST_ERROR_DISABLE(function, operation, step)\
+{\
+   if( (function == test_item[function].case_type) &&\
+       (step == test_item[function].step_id) )\
+   {\
+      test_item[function].triggered = 0;\
+      test_item[function].op_type = TOTAL_OPERATIONS;\
+      test_item[function].case_type = TOTAL_FUNCTIONS;\
+      test_item[function].step_id = 0;\
+   }\
+}
+
+/*   assert( function == test_item[function].case_type);\*/
+#define TEST_ERROR_EVENT(function, step)\
+{\
+   if( test_item[function].triggered )\
+   {\
+      if( step == test_item[function].step_id )\
+      {\
+         if( PAGE_WRITE == test_item[function].op_type )\
+         {\
+            nandlog_print("Page program error is triggered!\n");\
+            ProgramPageFailure(1);\
+            test_item[function].triggered = 0;\
+         }else if( SPARE_WRITE == test_item[function].op_type )\
+         {\
+            nandlog_print("Spare program error is triggered!\n");\
+            ProgramSpareFailure(1);\
+            test_item[function].triggered = 0;\
+         } else if( PAGE_READ == test_item[function].op_type )\
+         {\
+            nandlog_print("Page read error is triggered!\n");\
+            ReadPageFailure(1);\
+            test_item[function].triggered = 0;\
+         } else if( SPARE_READ == test_item[function].op_type )\
+         {\
+            nandlog_print("Spare read error is triggered!\n");\
+            ReadSpareFailure(1);\
+            test_item[function].triggered = 0;\
+         } else if (BLOCK_ERASE == test_item[function].op_type)\
+         {\
+            nandlog_print("Block erase error is triggered!\n");\
+            BlockEraseFailure(1);\
+            test_item[function].triggered = 0;\
+         }\
+      }\
+   }\
+}
+
+#else
+#define TEST_ERROR_EVENT(function, step)
+#define TEST_ERROR_ENABLE(function, operation, step) //Keneng
+#define TEST_ERROR_DISABLE(function, operation, step) //Keneng
+#endif
+
+
+/*******************************************************************************
+ *  FDM function declaration
+ *******************************************************************************/
+kal_int32 MountDevice       (void * DriveData, int DeviceNumber, int DeviceType, kal_uint32 Flags);
+kal_int32 ShutDown          (void * DriveData);
+kal_int32 ReadSectors       (void * DriveData, kal_uint32 Sector, kal_uint32 Sectors, void * Data);
+kal_int32 WriteSectors      (void * DriveData, kal_uint32 Sector, kal_uint32 Sectors, void * Data);
+kal_int32 MediaChanged      (void * DriveData);
+kal_int32 DiscardSectors    (void * DriveData, kal_uint32 Sector, kal_uint32 Sectors);
+kal_int32 GetDiskGeometry   (void * DriveData, FS_PartitionRecord * DiskGeometry, kal_uint8 * MediaDescriptor);
+kal_int32 LowLevelFormat    (void * DriveData, const kal_char * DeviceName, FS_FormatCallback Progress, kal_uint32 Flags);
+kal_int32 PowerOnAssert_DriveFormat(void * DriveData);
+int CopySectors(void *DriveData, kal_uint32 SrcSector , kal_uint32 DstSector, kal_uint32 Sectors);
+kal_int32 FDM4_OTPAccess		(void * DriveData, kal_int32 accesstype, kal_uint32 Offset, void * BufferPtr, kal_uint32 Length);
+kal_int32 FDM4_OTPQueryLength	(void * DriveData, kal_uint32 *LengthPtr);
+kal_int32 FDM4_IOCtrl(void * DriveData, UINT CtrlAction, void * CtrlData);
+
+
+/*******************************************************************************
+ *  Sub-function declaration
+ *******************************************************************************/
+kal_int32 FindControlBadBlock(NAND_FLASH_DRV_DATA * D, kal_uint8 * control_num);
+kal_uint8 IsGoodBlock(NAND_FLASH_DRV_DATA * D, void * Spare);
+kal_uint8 ReadSector_512(NAND_FLASH_DRV_DATA * D, kal_uint32 Sector, kal_uint8 * Data);
+kal_uint8 ReadSector_2k(NAND_FLASH_DRV_DATA * D, kal_uint32 Sector, kal_uint32 read_sectors, kal_uint8 * Data);
+kal_uint8 WriteSector_512(NAND_FLASH_DRV_DATA * D, kal_uint32 Sector, kal_uint8 * Data);
+kal_uint8 WriteSector_2k(NAND_FLASH_DRV_DATA * D, kal_uint32 Sector, kal_uint32 write_sectors, kal_uint8 * Data);
+kal_uint32 MapSector(NAND_FLASH_DRV_DATA * D, kal_uint32 Sector);
+void  LocateRegion(NAND_FLASH_DRV_DATA * D, kal_uint32 Sector);
+kal_uint8 InitializeRegionData_byReadTableInfo(NAND_FLASH_DRV_DATA * D);
+void  InitializeRegionData(NAND_FLASH_DRV_DATA * D);
+void  SelfFormat(NAND_FLASH_DRV_DATA * D, kal_int32 DeviceType);
+kal_uint8  DeletePage(NAND_FLASH_DRV_DATA * D, kal_uint32 PageIndex);
+kal_uint8  EraseBlock(NAND_FLASH_DRV_DATA *D, kal_uint32 BlockIndex);
+kal_uint8  MarkBadBlock(NAND_FLASH_DRV_DATA * D, kal_uint32 BlockIndex);
+kal_uint8  LocateBlock(NAND_FLASH_DRV_DATA *D);
+kal_uint8  LocateEmptyBlock(NAND_FLASH_DRV_DATA *D);
+kal_uint8  CopyBlock(NAND_FLASH_DRV_DATA *D, kal_uint8 sourceB, kal_uint8 sourceP, kal_uint8 *destinationB, kal_uint8 destinationP, kal_uint8 num);
+kal_int32  FlushTable(NAND_FLASH_DRV_DATA *D, ControblTableMark mark_flag);
+kal_uint8  ModifyTable(NAND_FLASH_DRV_DATA *D);
+kal_bool  FindTable(NAND_FLASH_DRV_DATA *D);
+kal_uint8  ReadTable(NAND_FLASH_DRV_DATA *D);
+kal_uint8  Read_FoundTable(NAND_FLASH_DRV_DATA *D);
+void  LocatePage(NAND_FLASH_DRV_DATA * D, kal_uint32 Sector, kal_bool readback);
+kal_bool  BlockBMR(NAND_FLASH_DRV_DATA *D, kal_uint16 Block , kal_uint8 Offset);
+kal_uint32 Writedata_Active(NAND_FLASH_DRV_DATA * D, kal_uint8 Offset, kal_uint8 * Data, kal_uint8 * Spare);
+kal_uint32 Writedata_Block(NAND_FLASH_DRV_DATA * D, kal_uint16 Block, kal_uint8 Offset, kal_uint8 * Data, kal_uint8 * Spare);
+void  Deletedata_Active(NAND_FLASH_DRV_DATA *D, kal_uint8 Offset);
+void  Deletedata_Block(NAND_FLASH_DRV_DATA *D, kal_uint16 Block, kal_uint8 Offset);
+void  Readdata_Active(NAND_FLASH_DRV_DATA *D, kal_uint8 Offset);
+void  Readdata_Block(NAND_FLASH_DRV_DATA *D, kal_uint16 Block, kal_uint8 Offset);
+void  MergeActive(NAND_FLASH_DRV_DATA *D);
+void  PowerRecovery(NAND_FLASH_DRV_DATA * D);
+void  ReconstructTable(NAND_FLASH_DRV_DATA * D, dup_block_struct dupB[2][2]);
+void  DeleteAllControlBlock(NAND_FLASH_DRV_DATA * D);
+void  ReconstructAllTable(NAND_FLASH_DRV_DATA * D);
+void  RestoreAD(NAND_FLASH_DRV_DATA * D, dup_block_struct *dupB, kal_uint8 PageState0);
+void  RestoreDD(NAND_FLASH_DRV_DATA * D, dup_block_struct *dupB);
+kal_uint8 CreateControlBlock (NAND_FLASH_DRV_DATA* D);
+kal_uint8 LimitControlLogBlockNumber (NAND_FLASH_DRV_DATA* D);
+kal_bool MarkControlLogBlock(NAND_FLASH_DRV_DATA* D, kal_uint32 BlockOffset);
+kal_bool Find_TableNewestProgramCounter (NAND_FLASH_DRV_DATA * D, kal_uint8 region);
+kal_uint8 LogSectionInit (NAND_FLASH_DRV_DATA * D);
+kal_uint8 WriteLog (NAND_FLASH_DRV_DATA * D, kal_char* message);
+void  SC(NAND_FLASH_DRV_DATA * D);
+void  SC_UT(NAND_FLASH_DRV_DATA * D);
+
+#endif   //__NAND_FDM_50__
+
+
+/******************************************************************************
+ * SuperAND flash device definition                                           *
+ ******************************************************************************/
+#if defined(WIN32) && defined(TRACE_ON)
+#define FDM_TRACE   printf
+#else
+#define FDM_TRACE
+#endif
+
+#define SUPERAND_SECTOR_SIZE    2048
+#define SUPERAND_FAT_API_ENTRANCE \
+    Sector += D->first_fat_sector_offset;
+
+typedef struct
+{
+    SuperAND_MTD_DRIVER     * MTD;
+
+#ifndef __MTK_TARGET__
+    const char              * file_name;
+    void                    * flash_device;
+#endif
+    kal_uint8                    io_width;
+    kal_uint32                   pages_of_first_device;
+    kal_uint32                   pages_of_block;
+    kal_uint32                  block_mask;
+    kal_uint32                   total_pages;
+
+    kal_uint32                   first_fat_sector_offset;
+    kal_uint32                   total_fat_sectors;
+    kal_uint32                   partition_sectors;
+
+    kal_uint32                   buffer[SUPERAND_SECTOR_SIZE/sizeof(kal_uint32)];
+} SuperAND_FLASH_DRV_DATA;
+
+#define SUPERAND_MOUNTED    0x1000
+
+void SuperAND_FDM_Init(void);
+void SuperAND_SelfFormat(SuperAND_FLASH_DRV_DATA *D, kal_int32 DeviceType);
+
+kal_int32 SuperAND_FDM_MountDevice(void * DriveData, int DeviceNumber, int DeviceType, kal_uint32 Flags);
+kal_int32 SuperAND_FDM_ShutDown(void * DriveData);
+kal_int32 SuperAND_FDM_ReadSectors(void * DriveData, kal_uint32 Sector, kal_uint32 Sectors, void * Buffer);
+kal_int32 SuperAND_FDM_WriteSectors(void * DriveData, kal_uint32 Sector, kal_uint32 Sectors, void * Buffer);
+kal_int32 SuperAND_FDM_MediaChanged(void * DriveData);
+kal_int32 SuperAND_FDM_DiscardSectors(void * DriveData, kal_uint32 Sector, kal_uint32 Sectors);
+kal_int32 SuperAND_FDM_GetDiskGeometry(void * DriveData, FS_PartitionRecord * DiskGeometry, kal_uint8 * MediaDescriptor);
+kal_int32 SuperAND_FDM_GetDiskGeometry(void * DriveData, FS_PartitionRecord * DiskGeometry, kal_uint8 * MediaDescriptor);
+kal_int32 SuperAND_FDM_LowLevelFormat(void * DriveData, const char * DeviceName, FS_FormatCallback Progress, kal_uint32 Flags);
+kal_int32 SuperAND_FDM_NonBlockWriteSectors(void * DriveData, kal_uint32 Sector, kal_uint32 Sectors, void * Buffer);
+kal_int32 SuperAND_FDM_RecoverableWriteSectors(void * DriveData, kal_uint32 Sector, kal_uint32 Sectors, void * Buffer);
+kal_int32 SuperAND_FDM_ResumeSectorStates(void  * DriveData);
+kal_int32 SuperAND_FDM_HighLevelFormat(void);
+kal_int32 SuperAND_FDM_FlushData(void * DriveData);
+kal_int32 SuperAND_FDM_CopySectors(void * DriveData, kal_uint32 SrcSector, kal_uint32 DstSector, kal_uint32 Sectors);
+
+#endif /* NAND_FDM_H */
+
diff --git a/mcu/interface/driver/storage/NAND_MTD.h b/mcu/interface/driver/storage/NAND_MTD.h
new file mode 100644
index 0000000..ae68a66
--- /dev/null
+++ b/mcu/interface/driver/storage/NAND_MTD.h
@@ -0,0 +1,360 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  -------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ *	NandMTD.h
+ *
+ * Project:
+ * --------
+ *   MAUI
+ *
+ * Description:
+ * ------------
+ *   This is a NAND Flash MTD driver header file for Samsung and Toshiba flash devices.
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *==============================================================================
+ * 				HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+
+#ifndef NAND_MTD_H
+#define NAND_MTD_H
+
+
+/*******************************************************************************
+ * Include Header Files
+ *******************************************************************************/
+// RHR Remove #include "reg_base.h"
+// RHR Remove #include "config_hw.h"
+// RHR Remove #include "drvpdn.h"
+#include "fota_error.h"
+#include "nfi_hw_info.h"
+// Add for RHR
+// RHR Remove     #include "dma_hw.h"
+// RHR Remove     #include "kal_non_specific_general_types.h"
+// RHR Remove     #include "kal_release.h"
+// Add for RHR
+
+#define MAX_NAND_DATA_SIZE            		(NFI_MAX_DATA_SIZE_PER_PAGE)	// Max NAND page size used for MMU.
+#define MAX_NAND_SPARE_SIZE               (NFI_MAX_SPARE_SIZE_PER_PAGE)
+/*******************************************************************************
+ *  Operation error code for NFB functions
+ *******************************************************************************/
+#define ERROR_NFB_SUCCESS             (ERROR_FOTA_SUCCESS)
+#define ERROR_NFB_READ                (ERROR_FOTA_READ)
+#define ERROR_NFB_PROGRAM             (ERROR_FOTA_PROGRAM)
+#define ERROR_NFB_ERASE               (ERROR_FOTA_ERASE)
+#define ERROR_NFB_BAD_BLOCK           (ERROR_FOTA_BAD_BLOCK)
+#define ERROR_NFB_CHECKSUM            (ERROR_FOTA_NFB_CHECKSUM)
+#define ERROR_NFB_ECC_CORRECTED       (ERROR_FOTA_ECC_CORRECTED)
+
+
+#endif
+
+
diff --git a/mcu/interface/driver/storage/NAND_MTD_FDM50.h b/mcu/interface/driver/storage/NAND_MTD_FDM50.h
new file mode 100644
index 0000000..8721257
--- /dev/null
+++ b/mcu/interface/driver/storage/NAND_MTD_FDM50.h
@@ -0,0 +1,154 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  -------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ *	NAND_MTD_FDM50.h
+ *
+ * Project:
+ * --------
+ *   MAUI
+ *
+ * Description:
+ * ------------
+ *   This is a NAND Flash MTD driver header file.
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *==============================================================================
+ * 				HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+
+#ifndef NAND_MTD_FDM50_H
+#define NAND_MTD_FDM50_H
+
+#endif //NAND_MTD_FDM50_H
+
+
diff --git a/mcu/interface/driver/storage/flash_cfi.h b/mcu/interface/driver/storage/flash_cfi.h
new file mode 100644
index 0000000..1f71113
--- /dev/null
+++ b/mcu/interface/driver/storage/flash_cfi.h
@@ -0,0 +1,87 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *   flash_cfi.h
+ *
+ * Project:
+ * --------
+ *   MAUI
+ *
+ * Description:
+ * ------------
+ *   This module implements Common Flash Interface Query for NOR Flash Memory.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef __FLASH_CFI_H
+#define __FLASH_CFI_H
+
+//#include "kal_release.h"
+#include "kal_general_types.h"
+
+kal_int32 CFI_NOR_Flash(void);
+
+#endif /* end of __FLASH_CFI_H  */
+
diff --git a/mcu/interface/driver/storage/flash_disk.h b/mcu/interface/driver/storage/flash_disk.h
new file mode 100644
index 0000000..a456f6e
--- /dev/null
+++ b/mcu/interface/driver/storage/flash_disk.h
@@ -0,0 +1,189 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2010
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *   flash_disk.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   This is the header of NOR Flash raw disk code
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ ****************************************************************************/
+
+#ifndef __FLASH_DISK_H__
+#define __FLASH_DISK_H__
+
+#if defined __MTK_TARGET__
+#if !defined(_NAND_FLASH_BOOTING_)  && !defined(__NOR_FDM5__)
+
+/*******************************************
+*   Include File      
+********************************************/
+
+#include "custom_MemoryDevice.h"
+#include "flash_opt.h"
+#include "flash_mtd.h"
+#include "reg_base.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "DrvFlash.h"
+
+
+#ifdef __INTEL_SIBLEY__
+//MSBB remove #include "app_buff_alloc.h" //get control buffer
+#endif //__INTEL_SIBLEY__
+
+/*******************************************
+*   Error Code Definition
+********************************************/
+
+#define RAW_DISK_ERR_NONE 0
+#define RAW_DISK_ERR_WRONG_ADDRESS 2
+#define RAW_DISK_ERR_NO_SPACE  3
+
+
+#define RAW_DISK_ERR_PROG_FAIL 5
+#define RAW_DISK_ERR_ERASE_FAIL 6
+
+#define ERROR_NOR_SUCCESS             	(0)   //(ERROR_FOTA_SUCCESS)
+#define ERROR_NOR_READ                	(-13) //(ERROR_FOTA_READ)
+#define ERROR_NOR_PROGRAM             	(-14) //(ERROR_FOTA_PROGRAM)
+#define ERROR_NOR_ERASE               	(-15) //(ERROR_FOTA_ERASE)
+#define ERROR_NOR_OVERRANGE             (-1)  //(ERROR_FOTA_OVERRANGE)
+
+/*******************************************
+*   Structure and Macro Definition      
+********************************************/
+
+#define FLASH_DISK_DONE FS_NO_ERROR
+
+#define NOR_FLASH_PAGE_SIZE 0x800 //default 2KB page
+#define NOR_FLASH_PAGE_SHIFT 11
+
+
+/*******************************************
+*   Function and Variable Definition      
+********************************************/
+
+/* TC01 security partition API */
+#ifdef __CUSTOMER_TC01_DISK__
+#define TC01_DISK RAW_DISK1
+#define TC01_DISK_BLOCK_SIZE 0x4000
+#define TC01_DISK_PAGE_SIZE 0x800 //default 2KB page
+#define TC01_DISK_PAGE_SHIFT 11
+kal_int32 EraseRawDataItem(kal_uint32 block_idx);
+kal_int32 ReadRawDataItem(kal_uint32 block_idx, kal_uint32 page_idx, kal_uint32 length, kal_uint8* data_ptr);
+kal_int32 WriteRawDataItem(kal_uint32 block_idx, kal_uint32 page_idx, kal_uint32 length, kal_uint8* data_ptr);
+#endif //__CUSTOMER_TC01_DISK__
+
+/* Backup partition API*/
+
+/* NOR driver API for Secure Storage(in MAUI) */
+
+kal_int32 NOR_init (void);
+//kal_int32 NOR_QueryInfo (Logical_Flash_info info);
+kal_int32 NOR_ReadPhysicalPage (kal_uint32 block_idx, kal_uint32 page_idx, kal_uint8 * data_ptr);
+#ifdef __NOR_FULL_DRIVER__
+kal_int32 NOR_ProgramPhysicalPage (kal_uint32 block_idx, kal_uint32 page_idx, kal_uint8 * data_ptr);
+kal_int32 NOR_ErasePhysicalBlock (kal_uint32 block_idx);
+#endif //__NOR_FULL_DRIVER__
+kal_uint32 NOR_BlockSize(kal_uint32 block_idx);
+kal_uint32 NOR_BlockIndex(kal_uint32 block_addr);
+kal_int32 NOR_Addr2BlockIndexOffset(kal_uint32 block_addr, kal_uint32 *block_index, kal_uint32 *offset);
+kal_int32 NOR_BlockIndexOffset2Addr(kal_uint32 block_index, kal_uint32 offset, kal_uint32 *addr);
+
+#endif // !_NAND_FLASH_BOOTING__ && !__NOR_FDM5__
+#endif //__MTK_TARGET__
+#endif //__FLASH_DISK_H__
diff --git a/mcu/interface/driver/storage/flash_disk_internal.h b/mcu/interface/driver/storage/flash_disk_internal.h
new file mode 100644
index 0000000..2aed1d5
--- /dev/null
+++ b/mcu/interface/driver/storage/flash_disk_internal.h
@@ -0,0 +1,175 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2010
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *   flash_disk.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   This is the header of NOR Flash raw disk code
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ ****************************************************************************/
+
+#ifndef __FLASH_DISK_INTERNAL_H__
+#define __FLASH_DISK_INTERNAL_H__
+
+#if defined __MTK_TARGET__
+#if !defined(_NAND_FLASH_BOOTING_) && !defined(__EMMC_BOOTING__)
+
+/*******************************************
+*   Include File      
+********************************************/
+
+#include "flash_disk.h"
+#include "custom_MemoryDevice.h"
+#include "flash_opt.h"
+#include "flash_mtd.h"
+#include "reg_base.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "DrvFlash.h"
+#include "fs_gprot.h"
+#include <ex_public.h>
+
+
+#ifdef __INTEL_SIBLEY__
+//MSBB remove #include "app_buff_alloc.h" //get control buffer
+#endif //__INTEL_SIBLEY__
+
+
+/*******************************************
+*   Structure and Macro Definition      
+********************************************/
+#define RAW_DISK0 0
+#define RAW_DISK1 1
+
+
+
+
+// Flash raw disk driver's data
+typedef __fs_packed_prefix struct {
+   kal_uint32   DiskSize;        
+   NOR_MTD_Driver *MTDDriver;       ///< MTD driver
+   void    *MTDData;                ///< MTD data
+   NOR_MTD_FlashInfo FlashInfo;     ///< Flash information
+   kal_bool is_mount;
+}__fs_packed_postfix NOR_FLASH_DISK_Data;
+
+/*******************************************
+*   Function and Variable Definition      
+********************************************/
+#ifdef __NOR_SUPPORT_RAW_DISK__
+extern NOR_FLASH_DISK_Data FlashDiskDriveData[NOR_BOOTING_NOR_DISK_NUM];
+#endif 
+
+
+extern kal_uint32       BlockIndex(void* DriverData, kal_uint32 blk_addr);
+extern kal_mutexid      fdm_reclaim_mutex;
+
+/* Raw disk API */
+kal_int32 readRawDiskData(NOR_FLASH_DISK_Data *D, kal_uint32 addr, kal_uint8* data_ptr, kal_uint32 len);
+#if defined(__NOR_SUPPORT_RAW_DISK__) || defined(__NOR_FULL_DRIVER__)
+kal_int32 writeRawDiskData(NOR_FLASH_DISK_Data *D, kal_uint32 addr, kal_uint8* data_ptr, kal_uint32 len);
+kal_int32 eraseRawDiskBlock(NOR_FLASH_DISK_Data *D, kal_uint32 block_baseaddr);
+#endif //__NOR_SUPPORT_RAW_DISK__ || __NOR_FULL_DRIVER__
+
+
+#endif // !_NAND_FLASH_BOOTING__ && !__EMMC_BOOTING__
+#endif //__MTK_TARGET__
+#endif //__FLASH_DISK_H__
diff --git a/mcu/interface/driver/storage/flash_mtd.h b/mcu/interface/driver/storage/flash_mtd.h
new file mode 100644
index 0000000..303d37b
--- /dev/null
+++ b/mcu/interface/driver/storage/flash_mtd.h
@@ -0,0 +1,193 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2007
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ *	flash_mtd.h
+ *
+ * Project:
+ * --------
+ *   MAUI
+ *
+ * Description:
+ * ------------
+ *   This is a flash MTD driver header file
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ * 				HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+
+#ifndef FLASH_MTD_H
+#define FLASH_MTD_H
+
+#ifdef __NORFLASH_DEBUGMODE__
+   #define DEBUG
+#endif
+
+
+/********************************************************/
+/*                  Include Header Files                */
+/********************************************************/
+
+/********************************************************/
+/*         Parameter and Function Decleration           */
+/********************************************************/
+#define DriverName NORFlashMtd
+
+/*-------------------------------------------------------
+ * Enhanced single bank specific
+ *-------------------------------------------------------*/
+
+#endif /* FLASH_MTD_H */
diff --git a/mcu/interface/driver/storage/flash_mtd_pf_dal.h b/mcu/interface/driver/storage/flash_mtd_pf_dal.h
new file mode 100644
index 0000000..4803be1
--- /dev/null
+++ b/mcu/interface/driver/storage/flash_mtd_pf_dal.h
@@ -0,0 +1,94 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2011
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ *	flash_mtd_pf_dal.h
+ *
+ * Project:
+ * --------
+ *   MAUI
+ *
+ * Description:
+ * ------------
+ *   This is a flash MTD driver header file (for Combo Memory)
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ * 				HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================*/
+ 
+ #ifndef __FLASH_MTD_PF_DAL_H__
+#define __FLASH_MTD_PF_DAL_H__
+
+#include "kal_public_api.h" //MSBB change #include "kal_release.h"
+#include "DrvFlash.h"
+#include "fs_type.h"
+#include "flash_mtd.h"
+
+// [Combo Memory] ESB status (Flash_ReturnReady, waitReady)
+
+#endif  // #ifndef __FLASH_MTD_PF_H__
+
diff --git a/mcu/interface/driver/storage/flash_mtd_sf_dal.h b/mcu/interface/driver/storage/flash_mtd_sf_dal.h
new file mode 100644
index 0000000..4642c25
--- /dev/null
+++ b/mcu/interface/driver/storage/flash_mtd_sf_dal.h
@@ -0,0 +1,380 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *    flash_mtd_sf_dal.h
+ *
+ * Project:
+ * --------
+ *   Maui
+ *
+ * Description:
+ * ------------
+ *   The MTD driver for serial Flash devices
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================*/
+//#include "flash_opt.h"
+
+#ifndef __FLASH_MTD_SF_DAL_H__
+#define __FLASH_MTD_SF_DAL_H__
+
+#ifdef __SF_DVT__
+#include "flash_mtd_sf_dvt.h"
+#include "flash_sf.h"
+#else
+#include "kal_general_types.h"
+#include "kal_public_defs.h"
+#include "DrvFlash.h"
+#include "fs_type.h"
+#include "flash_sf.h"
+#endif
+
+//-------------------------------------------------------
+// IoCtrl enumeration
+//-------------------------------------------------------
+typedef enum
+{
+    SF_IOCTRL_UNLOCK_BLOCK,
+    SF_IOCTRL_GET_PROGRAM_FAIL_HANDLE_TYPE
+} SF_MTD_IOCtrl_Action_Enum;
+
+typedef enum
+{
+    SFDRV_READY=0,
+    SFDRV_PROGRAMMING,
+    SFDRV_ERASING
+} SF_Driver_Status;
+
+//-------------------------------------------------------
+// Driver Data - Device Command
+//-------------------------------------------------------
+typedef struct
+{
+    kal_uint8 PageProg;
+    kal_uint8 WriteEnable;
+
+    kal_uint8 Suspend;
+    kal_uint8 Resume;
+    kal_uint8 Read;
+
+    kal_uint8 Erase;
+    kal_uint8 Erase4K;
+    kal_uint8 Erase32K;
+    kal_uint8 Erase64K;
+
+    kal_uint8 ReadID_SPI;
+    kal_uint8 ReadID_QPI;
+
+    kal_uint8 ReadBPReg;
+    kal_uint8 WriteBPReg;
+    kal_uint8 ReadSecurityReg;
+    kal_uint8 WriteSecurityReg;
+    kal_uint8 ReadSuspendReg;
+    kal_uint8 ReadReadyReg;
+    kal_uint8 ReadFailReg;
+
+//#ifdef __SECURITY_OTP__
+    kal_uint8 OTPProg;
+    kal_uint8 OTPRead;
+    kal_uint8 OTPEnter;
+    kal_uint8 OTPExit;
+    kal_uint8 OTPLock;
+//#endif
+}SF_MTD_CMD;
+
+//-----------------------------------------------------------------------
+// Driver Data
+// Note: The first part must be identical to
+//       NOR_Flash_MTD_Data(FDM4.0), NOR_MTD_DATA(FDM5.0)
+//       The second part must be identical to
+//       NOR_Flash_MTD_Data(FDM4.0)
+//-----------------------------------------------------------------------
+
+typedef struct {
+//========== First Part ===========
+       kal_uint32         Signature;
+       kal_uint8         *BaseAddr;
+       kal_semid          DeviceLock;       // The device lock that keeps driver resource consistent
+       kal_taskid         DeviceLockOwner;  // The owner of the deivce lock
+       kal_int8           DeviceLockDepth;  // The depth of the deivce lock
+
+//========== Second Part ===========
+       FlashRegionInfo   *RegionInfo;
+       kal_uint8         *CurrAddr;
+       FlashBankInfo     *BankInfo;
+       kal_uint8         *CurrBankAddr;
+       kal_uint32         CurrBankSize;
+       kal_uint8         *CurrPollAddr;
+
+#ifndef __MTK_TARGET__
+       const char        *FileName;
+       void              *flash_device;
+       kal_uint8         *rootMTDcache;
+       kal_uint8         *MTDcache;
+       kal_uint32         first;
+       kal_uint32         last_WinAddr;
+       kal_uint32         last_region;
+#endif
+
+//========== Serial Flash =========
+       SF_Status             *StatusMap;
+       SF_MTD_CMD            *CMD;
+       kal_uint32             Flag;
+       kal_uint16             BPRBitCount;
+       kal_uint16             UniformBlock;
+
+//OTP variable, always exist because FDM will use SF_MTD_Data
+//#ifdef __SECURITY_OTP__
+       kal_uint16             OTPLength;
+       kal_uint16             OTPBase;
+//#endif // __SECURITY_OTP__
+
+       kal_uint8              SuspendLatency;
+       kal_uint8              FlashID[SF_FLASH_ID_LENGTH];
+       kal_uint8              DriverStatus;
+       kal_uint8              AddressCycle;
+
+       int (*UnlockBlock)(void *MTDData);
+
+//OTP function pointer, always exist because FDM will use SF_MTD_Data
+//#ifdef __SECURITY_OTP__
+       int (*OTPLock)(void *MTDData);
+       int (*OTPRead)(void *MTDData, kal_uint32 Offset, void * BufferPtr, kal_uint32 Length);
+       int (*OTPWrite)(void *MTDData, kal_uint32 Offset, void * BufferPtr, kal_uint32 Length);
+//#endif // __SECURITY_OTP__
+}SF_MTD_Data;
+
+//-----------------------------------------------------------------------
+// GPRAM 4-byte alined access union
+//-----------------------------------------------------------------------
+typedef union {
+    kal_uint32   u32;
+    kal_uint16   u16[2];
+    kal_uint8    u8[4];
+} sf_uint;
+
+//-------------------------------------------------------
+// Type Enumeration
+//-------------------------------------------------------
+// Note: This must match with JECDEC vendor id
+typedef enum {
+    SF_DAL_TYPE_NONE       = 0,
+    SF_DAL_TYPE_NUMONYX    = 0x20,
+    SF_DAL_TYPE_NUMONYX_W  = 0x2C,
+    SF_DAL_TYPE_EON        = 0x1C,
+    SF_DAL_TYPE_SST        = 0xBF,
+    SF_DAL_TYPE_MXIC       = 0xC2,
+    SF_DAL_TYPE_GIGADEVICE = 0xC8,
+    SF_DAL_TYPE_WINBOND    = 0xEF,
+    SF_DAL_TYPE_FIDELIX    = 0xF8,
+    SF_DAL_TYPE_COUNT
+} SF_DAL_Type;
+
+
+//-----------------------------------------------------------------------------
+// [DAL] Device Lock
+//-----------------------------------------------------------------------------
+#ifdef __UBL__
+#define SF_DAL_CreateDevLock(...)
+#define SF_DAL_GetDevLock(...)
+#define SF_DAL_FreeDevLock(...)
+#else
+void SF_DAL_CreateDevLock(SF_MTD_Data *data);
+void SF_DAL_GetDevLock(SF_MTD_Data *data);
+void SF_DAL_FreeDevLock(SF_MTD_Data *data);
+#endif
+
+//-------------------------------------------------------
+// INIT Stage APIs
+//-------------------------------------------------------
+kal_int32 SF_DAL_Mount_Driver_EMIINIT(NOR_MTD_Driver *driver, SF_MTD_Data *data, kal_uint32 baseaddr);
+int SF_DAL_EraseBlock_EMIINIT(void *MTDData, kal_uint32 BlockSize, kal_uint32 Address);
+void SF_DAL_ProgramData_EMIINIT(void *MTDData, kal_uint32 address, void *Data, kal_uint32 Size);
+void SF_DAL_ReleaseSFIChannels_EMIINIT(void);
+
+//-------------------------------------------------------
+// Driver Abstract Layer Initialization Function
+//-------------------------------------------------------
+kal_int32 SF_DAL_Init_Driver(
+    NOR_MTD_Driver *driver,    // Pointer to allocated driver interface
+    SF_MTD_Data *data,         // Pointer to allocated driver data
+    kal_uint32 baseaddr,       // Base address of FAT region
+    kal_uint32 parameter       // Device Paramter (Supported Erase Unit)
+);
+
+//-----------------------------------------------------------------------------
+// [DAL] First Level Abstract (Interface to upper driver)
+//-----------------------------------------------------------------------------
+int SF_DAL_MountDevice(void *MTDData, void *Info);
+int SF_DAL_ShutDown(void *MTDData);
+int SF_DAL_EraseBlock(void *MTDData, kal_uint32 BlockIndex);
+int SF_DAL_NonBlockEraseBlock(void *MTDData, kal_uint32 BlockIndex);
+kal_int32 SF_DAL_CheckDeviceReady(void *MTDData, kal_uint32 BlockIndex);
+kal_int32 SF_DAL_CheckReadyAndResume(void *MTDData, kal_uint32 addr, kal_uint8 data);
+int SF_DAL_ResumeErase(void *MTDData, kal_uint32 BlockIndex);
+int SF_DAL_SuspendErase(void *MTDData, kal_uint32 BlockIndex);
+int SF_DAL_LockEraseBlkAddr(void *MTDData, void *BlkAddr, kal_uint32 ACTION);
+int SF_DAL_IOCtrl(void *MTDData, kal_uint32 CtrlAction, void * CtrlData);
+int SF_DAL_ProgramData(void *MTDData, void *Address, void *Data, kal_uint32 Length);
+int SF_DAL_OTPQueryLength(void *MTDData, UINT *LengthPtr);
+int SF_DAL_OTPAccess(void *MTDData, int accesstype, UINT Offset, void * BufferPtr, UINT Length);
+
+//-------------------------------------------------------
+// Sleep Mode Service Routines
+//-------------------------------------------------------
+void Flash_ProgramData(void *Target, void *Data, kal_uint32 Size);
+kal_bool Flash_CheckReady(void);
+
+//-------------------------------------------------------
+// System Context Switch Service Routines
+//-------------------------------------------------------
+void Flash_ReturnReady(void);
+
+#endif  // #ifndef __FLASH_MTD_SF_H__
diff --git a/mcu/interface/driver/storage/flash_sf.h b/mcu/interface/driver/storage/flash_sf.h
new file mode 100644
index 0000000..2dcca6e
--- /dev/null
+++ b/mcu/interface/driver/storage/flash_sf.h
@@ -0,0 +1,363 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2007
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ *	flash_mtd.h
+ *
+ * Project:
+ * --------
+ *   MAUI
+ *
+ * Description:
+ * ------------
+ *   This is a flash MTD driver header file
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ * 				HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+
+#ifndef _FLASH_SF_H
+#define _FLASH_SF_H
+
+#ifdef __SF_DVT__
+#include "flash_mtd_sf_dvt.h"
+#else
+#include "kal_general_types.h"
+#endif
+#include "sfi_hw.h"
+
+/*-------------------------------------------------------
+ *          Serial Flash Device Parameters
+ *-------------------------------------------------------*/
+
+// Parameters
+#define SF_MAX_PAGE_PROG_SIZE   (256)
+#define SF_ADDRESS_MASK         (0x07FFFFFF)
+
+typedef enum {
+    SF_SR_BUSY  = 0
+   ,SF_SR_WEL
+   ,SF_SR_WSE
+   ,SF_SR_WSP
+   ,SF_SR_BP
+   ,SF_SR_SRWD
+   ,SF_SR_OTPLOCK
+   ,SF_SR_FAIL
+   ,SF_SR_COUNT     // Number of SR map entries
+} SF_Status_Enum;
+
+typedef enum {
+    SF_SST_SR_WEL          = 0x02      // Write Enable Latch
+   ,SF_SST_SR_WSE          = 0x04      // Write Suspend Erase Status
+   ,SF_SST_SR_WSP          = 0x08      // Write Suspend Program Status
+   ,SF_SST_SR_WPLD         = 0x10      // Write Protection Lockdown Status (Resets to 0 after a power cycle)
+   ,SF_SST_SR_SEC          = 0x20      // Security ID status (Once set by Lock Security ID (0x85h) it can not be reset)
+   ,SF_SST_SR_BUSY         = 0x80      // Write operation status (Write In Progress Bit)
+   ,SF_SST_SR_ALL          = 0xFF
+} SF_SST_Status_Indication_Enum;
+
+typedef enum {
+    SF_MXIC_SR_BUSY        = 0x01      // Write operation status (Write In Progress Bit)
+   ,SF_MXIC_SR_WEL         = 0x02      // Write Enable Latch
+   ,SF_MXIC_SR_WSE         = 0x08      // Write Suspend Erase Status (in security register)
+   ,SF_MXIC_SR_WSP         = 0x04      // Write Suspend Program Status (in security register)
+   ,SF_MXIC_SR_BP          = 0x3C      // Block protection (MXIC only)
+   ,SF_MXIC_SR_SRWD        = 0x80      // Status register write disable (MXIC only)
+   ,SF_MXIC_SR_ALL         = 0xFF
+} SF_MXIC_Status_Indication_Enum;
+
+typedef enum {
+    SF_MXIC_SSR_OTP        = 0x01
+   ,SF_MXIC_SSR_LDSO       = 0x02
+   ,SF_MXIC_SSR_WSP        = 0x04
+   ,SF_MXIC_SSR_WSE        = 0x08
+   ,SF_MXIC_SSR_PFAIL      = 0x20
+   ,SF_MXIC_SSR_EFAIL      = 0x40
+   ,SF_MXIC_SSR_WPSEL      = 0x80
+} SF_MXIC_Security_Indication_Enum;
+
+typedef enum {
+    SF_EON_SSR_WSE         = 0x04
+   ,SF_EON_SSR_WSP         = 0x08
+} SF_EON_Suspend_Indication_Enum;
+
+typedef enum {
+    SF_WINBOND_SSR_SUS     = 0x80
+   ,SF_WINBOND_SSR_OTP     = 0x3C       //Security register lock bits (LB0, LB1, LB2, LB3)
+} SF_WINBOND_Suspend_Indication_Enum;
+
+typedef enum {
+    SF_NUMONYX_SSR_WSP     = 0x04
+   ,SF_NUMONYX_SSR_WSE     = 0x40
+} SF_NUMONYX_Suspend_Indication_Enum;
+
+typedef enum {
+    SF_UNDEF = 0
+   ,SPI      = 1
+   ,SPIQ     = 2
+   ,QPI      = 3
+} SF_MODE_Enum;
+
+typedef kal_uint8 SF_Status;
+
+/*-------------------------------------------------------
+ *             Serial Flash Device Commands
+ *-------------------------------------------------------*/
+
+// Serial Flash commands (General for SPI)
+#define SF_CMD_WRITE_SR     (0x01)
+#define SF_CMD_PAGE_PROG    (0x02)
+#define SF_CMD_READ         (0x03)
+#define SF_CMD_NORMAL_READ  (0x00030000)  // for direct mode usage
+#define SF_CMD_READ_SR      (0x05)
+#define SF_CMD_WREN         (0x06)
+#define SF_CMD_FAST_READ    (0x000B0000)  // for direct mode usage
+#define SF_CMD_RESUME       (0x30)
+#define SF_CMD_WBPR         (0x42)
+#define SF_CMD_RSTEN        (0x66)
+#define SF_CMD_RBPR         (0x72)
+#define SF_CMD_RST          (0x99)
+#define SF_CMD_SUSPEND      (0xB0)
+#define SF_CMD_ERASE_CHIP   (0xC7)
+#define SF_CMD_ERASE_BLOCK  (0xD8)
+#define SF_CMD_ERASE_SMALL_BLOCK (0x52)
+#define SF_CMD_ERASE_SECTOR (0x20)
+#define SF_CMD_READ_ID      (0x9F)
+
+// Serial Flash commands (General for QPI)
+#define SF_CMD_READ_ID_QPI  (0xAF)
+
+// Serial Flash commands (SST specific)
+#define SF_CMD_SST_QPIEN                    (0x38)        // for SST only
+#define SF_CMD_SST_QPIRST                   (0xFF)
+#define SF_CMD_SST_SET_BURST_LENGTH         (0xC0)
+#define SF_CMD_SST_BURST_LENGTH_32_BYTE     (0x02)
+#define SF_CMD_SST_FAST_READ                (0x0B)
+#define SF_CMD_SST_FAST_READ_WRAP           (0x0C)
+#define SF_CMD_SST_READ_SECURITY_ID         (0x88)    // SST: Read OTP registers
+#define SF_CMD_SST_PROG_SECURITY_ID         (0xA5)    // SST: Program OTP registers
+#define SF_CMD_SST_LOCK_SECURITY_ID         (0x85)    // SST: Lock OTP registers
+
+
+// Serial Flash commands (MXIC specific)
+#define SF_CMD_MXIC_QPIEN                   (0x35)
+#define SF_CMD_MXIC_RSTQPI                  (0xF5)
+#define SF_CMD_MXIC_READ_SEC_SR             (0x2B)  // OTP Read status
+#define SF_CMD_MXIC_WRITE_SEC_SR            (0x2F)  // OTP write status
+#define SF_CMD_MXIC_SET_BURST_LENGTH        (0xC0)
+#define SF_CMD_MXIC_BURST_LENGTH_32_BYTE    (0x02)
+#define SF_CMD_MXIC_BURST_LENGTH_DISABLE    (0x10)
+#define SF_CMD_MXIC_FAST_READ_WRAP          (0x0B)  // for direct mode usage
+#define SF_CMD_MXIC_FAST_READ_ENH           (0xEB)  // for direct mode usage
+#define SF_CMD_MXIC_ENTER_SECURED_OTP       (0xB1)  // Enter OTP Access
+#define SF_CMD_MXIC_EXIT_SECURED_OTP        (0xC1)  // Exit OTP Access
+
+// Serial Flash commands (EON specific)
+#define SF_CMD_EON_READ_SUSPEND_SR          (0x09)  // Suspend status register
+
+// Serial Flash commands (WINBOND specific)
+#define SF_CMD_WINBOND_READ_SUSPEND_SR      (0x35)  // Suspend status register
+#define SF_CMD_WINBOND_SUSPEND              (0x75)  // Suspend
+#define SF_CMD_WINBOND_RESUME               (0x7A)  // Resume
+#define SF_CMD_WINBOND_READ_SECURITY_REG    (0x48)  // Winbond: Read OTP registers
+#define SF_CMD_WINBOND_PROG_SECURITY_REG    (0x42)  // Winbond: Program OTP registers
+#define SF_CMD_WINBOND_READ_UNIQUE_ID       (0x4B)  // Read unique ID number (4 dummy bytes)
+
+// Serial Flash commands (NUMONYX specific)
+#define SF_CMD_NUMONYX_READ_FLAG_SR         (0x70)  // Numonyx: Read flag status register
+#define SF_CMD_NUMONYX_WRITE_FLAG_SR        (0x50)  // Numonyx: Write flag status register
+#define SF_CMD_NUMONYX_READ_LOCK_SR         (0xE8)  // Numonyx: Read lock status register
+#define SF_CMD_NUMONYX_WRITE_LOCK_SR        (0xE5)  // Numonyx: Write lock status register
+#define SF_CMD_NUMONYX_READ_CONFIG_SR       (0x85)  // Numonyx: Read volatile config status register
+#define SF_CMD_NUMONYX_WRITE_CONFIG_SR      (0x81)  // Numonyx: Write volatile config status register
+
+// Serial Flash commands (GIGADEVICE specific)
+#define SF_CMD_GIGADEVICE_HPM_ENTER         (0xA3000000)  // GIGA Device: Enter high performance mode + 3 dummy
+#define SF_CMD_GIGADEVICE_HPM_ENTER_CMD     (0xA3)        // GIGA Device: Enter high performance mode cmd
+#define SF_CMD_GIGADEVICE_HPM_EXIT          (0xAB)        // GIGA Device: Exit high performance mode
+
+// Serial flash device characteriscs
+#define SF_WRAP_ENABLE                       (1)      // wrap burst read should be enabled by default
+#define SF_FLASH_ID_LENGTH                   (3)      // The number of bytes for flash ID
+
+
+
+/*-------------------------------------------------------
+ *              Serial Flash Common APIs
+ *        API Body is in "flash_mtd_sf_common.c"
+ *-------------------------------------------------------*/
+extern void         SFI_BlankCheck(void *MTDData, kal_uint32 BlockIndex);
+extern void         SFI_MacEnable(void);
+extern void         SFI_MacWaitReady(void);
+extern kal_uint32   SFI_ReverseByteOrder(kal_uint32 num);
+extern void         SFI_ReadDeviceID(kal_uint8 *id, kal_uint8 cmd);
+extern void         SFI_ReadDeviceID_SPI(kal_uint8 *id);
+// Device Command functions
+extern void         SFI_Dev_Command(const kal_uint32 cmd);
+extern void         SFI_Dev_CommandAddress(const kal_uint8 cmd, const kal_uint32 address, const kal_uint32 address_bytes);
+extern void         SFI_Dev_Command_List(const kal_uint8 *cmdlist);
+extern void         SFI_Dev_Command_Ext(const kal_uint8 *cmd, kal_uint8 *data, const kal_uint16 outl, const kal_uint16 inl);
+extern kal_bool     SFI_Dev_SupportUpHopping(void);
+extern kal_bool     SFI_Dev_IsModemTimingRecoveryRequired(void);
+extern void         SFI_Dev_SupportDelayResume(kal_bool flag);
+// GPRAM access functions
+extern void         SFI_GPRAM_Write(kal_uint32 gpram_offset, void* buff, kal_int32 length);
+extern kal_uint32   SFI_GPRAM_Write_C1A3(const kal_uint32 cmd, const kal_uint32 address);
+extern kal_uint32   SFI_GPRAM_Write_C1A4(const kal_uint32 cmd, const kal_uint32 address, kal_uint8 **p_data, kal_uint32 *length);
+
+#endif /* _FLASH_SF_H */
+
diff --git a/mcu/interface/driver/storage/flash_sfi_release.h b/mcu/interface/driver/storage/flash_sfi_release.h
new file mode 100644
index 0000000..6808aba
--- /dev/null
+++ b/mcu/interface/driver/storage/flash_sfi_release.h
@@ -0,0 +1,132 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2006
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *   flash_sfi_release.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   This Module defines the SFI (serial flash interface) related setting.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *   
+ *
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+Add common API:SFI_Dev_WorkingFrequencyQuery() to query SF Frequency

+[Query time]

+After MAUI TCT_Schedule() ready, each task is created.

+[Use method]

+1. Include header: mcu\interface\hal\storage\Flash_sfi_release.h

+2. Call SFI_Dev_WorkingFrequencyQuery()

+3. Return value of this function(enum):

+   SFI_CLK_UNKNOWN = 0

+   SFI_CLK_78MHZ   = 78

+   SFI_CLK_104MHZ  = 104

+   SFI_CLK_130MHZ  = 130

+[Notice]

+This function always exists, if the platform is not Serial Flash supported, return UNKNOWN .

+
+[Check-in branches]

+11B

+11B.1132SP

+MODEM_DEV
+
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#ifndef __FLASH_SFI_RELEASE__
+#define __FLASH_SFI_RELEASE__
+
+/**
+    * SFI clock rate for query.
+    */
+typedef enum sfi_clock_enum_t 
+{
+   SFI_CLK_UNKNOWN = 0,
+   SFI_CLK_78MHZ   = 78,
+   SFI_CLK_104MHZ  = 104,
+   SFI_CLK_130MHZ  = 130
+}sfi_clock_enum;
+
+/**
+    * SFI Voltage for query.
+    */
+typedef enum sfi_voltage_enum_t 
+{
+   SFI_Voltage_UNKNOWN = 0,
+   SFI_Voltage_18      = 18,  //1.8V
+   SFI_Voltage_30      = 30   //3.0V
+}sfi_voltage_enum;
+
+
+extern sfi_clock_enum SFI_Dev_WorkingFrequencyQuery(void);
+extern sfi_voltage_enum SFI_Dev_WorkingVoltageQuery(void);
+
+#endif /* __FLASH_SFI_RELEASE__ */
+
diff --git a/mcu/interface/driver/storage/mc/msdc_api.h b/mcu/interface/driver/storage/mc/msdc_api.h
new file mode 100644
index 0000000..465e019
--- /dev/null
+++ b/mcu/interface/driver/storage/mc/msdc_api.h
@@ -0,0 +1,169 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *   msdc_api.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   Header file of memory card host driver
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================ 
+ ****************************************************************************/
+#ifndef _MSDC_API_H
+#define _MSDC_API_H
+
+// enum
+typedef enum {
+	MS_CARD = 0,
+	SD_CARD = 1,
+	MMC_CARD = 2,
+	MSPRO_CARD = 3,
+	MMC40_CARD = 4,
+	SD20_LCS_CARD = 5,	// SD 2.0 compliant but with byte access mode. (<=2G)
+	SD20_HCS_CARD = 6,	// SD 2.0 compliant but with block access mode. (>2G)
+	MMC42_CARD = 7,		// MMC 4.2 compliant with block access mode
+	MMC_CARD_SIMPLUS = 8,
+	SD30_CARD,
+	MSDC_CARD_TYPE_MAX,
+	UNKNOWN_CARD = 0xF3
+} T_MSDC_CARD;
+
+typedef struct 
+{
+	//LOCAL_PARA_HDR
+	kal_uint8 media_size;
+	kal_uint8 media_index;
+        #if defined(__MSDC_DUAL_CARD_SWITCH__) && !defined(__MSDC_NOT_SUPPORT_HOT_PLUG__)
+	kal_uint8 media_status;
+	kal_uint16 media_array_size;
+	#endif
+	void *media_array;
+}msdc_card_detect_ind_struct; 
+
+/*+++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/*define for custom ,need check  ----begin*/
+/*+++++++++++++++++++++++++++++++++++++++++++++++++++*/
+typedef struct
+{
+	kal_uint32 (*Init)(void);
+	kal_bool (*IsCardInd)(void);
+	void (*PowerCtrl)(kal_bool on);
+} MSDC_Custom_Handle;
+
+typedef struct
+{
+	kal_uint8 cmd_clk_odc;
+	kal_uint8 dat_odc;
+	kal_uint8 cmd_clk_slew;
+	kal_uint8 dat_slew;
+}msdc_io_ctrl_struct;
+
+typedef enum
+{
+	MSDC_HOT_PLUG = 		0x1,	// MSDC support hot plugging
+	MSDC2_HOT_PLUG = 		0x2,	// MSDC2 support hot plugging
+	MSDC_WP = 				0x4,	//  MSDC support write protecton detection
+	MSDC2_WP = 				0x8,	// MSDC2 support write protection detection
+	MSDC_SD4_SDIO1 =		0x10,	// SD/MMC use MSDC1(4-bits) and SDIO use MSDC2(1-bits)
+	MSDC_SDIO4_SD1	= 		0x20	// vice versa
+	//MSDC_SDIO4_SDIO1,  // not support now
+}msdc_custom_enum;
+
+#if !defined(DRV_MSDC_MT6225_SERIES)
+// configure the output driving capacity and slew rate
+#define MSDC_ODC_2MA		0x0
+#define MSDC_ODC_4MA		0x1
+#define MSDC_ODC_6MA		0x2
+#define MSDC_ODC_8MA		0x3
+// only MT6227, MT6217 and MT6218B can support following driving capacity
+//#if defined(MT6228)||defined(MT6229) || defined(MT6227)|| defined(MT6226)|| defined(MT6226M)
+#define MSDC_ODC_10MA		0x4
+#define MSDC_ODC_12MA		0x5
+#define MSDC_ODC_14MA		0x6
+#define MSDC_ODC_16MA		0x7
+//#endif
+#elif defined(__DRV_MSDC_DRIVING_53_SERIES__)
+#define MSDC_ODC_4MA		0x0
+#define MSDC_ODC_8MA		0x4
+#define MSDC_ODC_12MA		0x2
+#define MSDC_ODC_16MA		0x6
+#elif defined(DRV_MSDC_DRIVING_36_SERIES)
+#define MSDC_ODC_4MA		0x0
+#define MSDC_ODC_12MA		0x1
+#define MSDC_ODC_8MA		0x2
+#define MSDC_ODC_16MA		0x3
+#elif defined(DRV_MSDC_DRIVING_6255_SERIES)
+#define MSDC_ODC_4MA		0x0
+#define MSDC_ODC_8MA		0x1
+#define MSDC_ODC_12MA		0x2
+#define MSDC_ODC_16MA		0x3
+#else
+#define MSDC_ODC_4MA		0x0
+#define MSDC_ODC_8MA		0x2
+#define MSDC_ODC_12MA		0x4
+#define MSDC_ODC_16MA		0x6
+#endif
+
+#ifndef DRV_MSDC_IOCON_CORRECT_SLEW_RATE
+#define MSDC_ODC_SLEW_FAST		1
+#define MSDC_ODC_SLEW_SLOW		0
+#else
+#define MSDC_ODC_SLEW_FAST		0
+#define MSDC_ODC_SLEW_SLOW		1
+#endif
+
+/*+++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/*define for custom ,need check   -----finish*/
+/*+++++++++++++++++++++++++++++++++++++++++++++++++++*/
+
+#endif//_MSDC_API_H
diff --git a/mcu/interface/driver/storage/mc/sd_adap.h b/mcu/interface/driver/storage/mc/sd_adap.h
new file mode 100644
index 0000000..0944df3
--- /dev/null
+++ b/mcu/interface/driver/storage/mc/sd_adap.h
@@ -0,0 +1,140 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2007
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *   msdc_adap_BL.h
+ *
+ * Project:
+ * --------
+ *   Maui
+ *
+ * Description:
+ * ------------
+ *   MSDC/SD driver adaption layer
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+ 
+#ifndef _SD_ADAP_H_
+#define _SD_ADAP_H_
+
+
+#if defined(__EMMC_BOOTING__)
+
+#include "fat_fs.h"
+
+#include "msdc_def.h"
+#include "sd_def.h"
+
+typedef enum 
+{
+	DRV_SUCCESS = 0,
+	DRV_ERROR,
+	DRV_INIT_FAILURE,
+	DRV_MOUNT_DEV_FAILURE,
+	DRV_READ_FAILURE,
+	DRV_WRITE_FAILURE,
+	DRV_BAD_BLOCK,
+	DRV_OPERATION_RETRY,
+	DRV_INVALID_PARAMETER,
+	DRV_ERASE_FAILURE,
+	DRV_NON_EMPTY,
+	DRV_NON_EMPTY_CHECK,
+	DRV_ECC_FAILURE,
+	DRV_ECC_CORRECTED
+} DRV_STATUS_CODE;
+
+typedef struct _emmc_addr {
+	eMMC_partitions partition;
+	unsigned int offset; // unit size: 512-byte
+} emmc_addr;
+
+extern DRV_STATUS_CODE DRV_SD_Init(void);
+extern DRV_STATUS_CODE DRV_SD_DeInit(void);
+extern DRV_STATUS_CODE DRV_SD_MountDevice(
+	mcdev_enum id,
+	unsigned int flags	// reserved
+	);
+extern DRV_STATUS_CODE DRV_SD_ReadSectors(
+	mcdev_enum id,
+	unsigned int sector,
+	unsigned int sectors,
+	void * buffer,
+	unsigned int flags	// reserved
+	);
+extern DRV_STATUS_CODE DRV_SD_WriteSectors(
+	mcdev_enum id,
+	unsigned int sector,
+	unsigned int sectors,
+	void * buffer,
+	unsigned int flags	// reserved
+	);
+
+#endif //__EMMC_BOOTING__
+
+
+#if defined(__CARD_DOWNLOAD__)
+
+#include "fat_fs.h"
+
+extern int BL_MSDC_Init(void);
+extern int BL_MSDC_DeInit(void);
+extern int BL_MSDC_MountDevice(void * DriveData, int DeviceNumber, int DeviceType, unsigned int Flags);
+extern int BL_MSDC_ReadSectors(void * DriveData, unsigned int Sector, unsigned int Sectors, void * Buffer);
+extern int BL_MSDC_GetDiskGeometry(void * DriveData, FS_PartitionRecord * DiskGeometry, BYTE * MediaDescriptor);
+
+#endif //__CARD_DOWNLOAD__
+
+
+#endif //_SD_ADAP_H_
diff --git a/mcu/interface/driver/storage/ramdisk_gprot.h b/mcu/interface/driver/storage/ramdisk_gprot.h
new file mode 100644
index 0000000..1ff4987
--- /dev/null
+++ b/mcu/interface/driver/storage/ramdisk_gprot.h
@@ -0,0 +1,190 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *    ramdisk_gprot.h
+ *
+ * Project:
+ * --------
+ *   Maui
+ *
+ * Description:
+ * ------------
+ *   This is header file for RAM Disk drivers.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ *******************************************************************************/
+#ifndef __RAMDISK_DRV_H__
+#define __RAMDISK_DRV_H__
+ 
+#include "custom_MemoryDevice.h"
+#include "kal_general_types.h"
+#include "fs_gprot.h"
+
+/*--------------------------------------------------------
+ * RAM Disk Size Configurations
+ *--------------------------------------------------------*/
+
+
+#ifdef RAMDISK_FS_SIZE
+    #define RAM_FS_SIZE                 (RAMDISK_FS_SIZE)                   // read FS size setting in custom_MemoryDevice.h
+#else
+    #define RAM_FS_SIZE                 (0x01000000)                        // default total RAM disk size: 16 MB
+#endif
+
+#ifdef RAMDISK_FS_FIRST_DRIVE_SECTORS
+    #define RAM_FS_FIRST_DRIVE_SECTORS  (RAMDISK_FS_FIRST_DRIVE_SECTORS)    // read FS first partition size setting in custom_MemoryDevice.h
+#else
+    #define RAM_FS_FIRST_DRIVE_SECTORS  (0)                                 // default public drive size: 0 (unit: number of 512-byte-sectors)
+#endif
+
+/*--------------------------------------------------------
+ * RAM Disk Internal Definitions
+ *--------------------------------------------------------*/
+
+#define RAM_SECTOR_SIZE                 (512)
+
+/*--------------------------------------------------------
+ * RAM Disk Error Codes
+ *--------------------------------------------------------*/
+
+typedef enum
+{
+    RAMDISK_NO_ERROR                = 0,
+    RAMDISK_INVALID_DISK_OFFSET     = -1,
+    RAMDISK_INVALID_DISK_SIZE       = -2,
+    RAMDISK_NOT_EXISTED             = -3,
+    RAMDISK_ERROR_CODE_END          = -65536
+} ramdisk_error_code;
+
+/*--------------------------------------------------------
+ * RAM Disk Query and Read Tool (for META Tool only now)
+ *--------------------------------------------------------*/
+
+/*
+ *  Check if RAM Disk is supported in this project. Please use this API to detect RAM Disk before using any other RAM Disk APIs.
+ *
+ *  Return Value:
+ *      1: RAM Disk is existed.
+ *      0: RAM Disk is not existed.
+ */
+kal_uint32 ramdisk_is_existed(void);
+
+/*
+ *  Get start address of RAM Disk.
+ *
+ *  Return Value:
+ *      Valid address must be a non-zero value. 0 means an invalid address.
+ */
+kal_uint32 ramdisk_get_raw_start_address(void);
+
+/*
+ *  Get length of RAM Disk.
+ *
+ *  Return Value:
+ *      Valid length must be a non-zero value. 0 means an invalid length.
+ */
+kal_uint32 ramdisk_get_raw_length(void);
+
+/*
+ *  Get raw data from RAM Disk.
+ *
+ *  Parameters:
+ *      [in/out] buf: Buffer address to read RAM Disk data (Buffer address could be byte-aligned)
+ *      [in] offset: Start offset. The valid range is 0 to disk size.
+ *      [in] length: Total read length
+ *
+ *  Return Value:
+ *      Positive integer: Number of bytes read to buffer successfully.
+ *      Negative integer: It is an error code. Please refer to ramdisk_error_code enum defined in ramdisk_gprot.h for the meaning of error codes.
+ */
+kal_int32 ramdisk_get_raw_data(void * buf, kal_uint32 offset, kal_uint32 length);
+
+/*--------------------------------------------------------
+ * RAM Disk Management Layer
+ *--------------------------------------------------------*/
+int     ramdisk_fdm_mount_device(void * DriveData, int DeviceNumber, int DeviceType, kal_uint32 Flags);
+int     ramdisk_fdm_shutdown(void * DriveData);
+int     ramdisk_fdm_read_sectors(void * DriveData, kal_uint32 Sector, kal_uint32 Sectors, void * Data);
+int     ramdisk_fdm_write_sectors(void * DriveData, kal_uint32 Sector, kal_uint32 Sectors, void * Data);
+int     ramdisk_fdm_media_changed(void * DriveData);
+int     ramdisk_fdm_get_disk_geometry(void * DriveData, FS_PartitionRecord * DiskGeometry, kal_uint8 * MediaDescriptor);
+int     ramdisk_fdm_recoverable_write_sectors(void * DriveData, kal_uint32 Sector, kal_uint32 Sectors, void * Buffer);
+int     ramdisk_fdm_resume_sector_states(void * DriveData);
+void    ramdisk_util_memcpy(void * dst, void * src, kal_uint32 len);
+
+#endif // __RAMDISK_DRV_H__
+
diff --git a/mcu/interface/driver/storage/sfi_hw.h b/mcu/interface/driver/storage/sfi_hw.h
new file mode 100644
index 0000000..b76d42f
--- /dev/null
+++ b/mcu/interface/driver/storage/sfi_hw.h
@@ -0,0 +1,145 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2007
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ *	flash_mtd.h
+ *
+ * Project:
+ * --------
+ *   MAUI
+ *
+ * Description:
+ * ------------
+ *   Serial flash interface definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ * 				HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+
+#ifndef _SFI_HW_H
+#define _SFI_HW_H
+
+#include "reg_base.h"
+
+//-------------------------------------------------------
+// Serial Flash Interface Access Macros
+//-------------------------------------------------------
+
+#define SFI_ReadReg8(addr)          *((volatile unsigned char *)(addr))
+#define SFI_ReadReg32(addr)         *((volatile unsigned int *)(addr))
+#define SFI_WriteReg32(addr, data)  *((volatile unsigned int *)(addr)) = (unsigned int)(data)
+
+//-------------------------------------------------------
+// Serial Flash Interface
+//-------------------------------------------------------
+// MT6251 and MT6252
+//-------------------------------------------------------
+
+
+#endif /* _SFI_HW_H */
diff --git a/mcu/interface/driver/storage/sim/MT6302_spi.h b/mcu/interface/driver/storage/sim/MT6302_spi.h
new file mode 100644
index 0000000..b87c9d0
--- /dev/null
+++ b/mcu/interface/driver/storage/sim/MT6302_spi.h
@@ -0,0 +1,124 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *    sim_MT6302.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   This file is the header file of MT6302 SPI interface
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+ #ifndef __MT6302_SPI_H__
+#define __MT6302_SPI_H__
+
+
+
+enum{
+	MT6302_SPI_USE_LCD = 0,
+	MT6302_SPI_USE_GPIO,
+	MT6302_SPI_USE_DEDICATED_GPIO
+};
+
+#define FILE_MT6302_SPI		0
+
+typedef void (*sim_MT6302_SPIWriter)(kal_uint32 chipNo, kal_uint8 data);
+
+typedef struct{
+	/*following is for LCD SPI*/
+	kal_uint32	MT6302_SPI_LCDSerialData;
+	kal_uint8		MT6302_LCD_pdnHandle; /*lcd_get_power_handle will return value less than 32, set this as RW 0xff*/
+} sim_MT6302_SPIInfo;
+
+
+
+void MT6302_spiInit(sim_MT6302_SPIWriter *spiWritePtr, kal_uint32 chipNo);
+void MT6302_spiPowerCtrl(kal_uint32 chipNo, kal_bool on);
+
+#endif /*__MT6302_SPI_H__*/
+//
diff --git a/mcu/interface/driver/storage/sim/mt6306_i2c.h b/mcu/interface/driver/storage/sim/mt6306_i2c.h
new file mode 100644
index 0000000..d3e84c8
--- /dev/null
+++ b/mcu/interface/driver/storage/sim/mt6306_i2c.h
@@ -0,0 +1,145 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *    sim_MT6302.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   This file is the header file of MT6302 SPI interface
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+ #ifndef __MT6306_I2C_H__
+#define __MT6306_I2C_H__
+
+#define SIMGPIO_VOLT_18V         0
+#define SIMGPIO_VOLT_28V         1
+#define SIMGPIO_VOLT_30V         2
+
+enum{
+	MT6302_SPI_USE_LCD = 0,
+	MT6302_SPI_USE_GPIO,
+	MT6302_SPI_USE_DEDICATED_GPIO,
+	MT6306_I2C_USE_DEDICATED_GPIO,
+	MT6306_I2C_USE_HW_I2C
+};
+enum{
+	MT6306_VIO_2V8 = 0,
+	MT6306_VIO_1V8,
+};
+
+#endif /*__MT6302_SPI_H__*/
+//
diff --git a/mcu/interface/driver/storage/sim/multi_icc_custom.h b/mcu/interface/driver/storage/sim/multi_icc_custom.h
new file mode 100644
index 0000000..513bf14
--- /dev/null
+++ b/mcu/interface/driver/storage/sim/multi_icc_custom.h
@@ -0,0 +1,124 @@
+#ifndef __MULTI_ICC_CUSTOM_H__
+#define __MULTI_ICC_CUSTOM_H__
+
+#ifdef __GEMINI__
+#ifdef GEMINI_PLUS
+#define MAX_SIM_CARD_NUM (GEMINI_PLUS)
+#else
+#define MAX_SIM_CARD_NUM (2)
+#endif // GEMINI_PLUS
+#else
+#define MAX_SIM_CARD_NUM (1)
+#endif //  __GEMINI__
+
+
+/* For sim hot plug callback function */
+#ifdef __PLUG_OUT_NO_SIM_PREVIOUSLY__
+typedef void (*SIM_HOT_PLUG_OUT_CALLBACK)(kal_uint32 simIf, kal_bool pwron_wo_sim);
+#endif
+typedef void (*SIM_HOT_PLUG_CALLBACK)(kal_uint32 simIf);
+
+typedef enum
+{
+    MTK_SIMIF0,
+    MTK_SIMIF1
+}SIM_hwCtrlInfo;
+
+typedef enum
+{
+    //SIM_ICC_APPLICATION_PHONE1 = 0x00000001,
+    SIM_ICC_APPLICATION_PHONE1 = 0x00000000, //in sim driver UT, we play a trick on this enum
+    SIM_ICC_APPLICATION_PHONE2,
+    SIM_ICC_APPLICATION_CMMB_SMD,
+    SIM_ICC_APPLICATION_PHONE3,
+    SIM_ICC_APPLICATION_PHONE4
+}SIM_ICC_APPLICATION;
+
+#define SIM_MT6302_INFO_UDF	0xff
+#define SIM_ICC_MT6302_NONE	0xffffffff
+
+typedef enum
+{
+    SIM_HOT_PLUG_EINT_NUMBER,
+    SIM_HOT_PLUG_EINT_DEBOUNCETIME,
+    SIM_HOT_PLUG_EINT_POLARITY,
+    SIM_HOT_PLUG_EINT_SENSITIVITY,
+    SIM_HOT_PLUG_EINT_SOCKETTYPE,
+    SIM_HOT_PLUG_EINT_DEDICATEDEN,
+    SIM_HOT_PLUG_EINT_SRCPIN
+}SIM_hot_plug_eint_queryType;
+
+typedef struct
+{
+    kal_bool polarity; /* hot swap EINT poarity */
+    kal_bool remove_polarity;   // polarity when card is removed
+    kal_bool removed;
+    kal_bool registed;
+    kal_uint32 logicalNum;
+    SIM_ICC_APPLICATION application;
+    kal_uint32 eintNo;
+    kal_uint32 debounceTime; /* hot swap EINT debounce time */	
+    kal_uint32 sensitivity;
+    kal_uint32 socketType;
+    SIM_HOT_PLUG_CALLBACK plugInCb;
+#ifdef __PLUG_OUT_NO_SIM_PREVIOUSLY__
+    SIM_HOT_PLUG_OUT_CALLBACK plugOutcb;
+#else
+    SIM_HOT_PLUG_CALLBACK plugOutcb;
+#endif
+}SIM_ICC_HOT_PLUG;
+
+typedef struct
+{
+    kal_uint32 logicalNum;
+    SIM_ICC_APPLICATION application;
+    SIM_hwCtrlInfo hwCtrl;
+    kal_uint8 needMT6302;
+    kal_uint8 MT6302ChipNum; /*whip MT6302, if there are lots*/
+    kal_uint8 MT6302PortNum; /*whip interface of this MT6302*/
+    kal_uint8 hotSwap; /* support hot swap or not */
+    kal_bool polarity; /* hot swap EINT poarity */
+    kal_uint32 debounceTime; /* hot swap EINT debounce time */
+} SIM_ICC_HW_SW_MAPPING;
+
+typedef enum
+{
+    SIM_SWITCH_NONE,
+    SIM_SWITCH_6302,
+    SIM_SWITCH_6306,
+    SIM_SWITCH_6314,
+}SIM_ICC_SWITCHCONTROL;
+
+typedef enum
+{
+   SIM_CUSTOM_T2D_GET_HOTSWAP_PROPERITY,
+   SIM_CUSTOM_T2D_GET_HOTSWAP_DEBOUNDETIME,
+   SIM_CUSTOM_T2D_UNKNOWN
+}sim_custom_t2d;
+
+extern kal_uint32 sim_get_ToalInterfaceCount(void);
+extern void sim_dbg_print(char *fmt,...);
+extern void sim_get_card_status(kal_uint32 logicalNum, kal_bool *isRemoved);
+#ifdef __PLUG_OUT_NO_SIM_PREVIOUSLY__
+extern void sim_reg_hot_plug_cb(SIM_ICC_APPLICATION application, 
+    SIM_HOT_PLUG_CALLBACK hotPlugInCb, 
+    SIM_HOT_PLUG_OUT_CALLBACK hotPlugOutCb);
+#else
+extern void sim_reg_hot_plug_cb(SIM_ICC_APPLICATION application, 
+    SIM_HOT_PLUG_CALLBACK hotPlugInCb, 
+    SIM_HOT_PLUG_CALLBACK hotPlugOutCb);
+#endif
+extern void sim_reg_hot_plug_eint(SIM_ICC_APPLICATION application, 
+    kal_uint32 eintNo, 
+    kal_uint32 debounceTime, 
+    kal_uint32 polarity, 
+    kal_uint32 sensitivity, 
+    kal_uint32 socketType);                      
+extern kal_uint8 MT6306_getDeviceAddr(void);
+extern kal_uint32 MT6306_getVIOLevel();
+extern void SIM_PlugEvent_Cb(SIM_ICC_APPLICATION app);                           
+#if defined(__SIM_HOT_SWAP_POLL_TIMER__) && defined(__SIM_HOT_SWAP_SUPPORT__)
+extern void SIM_PlugEvent_Poll_Timer_Cb(SIM_ICC_APPLICATION app);
+#endif
+#endif
+
diff --git a/mcu/interface/driver/storage/sim/sim_drv_trc.h b/mcu/interface/driver/storage/sim/sim_drv_trc.h
new file mode 100644
index 0000000..5c81d7e
--- /dev/null
+++ b/mcu/interface/driver/storage/sim/sim_drv_trc.h
@@ -0,0 +1,121 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+/*******************************************************************************
+ * Filename:
+ * ---------
+ *	sim_drv_trc.h
+ *
+ * Project:
+ * --------
+ *   general
+ *
+ * Description:
+ * ------------
+ *   This file is trace map definition.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ * 				HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! 
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! 
+ *==============================================================================
+ *******************************************************************************/
+#ifndef _SIM_DRV_TRC_H
+#define _SIM_DRV_TRC_H
+#ifndef GEN_FOR_PC
+#include "stack_config.h"
+#endif /* GEN_FOR_PC */
+#include "kal_trace.h"
+#if !defined(GEN_FOR_PC)
+#if defined(__TST_MODULE__) || defined(__CUSTOM_RELEASE__)
+#endif /* TST Trace Defintion */
+#endif
+#if !defined(GEN_FOR_PC)
+#if !defined(__MAUI_BASIC__)
+#include"sim_drv_trc_mod_sim_drv_utmd.h"
+#endif
+#endif
+#endif /* _SIM_DRV_TRC_H */ 
+//
diff --git a/mcu/interface/driver/storage/sim/sim_drv_trc_mod_sim_drv_utmd.json b/mcu/interface/driver/storage/sim/sim_drv_trc_mod_sim_drv_utmd.json
new file mode 100644
index 0000000..53b7d16
--- /dev/null
+++ b/mcu/interface/driver/storage/sim/sim_drv_trc_mod_sim_drv_utmd.json
@@ -0,0 +1,379 @@
+{
+  "endGen": "-", 
+  "legacyParameters": {}, 
+  "module": "MOD_SIM_DRV", 
+  "startGen": "Legacy",
+  "traceClassDefs": [
+    {
+      "TRACE_INFO": {
+        "debugLevel": "Medium", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "DesignInfo"
+      }
+    }, 
+    {
+      "TRACE_WARNING": {
+        "debugLevel": "Low", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "Public"
+      }
+    }, 
+    {
+      "TRACE_ERROR": {
+        "debugLevel": "Ultra-High", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "Public"
+      }
+    }, 
+    {
+      "TRACE_FUNC": {
+        "debugLevel": "Ultra-High", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "Public"
+      }
+    }, 
+    {
+      "TRACE_FUNC2": {
+        "debugLevel": "High", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "Public"
+      }
+    }, 
+    {
+      "TRACE_STATE": {
+        "debugLevel": "Ultra-Low", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "InternalDesign"
+      }
+    }, 
+    {
+      "TRACE_GROUP_1": {
+        "debugLevel": "Medium", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "CoreDesign"
+      }
+    }, 
+    {
+      "TRACE_GROUP_2": {
+        "debugLevel": "Ultra-Low", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "Public"
+      }
+    }, 
+    {
+      "TRACE_GROUP_3": {
+        "debugLevel": "Ultra-Low", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "Public"
+      }
+    }, 
+    {
+      "TRACE_GROUP_4": {
+        "debugLevel": "Ultra-Low", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "Public"
+      }
+    }, 
+    {
+      "TRACE_GROUP_5": {
+        "debugLevel": "Ultra-Low", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "Public"
+      }
+    }, 
+    {
+      "TRACE_GROUP_6": {
+        "debugLevel": "Ultra-Low", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "Public"
+      }
+    }, 
+    {
+      "TRACE_GROUP_7": {
+        "debugLevel": "Ultra-Low", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "Public"
+      }
+    }, 
+    {
+      "TRACE_GROUP_8": {
+        "debugLevel": "Ultra-Low", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "Public"
+      }
+    }, 
+    {
+      "TRACE_GROUP_9": {
+        "debugLevel": "Ultra-Low", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "Public"
+      }
+    }, 
+    {
+      "TRACE_GROUP_10": {
+        "debugLevel": "Ultra-Low", 
+        "tag": [
+          "Baseline" 
+        ], 
+        "traceType": "Public"
+      }
+    }
+  ], 
+  "traceDefs": [
+    {
+      "LOG_SIM_DRV": {
+        "apiType": "index", 
+        "format": "%s", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_1": {
+        "apiType": "index", 
+        "format": "%s", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_2": {
+        "apiType": "index", 
+        "format": "%s", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_3": {
+        "apiType": "index", 
+        "format": "%s", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_4": {
+        "apiType": "index", 
+        "format": "%s", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_1_X": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:0] %d : %x, %x, %x, %x, %x", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_2_X": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:1] %d : %x, %x, %x, %x, %x", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_3_X": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:2] %d : %x, %x, %x, %x, %x", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_4_X": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:3] %d : %x, %x, %x, %x, %x", 
+        "traceClass": "TRACE_INFO"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_1_D": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:0] %d : %d, %d, %d, %d, %d", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_2_D": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:1] %d : %d, %d, %d, %d, %d", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_3_D": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:2] %d : %d, %d, %d, %d, %d", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_4_D": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:3] %d : %d, %d, %d, %d, %d", 
+        "traceClass": "TRACE_GROUP_1"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_ATR": {
+        "apiType": "index", 
+        "format": "%s", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_BASIC_SIM_INFO": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:%d]L1usim_Reset OK voltage:%d, T:%d, app:%d, speed:%d", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_CMD_LEN": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:%d]L1sim_Cmd_Layer_MTK P3=%d, txSize=%d, rxData%c=NULL, *rxSize=%d", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_ICCID": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:%d]SIM ICCID= %s", 
+        "traceClass": "TRACE_FUNC2"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_ABNORMAL_CARD": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:%d]Reset with abnormal Card", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_AVG_CMD_TIME": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:%d] %d : %d, %d, %d, %d, %d", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_AVG_AUTH_TIME": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:%d] %d :SIM auth time: %d", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_AVG_STATUS_TIME": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:%d] %d :SIM status time: %d,%d", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_HISR": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:%d]SIM HISR int:%x, IRQEN:%x, state:%x", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_HISR_USIM": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:%d]USIM HISR int:%x, IRQEN:%x, state:%x", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_ERR": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:%d][ERR]%s", 
+        "traceClass": "TRACE_ERROR"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_NULL_TOUT": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:%d] : null timeout %d", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_NON_NULL_TOUT": {
+        "apiType": "index", 
+        "format": "[SIM_DRV:%d] : non-null timeout %d", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_REMOVE_SIM": {
+        "apiType": "index", 
+        "format": "[SIM_CUS_DRV:%d]Remove SIM : %x, %x, %x, %x, %x, %x, %x", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_INSERT_SIM": {
+        "apiType": "index", 
+        "format": "[SIM_CUS_DRV:%d]Insert SIM : %x, %x, %x, %x, %x, %x, %x", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_EINT": {
+        "apiType": "index", 
+        "format": "[EINT] : %x, %x, %x, %x", 
+        "traceClass": "TRACE_FUNC"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_SIM_PINS": {
+        "apiType": "index", 
+        "format": "[SIM_DRV][PINS] : %x, %x, %x, %x, %x, %x", 
+        "traceClass": "TRACE_INFO"
+      }
+    },
+    {
+      "LOG_SIM_DRV_GEMINI_GEN1": {
+        "apiType": "index", 
+        "format": "[SIM_GEN1]file %x, line %x, %x %x, %x %x %x %x", 
+        "traceClass": "TRACE_STATE"
+      }
+    }, 
+    {
+      "LOG_SIM_DRV_GEMINI_GEN2": {
+        "apiType": "index", 
+        "format": "[SIM_GEN2]%x %x, %x %x", 
+        "traceClass": "TRACE_GROUP_1"
+      }
+    }
+  ], 
+  "traceFamily": "PS"
+}