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

📄 fmd.h

📁 windows mobile 6.13 dnldr下载源码
💻 H
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Module Name:    FMD.H

Abstract:       FLASH Media Driver Interface for Windows CE

Notes:          The following module defines the required entry points for
                creating a new FLASH Media Driver (FMD) for Windows CE.  The
                FMD is called by the FLASH Abstraction Layer (FAL) and is
                responsible for directly writing to the underlying FLASH hardware
                (i.e. NAND/NOR chip).  In turn, the FAL handles all of the necessary
                wear-leveling of the device.  Practically, this means that the FMD
                is NEVER asked to read/write an invalid page or block.

                The FMD is responsible for:
                    * reading from the FLASH media
                    * writing to the FLASH media
                    * erasing FLASH media blocks
                    * performing error correcting-codes (ECC) on data stored on the
                      FLASH media (if necessary)

Environment:    As noted, this media driver works on behalf of the FAL to directly
                access the underlying FLASH hardware.  Consquently, this module
                needs to be linked with FAL.LIB to produce the device driver
                named FLASHDRV.DLL.

-----------------------------------------------------------------------------*/

#ifndef _FMD_H_
#define _FMD_H_

#include "syslib.h"

//#define RUN_IN_WINDOWS_MOBILE

// FMD IOCTL definitions.
//

#ifdef RUN_IN_WINDOWS_MOBILE
#define IOCTL_FMD_SET_XIPMODE   IOCTL_DISK_USER(0)
#define IOCTL_FMD_LOCK_BLOCKS   IOCTL_DISK_USER(1)
#define IOCTL_FMD_UNLOCK_BLOCKS IOCTL_DISK_USER(2)
#define IOCTL_FMD_GET_INTERFACE IOCTL_DISK_USER(3)
#define IOCTL_FMD_GET_XIPMODE   IOCTL_DISK_USER(4)
#else
#define IOCTL_FMD_SET_XIPMODE   (0)
#define IOCTL_FMD_LOCK_BLOCKS   (1)
#define IOCTL_FMD_UNLOCK_BLOCKS (2)
#define IOCTL_FMD_GET_INTERFACE (3)
#define IOCTL_FMD_GET_XIPMODE   (4)
#endif

// FMD block status definitions.
#define BLOCK_STATUS_UNKNOWN    0x01
#define BLOCK_STATUS_BAD        0x02
#define BLOCK_STATUS_READONLY   0x04
#define BLOCK_STATUS_RESERVED   0x08
#define BLOCK_STATUS_XIP        0x10
// FMD OEM reserved area bitfield.
#define OEM_BLOCK_RESERVED      0x01
#define OEM_BLOCK_READONLY      0x02


#define INVALID_BLOCK_ID        0xFFFFFFFF
#define INVALID_SECTOR_ADDR     0xFFFFFFFF


//--------------------------- Structure Definitions -----------------------------

typedef enum  _FLASH_TYPE { NAND, NOR } FLASH_TYPE;

typedef DWORD  SECTOR_ADDR;
typedef PDWORD PSECTOR_ADDR;

typedef DWORD  BLOCK_ID;
typedef PDWORD PBLOCK_ID;

typedef struct _FlashInfo
{
    FLASH_TYPE  flashType;
    DWORD       dwNumBlocks;
    DWORD       dwBytesPerBlock;
    WORD        wSectorsPerBlock;
    WORD        wDataBytesPerSector;

}FlashInfo, *PFlashInfo;


typedef struct _SectorInfo
{
    DWORD dwReserved1;              // Reserved - used by FAL
    BYTE  bOEMReserved;             // For use by OEM
    BYTE  bBadBlock;                // Indicates if block is BAD
    WORD  wReserved2;               // Reserved - used by FAL

}SectorInfo, *PSectorInfo;

typedef struct _BlockLockInfo
{
    BLOCK_ID StartBlock;
    ULONG    NumBlocks;
}BlockLockInfo, *PBlockLockInfo;


typedef PVOID  (*PFN_INIT)(void);
typedef BOOL  (*PFN_DEINIT)(PVOID);
typedef BOOL  (*PFN_GETINFO)(PFlashInfo pFlashInfo);
typedef DWORD (*PFN_GETBLOCKSTATUS)(BLOCK_ID blockID);
typedef BOOL (*PFN_SETBLOCKSTATUS)(BLOCK_ID blockID, DWORD dwStatus);
typedef BOOL  (*PFN_READSECTOR)(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors);
typedef BOOL  (*PFN_WRITESECTOR)(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors);
typedef BOOL  (*PFN_ERASEBLOCK)(BLOCK_ID blockID);
typedef VOID  (*PFN_POWERUP)(VOID);
typedef VOID  (*PFN_POWERDOWN)(VOID);
typedef VOID (*PFN_GETPHYSSECTORADDR)(DWORD dwSector, PSECTOR_ADDR pStartSectorAddr);


typedef struct _FMDInterface
{
    DWORD cbSize;
    PFN_INIT pInit;
    PFN_DEINIT pDeInit;
    PFN_GETINFO pGetInfo;
    PFN_GETBLOCKSTATUS pGetBlockStatus;
    PFN_SETBLOCKSTATUS pSetBlockStatus;
    PFN_READSECTOR pReadSector;
    PFN_WRITESECTOR pWriteSector;
    PFN_ERASEBLOCK pEraseBlock;
    PFN_POWERUP pPowerUp;
    PFN_POWERDOWN pPowerDown;
    PFN_GETPHYSSECTORADDR pGetPhysSectorAddr;
} FMDInterface, *PFMDInterface;


//------------------------------- Public Interface (used by the FAL) ------------------------------
PVOID  FMD_Init(void);
BOOL  FMD_Deinit(PVOID);
BOOL  FMD_GetInfo(PFlashInfo pFlashInfo);
DWORD FMD_GetBlockStatus(BLOCK_ID blockID);
BOOL FMD_SetBlockStatus(BLOCK_ID blockID, DWORD dwStatus);

BOOL  FMD_ReadSector (SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors);
BOOL  FMD_WriteSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors);

BOOL  FMD_EraseBlock(BLOCK_ID blockID);

VOID  FMD_PowerUp(VOID);
VOID  FMD_PowerDown(VOID);

BOOL  FMD_OEMIoControl(DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize,
                       PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned);

BOOL CheckMT29FBadBlock(BLOCK_ID blockID);

BOOL ReplaceBadBlockSign(void);

BOOL CreateNv(void);
BOOL InitNv(void);
BOOL ReplaceNvBlock(DWORD dwBlock);
BOOL WriteNv(DWORD dwAddress, PBYTE pDatabuf, DWORD dwLength, PDWORD pBytesReturned);
BOOL ReadNv(DWORD dwAddress, PBYTE pDatabuf, DWORD dwLength, PDWORD pBytesReturned);
BOOL CheckNV(void);

//---------------------------------------- Helper Functions ----------------------------------------

#define MIN(a, b)   (a)<(b)?(a):(b)
#define MAX(a, b)   (a)>(b)?(a):(b)

/* NV项参数的定义 */

/* 定义NV项所占据的空间 */
#define NV_START_BLOCK      4   /* NV项起始的Block */
#define NV_MAX_BLOCK        12  /* NV项所占最多的Block数 */
#define NV_BLOCK_NUM        4   /* NV项所占的Block数 */

/* 定义NV项参数 */
#define PARA_START_ADDR                         0x80000
#define PARA_MAX_LENGTH                         0x40000


#define NV_HKADC_ADDR                           PARA_START_ADDR
#define NV_HKADC_LENGTH                         FLASH_SECTOR_SIZE
#define NV_BTMAC_ADDR                           (NV_HKADC_ADDR + NV_HKADC_LENGTH)
#define NV_BTMAC_LENGTH                         FLASH_SECTOR_SIZE
#define NV_SYSTEMFLAG_ADDR                      (NV_BTMAC_ADDR + NV_BTMAC_LENGTH)
#define NV_SYSTEMFLAG_LENGTH                    FLASH_SECTOR_SIZE
#define NV_MODEMFLAG_ADDR                       (NV_SYSTEMFLAG_ADDR + NV_SYSTEMFLAG_LENGTH)
#define NV_MODEMFLAG_LENGTH                     FLASH_SECTOR_SIZE
#define NV_PRODUCTIONPARAM_ADDR                 (NV_MODEMFLAG_ADDR + NV_MODEMFLAG_LENGTH)
#define NV_PRODUCTIONPARAM_LENGTH               FLASH_SECTOR_SIZE
#define NV_CUSTOMERPARAM_ADDR                   (NV_PRODUCTIONPARAM_ADDR + NV_PRODUCTIONPARAM_LENGTH)
#define NV_CUSTOMERPARAM_LENGTH                 FLASH_SECTOR_SIZE
#define NV_REBOOTFLAG_ADDR                      (NV_CUSTOMERPARAM_ADDR + NV_CUSTOMERPARAM_LENGTH)
#define NV_REBOOTFLAG_LENGTH                    FLASH_SECTOR_SIZE
#define NV_VERSIONFLAG_ADDR                     (NV_REBOOTFLAG_ADDR + NV_REBOOTFLAG_LENGTH)
#define NV_VERSIONFLAG_LENGTH                   FLASH_SECTOR_SIZE
#define NV_TESTMODE_ADDR                        (NV_VERSIONFLAG_ADDR + NV_VERSIONFLAG_LENGTH)
#define NV_TESTMODE_LENGTH                      FLASH_SECTOR_SIZE
#define NV_BDADDRFLAG_ADDR                      NV_TESTMODE_ADDR + NV_TESTMODE_LENGTH
#define NV_BDADDR_LENGTH                        FLASH_SECTOR_SIZE
#define NV_LTKFLAG_ADDR                         NV_BDADDRFLAG_ADDR + NV_BDADDR_LENGTH
#define NV_LTKADDR_LENGTH                       FLASH_SECTOR_SIZE

#define NV_NEWIMG_ADDR                          NV_LTKFLAG_ADDR + NV_LTKADDR_LENGTH
#define NV_NEWIMG_LENGTH                        FLASH_SECTOR_SIZE

/*typedef struct
{
    ULONG  Signature;           // Config signature (used to validate).
    USHORT VerMajor;            // Config major version.
    USHORT VerMinor;            // Config minor version.
    ULONG  ConfigFlags;         // General bootloader flags.
    ULONG  IPAddr;              // Device static IP address.
    ULONG  CleanBoot;           // clean boot mode flags:0 is nomal other is clean mode.
    ULONG  fUpdateMode;         // Is the device in update mode?
    ULONG  SubnetMask;          // Device subnet mask.
    BYTE   BootDelay;           // Bootloader count-down delay.
    BYTE   LoadDeviceOrder;     // Search order for download devices.
    USHORT USBRNDISMAC[3];      // Crystal USB-RNDIS MAC address.
    ULONG  LaunchAddress;       // Kernel region launch address.
    ULONG  ModemFlag;            //modem adjust flag
} BOOT_CFG, *PBOOT_CFG;*/

typedef struct
{
    UINT8 ucUpdateMode;
    UINT8 ucCleanBoot;
    UINT8 ucRev1;
    UINT8 ucRev2;
}BOOT_FLAG, PBOOT_FLAG;

typedef struct _SYSTEM_FLAG_INFO{
    UINT32 m_cleanBootfg;                       //恢复出厂设置标志位
    UINT32 m_updatefg;                          //软件升级标志位
} SYSTEM_FLAG_INFO, *PSYSTEM_FLAG_INFO;

typedef struct _MODEM_FLAG_INFO{
    UINT32 m_modemfg;                           //校准通道标志位
} MODEM_FLAG_INFO, *PMODEM_FLAG_INFO;

typedef struct _HKADC_OFFSET_INFO{
    UINT32 m_calfg;                             //是否校准完成标志位
    int    m_Offset_1[2];                       //HKADC校准参数1
    int    m_Offset_2[2];                       //HKADC校准参数2
    int    m_Offset_3[2];                       //HKADC校准参数3
    int    m_Offset_4[2];                       //HKADC校准参数4
    int    m_Offset_5[2];                       //HKADC校准参数5
    int    m_Offset_6[2];                       //HKADC校准参数6
    int    m_Offset_7[2];                       //HKADC校准参数7
    int    m_ChargFg;                           //充电标志位
    int    m_Vbat;                              //电池电压
}HKADC_OFFSET_INFO,*PHKADC_OFFSET_INFO;

typedef struct
{
    char cFSN[64];      /* 工厂序列号 */
    char cMSN[64];      /* 制造商序列号 */
    long lFSNFlag;      /* FSN写入标识 */
    long lMSNFlag;      /* MSN写入标识 */
    long lCTFlag;       /* 校准完成标识 */
    long lFTFlag;       /* 终测完成标识 */
    long lBMMIFlag;     /* 板级MMI完成标识 */
    long lAMMIFlag;     /* 组装MMI完成标识 */
    long lMTFlag;       /* 整机测试完成标识 */
    long lIMEIFlag;     /* IMEI写入标识 */
} PRODUCTION_PARAM_STRU;

typedef struct  __bd_addr {
    union {
        struct {
            unsigned int LAP : 24;  // Lower address part
            unsigned int UAP : 8;   // Upper address part
        };
        unsigned int SAP;           // Significant address part
    };

    unsigned short NAP;             // Non-significant address part
} BD_ADDR;

typedef struct _TEST_MODULE_INFO{
    UINT32 m_TestModeFg;                       //测试模式标志位.Bit 0:USB Module
} TEST_MODULE_INFO, *PTEST_MODULE_INFO;

typedef struct _BT_ADDR_INFO{
    UINT32   uiBdrflag;                             /*蓝牙地址写入标志*/
    BD_ADDR  bdr;                                   /*NV项蓝牙地址*/
}BT_ADDR_INFO, *PBT_ADDR_INFO;

#define MAX_CUSTOM_BLOCK	800						/* 限制Custom最大为100MB,800*128KB */

typedef struct _NEW_IMG_INFO{
    DWORD   dwStartBlockAddress;                   /*客户定制映象起始地址*/
    DWORD   dwLength;                              /*客户定制映象长度*/
    DWORD   dwNewImgUpdataFlag;                    /*客户定制映象更新完成标志*/
    DWORD   dwNewImgLoadFlag;                      /*客户定制映象拷贝完成标志*/
}NEW_IMG_INFO, *PNEW_IMG_INFO;


#endif

⌨️ 快捷键说明

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