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

📄 nand.h

📁 windows mobile 6.13 dnldr下载源码
💻 H
字号:
/*******************************************************************************
 * Copyright:   Copyright (c) 2007. Hisilicon Technologies, CO., LTD.
 * Version:     V300R001B02
 * Filename:    nand.h
 * Description: FMD驱动NANDC子模块功能头文件
 * History:
                  1.Created by chenbiyao on 2007/04/09
*******************************************************************************/


#ifndef _NAND_H_
#define _NAND_H_

#include "fmd.h"

#define FLAG_START_BLOCK                    4
#define IMG_START_BLOCK                     16
#define IMG_START_ADDR                      0x200000
#define USERSTORE_START_ADDR                0x4000000

    /*打印开关*/
#define DBG_FMD_INIT                        1//DEBUGZONE(1<<0)
#define DBG_FMD_GETINFO                     1//DEBUGZONE(1<<1)
#define DBG_FMD_GETSTATUS                   0//DEBUGZONE(1<<2)
#define DBG_FMD_SETSTATUS                   0//DEBUGZONE(1<<3)
#define DBG_FMD_DEINIT                      0//DEBUGZONE(1<<4)
#define DBG_FMD_READSECTOR                  0//DEBUGZONE(1<<5)
#define DBG_FMD_WRITESECTOR                 0//DEBUGZONE(1<<6)
#define DBG_FMD_ERASEBLOCK                  0//DEBUGZONE(1<<7)
#define DBG_FMD_OEMIOCTL                    0//DEBUGZONE(1<<8)
#define DBG_FMD_POWERUP                     0//DEBUGZONE(1<<9)
#define DBG_FMD_POWERDOWN                   0//DEBUGZONE(1<<10)
#define DBG_FMD_BMM                         0//DEBUGZONE(1<<11)
#define DBG_FMD_NANDC                       0//DEBUGZONE(1<<12)
#define DBG_FMD_FUNCTION                    0//DEBUGZONE(1<<13)
#define DBG_FMD_WARNING                     0//DEBUGZONE(1<<14)
#define DBG_FMD_ERROR                       1//DEBUGZONE(1<<15)

#define ZONE_FMD_OPS                        0
#define ZONE_FMD_ERR                        1

    /*Flash ID*/
#define K5E2G1GACM                          0x441500AA
#define MT29F2G16ABD                        0x505580BA

    /*flash size 2G bit*/
#define FLASHSIZE_2GBIT                 (256*1024*1024)

    /*FLASH命令字宏定义*/
#define NF_CMD_READPAGE                 0x3000  //  Read Command
#define NF_CMD_STATUSREAD               0x70    //  Read Status Command
#define NF_CMD_BLOCKERASE               0xD060  //  Erase Command
#define NF_CMD_IDREAD                   0x90    //  ReadID Command
#define NF_CMD_RESET                    0xFF    //  Reset Command
#define NF_CMD_PAGEPROG_FIRST           0x80    //  Page Program Start1 Command
#define NF_CMD_PAGEPROG_SECOND          0x10    //  Page Program Start2 Command
#define NF_CMD_CACHEPROG                0x1580  //  Cache Program Command
#define NF_CMD_RANDOMIN                 0x85    //  Random Data-In Command
#define NF_CMD_RANDOMOUT                0xE005  //  Random Data-Out Command
#define NF_CMD_READFORCOPYBACK          0x3500  //  Read For Copy Back Command

    /*NANDC寄存器偏移地址定义*/
#define NANDC_REG_ADDR                  0x21000

    /*默认NANDC控制器基地址*/
#ifdef HISI3610_CHIP
  #define NANDC_DATA_BASE_ADDR          0x30100000
  #define NANDC_PHY_INTRRUPT            23
#else
  #define NANDC_DATA_BASE_ADDR          0x92100000
  #define NANDC_PHY_INTRRUPT            55
#endif

    /*使用寄存器默认配置*/
#define NF_CFG_USING_DEFAULT
    /*默认器件管脚没有设置*/
#undef HARDWARE_READY

    /*接收缓冲区映射长度*/
#define NF_DATA_BUFFER_LENGTH           0x22000

    /*寄存器地址映射长度*/
#define NF_CONFIG_BUFFER_LENGTH         0x30

    /*NAND FLASH特性数据宏定义*/
#define NF_NUM_BLOCKS                       2048
#define NF_SECTOR_SIZE                  2048
#define NF_SECTORS_PER_BLOCK            64
#define NF_SPARE_SIZE                   64
#define BLOCKS_NUM_2048                 2048
#define BLOCKS_NUM_1024                 1024

    /*NAND FLASH特性数据宏定义*/
#define FLASH_BLOCK_SIZE                    0x20000
#define FLASH_BLOCK_NUMBERS                 1024
#define FLASH_SECTOR_SIZE                   2048
#define FLASH_SECTOR_NUMBERS                64
#define FLASH_SPARE_SIZE                    64

    /*ID号长度*/
#define NF_ID_LENGTH                    5

    /*status bits*/
#define NF_STATUS_BITS                  1

    /*扇区地址偏移值*/
#define NF_SECTOR_ADDR_SHIFT            4096

#define TIMEOUTFORMUTEX                 1000

    /*NAND 寄存器配置值宏定义*/
    /*等待寄存器*/
#define WT_PULSE_1_CLK                  0x0     //写信号低电平1个时钟周期
#define WT_PULSE_4_CLK                  0xF     //写信号低电平4个时钟周期
#define RD_PULSE_1_CLK                  0x0     //读信号低电平1个时钟周期
#define RD_PULSE_4_CLK                  0xF0    //读信号低电平4个时钟周期
#define RW_HIGH_WIDTH_1                 0x0     //读写信号高电平1个时钟周期
#define RW_HIGH_WIDTH_3                 0x200   //读写信号高电平3个时钟周期
#define RW_HIGH_WIDTH_4                 0xF00   //读写信号高电平4个时钟周期
#define WAIT_BUSY_DELAY_1               0x0     //命令和最后一个地址到BUSY状态的延时1个时钟周期
#define WAIT_BUSY_DELAY_16              0xF000  //命令和最后一个地址到BUSY状态的延时16个时钟周期

#ifdef HISI3610_CHIP
  #define NANDC_WSC_CONFIG              0xF131
#else
  #define NANDC_WSC_CONFIG              0x200
#endif

    /*器件配置寄存器*/
#define BYTE_PER_PAGE_2K                0x1     //每页2k字节
#define BYTE_PER_PAGE_512               0x0     //每页512字节
#define IO_WIDTH_16_BIT                 0x2     //数据位宽16bit
#define IO_WIDTH_8_BIT                  0x0     //数据位宽8bit

#define HIGH_ADDR_SHIFT_BITS            28
#define LOW_ADDR_SHIFT_BITS             4

    /*命令配置寄存器*/
#define NF_ADDR_4BITS                   0x4
#define NF_ADDR_5BITS                   0x5
#define NF_SINGLE_CMD                   0x0     //命令+地址
#define NF_TWO_CMD                      0x10    //命令+地址+命令
#define NF_STATE_RUN                    0x0     //发送命令之后启动读写状态机
#define NF_STATE_STOP                   0x20    //发送命令之后不启动读写状态机
#define NF_READ_MODE                    0x0     //CPU读数据
#define NF_WRITE_MODE                   0x40    //CPU写数据
#define NF_ADD_CYC_1BIT                 0x1
#define NF_ADD_CYC_3BIT                 0x3

    /*NANDC配置寄存器*/
#define BOOT_MODE                       0x0
#define NORMAL_MODE                     0x1
#define ECC_DATA_CHECK_ENABLE           0x0
#define ECC_DATA_CHECK_DISABLE          0x2
#define ECC_LSN_CHECK_ENABLE            0x0
#define ECC_LSN_CHECK_DISABLE           0x4
#ifdef HI3611_V120_MP
#define ECC_CORRECT_ENABLE              0x8
#define ECC_CORRECT_DISABLE             0x0
#else
#define ECC_CORRECT_ENABLE              0x0
#define ECC_CORRECT_DISABLE             0x8
#endif

    /*中断位(用于三个中断寄存器)*/
#define CMD_SEND_INT_BIT                0x1
#define READ_DONE_INT_BIT               0x2
#define WRITE_DONE_INT_BIT              0x4
#define DATA_ECC_1BIT_ERROR_INT_BIT     0x200000
#define DATA_ECC_2BIT_ERROR_INT_BIT     0x400000
#define LSN_ECC_1BIT_ERROR_INT_BIT      0x800000
#define LSN_ECC_2BIT_ERROR_INT_BIT      0x1000000

    /*NAND FLASH操作状态值宏定义*/
#define NF_STATUS_SUCCESS               0x1
#define NF_STATUS_READY                 0x40
#define NF_PROGRAM_SUCCESS              0x1
#define NF_ERASE_SUCCESS                0x1

    /*NAND FLASH中断类型*/
#define NF_CMD_DONE                     0x1
#define NF_READ_DONE                    0x2
#define NF_WRITE_DONE                   0x4
#define NF_READ_BUF_READY               0x8
#define NF_DATA_ECC_1BIT                0x100
#define NF_DATA_ECC_2BIT                0x200
#define NF_LSN_ECC_1BIT                 0x400
#define NF_LSN_ECC_2BIT                 0x800

    /*NAND FLASH返回错误类型*/
#define FMD_SUCCESS                     0
#define FMD_BASE_ERROR                   0x80000000
#define NF_BASE_ERROR                   (FMD_BASE_ERROR + 0x2000)
#define NF_PARAMETER_ERROR              (NF_BASE_ERROR + 1)
#define NF_CREATE_MUTEX_ERROR           (NF_BASE_ERROR + 2)
#define NF_INT_INIT_ERROR               (NF_BASE_ERROR + 3)
#define NF_READ_INT_MISS                (NF_BASE_ERROR + 4)
#define NF_WRITE_INT_MISS               (NF_BASE_ERROR + 5)
#define NF_READID_ERROR                 (NF_BASE_ERROR + 6)
#define NF_ECC_CORRECT_ERROR            (NF_BASE_ERROR + 7)
#define NF_PAGEREAD_ERROR               (NF_BASE_ERROR + 8)
#define NF_PAGEPROGRAM_ERROR            (NF_BASE_ERROR + 9)
#define NF_BLOCKERASE_ERROR             (NF_BASE_ERROR + 10)
#define NF_INT_REQ_ERROR                (NF_BASE_ERROR + 11)
#define NF_MEMMAP_ERROR                 (NF_BASE_ERROR + 12)
#define NF_NO_INT_ERROR                 (NF_BASE_ERROR + 13)
#define NF_NOT_SUPP_ERROR               (NF_BASE_ERROR + 14)
#define NF_MEMCPY_ERROR                 (NF_BASE_ERROR + 15)
#define NF_LSN_ECC_CORRECT_ERROR        (NF_BASE_ERROR + 16)


#define FLASH_IS_NO_NV          0
#define FLASH_IS_VALID_NV       1
#define FLASH_IS_INVALID_NV     2



    /*块状态*/
#define NF_BLOCK_BAD                    0
#define NF_BLOCK_NOTBAD                 1
#define NF_BLOCK_BAD_FLAG               0

    /*块信息转换类型*/
#define SPAREAREA_TO_BLOCKINFO          0x01    //SpareArea到块信息的转换
#define BLOCKINFO_TO_SPAREAREA          0x02    //块信息到SpareArea的转换

#pragma pack(1)
// Flash-system interface characteristics.
typedef struct _FLASH_SYSINTERFACE_INFO
{
    UCHAR VccMinProgV;                // Vcc logic supply minimum program/erase voltage.
    UCHAR VccMaxProgV;                // Vcc logic supply maximum program/erase voltage.
    UCHAR VppMinProgV;                // Vpp logic supply minimum program/erase voltage.
    UCHAR VppMaxProgV;                // Vpp logic supply maximum program/erase voltage.
    struct
    {
        UCHAR SnglWordProgTO_us;    // Typical single word program time-out (in us).
        UCHAR WriteBuffTO_us;        // Typical buffer write time-out (in us).
        UCHAR BlockEraseTO_ms;        // Typical block erase time-out (in ms).
        UCHAR ChipEraseTO_ms;        // Typical full-chip erase time-out (in ms).
    } Typical;
    struct
    {
        UCHAR SnglWordProgTO_us;    // Max single word program time-out (in us).
        UCHAR WriteBuffTO_us;        // Max buffer write time-out (in us).
        UCHAR BlockEraseTO_ms;        // Max block erase time-out (in ms).
        UCHAR ChipEraseTO_ms;        // Max full-chip erase time-out (in ms).
    } Max;
} FLASH_SYSINTERFACE_INFO, *PFLASH_INTERFACE_INFO;

// Flash geometry characteristics.
typedef struct _FLASH_GEOMETRY_INFO
{
    UCHAR DevSize;                    // Flash size (n = 2^n bytes).
    USHORT DevInterface;            // Interface type (8/16).
    USHORT WriteBuffSize;            // Write buffer size (n = 2^n bytes).
    UCHAR NumEraseBlocks;            // Number of flash blocks in an erase region.
    USHORT NumIdentEraseBlocks;        // Number of identical-sized erase blocks (number of blocks).
    USHORT EraseRegionSize;         // Size of an erase region.
} FLASH_GEOMETRY_INFO, *PFLASH_GEOMETRY_INFO;


// All flash information.
typedef struct _FMD_FLASH_INFO
{
    ULONG BaseAddress;                // Flash base address.
    ULONG FlashLength;                // Length of flash to be managed.
    ULONG BlockSize;                // Block size (computed from CFI data).
    ULONG TotalFlashBlocks;            // Number of flash blocks.
    ULONG SectorSize;                       // Sector size
    FLASH_SYSINTERFACE_INFO SysInt;    // Flash-system interface information.
    FLASH_GEOMETRY_INFO Geometry;    // Flash geometry information.
} FMD_FLASH_INFO, *PFMD_FLASH_INFO;
#pragma pack()
    typedef struct
    {
        DWORD NANDC_DATANUM;
        DWORD NANDC_WSC;
        DWORD NANDC_DEVICECFG;
        DWORD NANDC_CMDCFG;
        DWORD NANDC_CMD;
        DWORD NANDC_ADDRL;
        DWORD NANDC_ADDRH;
        DWORD NANDC_BUFCFG;
        DWORD NANDC_BUFREADY;
        DWORD NANDC_INTEN;
        DWORD NANDC_INTSTATUS;
        DWORD NANDC_INTCLR;
        DWORD NANDC_STARTRD;
        DWORD NANDC_CSDNEN;
        DWORD NANDC_LOCKSTARTADDR1;
        DWORD NANDC_LOCKENDADDR1;
        DWORD NANDC_LOCKSTARTADDR2;
        DWORD NANDC_LOCKENDADDR2;
        DWORD NANDC_LOCKSTARTADDR3;
        DWORD NANDC_LOCKENDADDR3;
        DWORD NANDC_LOCKSTARTADDR4;
        DWORD NANDC_LOCKENDADDR4;
        DWORD NANDC_LOCKEN;
        DWORD NANDC_LOCKCTL;
    }
    NANDC_REG , *PNANDC_REG;

typedef BOOL  (*PFN_CHECKBADBLOCK)(BLOCK_ID blockID);

    /*整片FLASH信息*/
typedef struct
{
    /*FLASH器件特性*/
    DWORD BlockSize;                // Block size (computed from CFI data).
    DWORD SectorSize;               // Sector size
    DWORD SectorsPerBlock;          // Number of sectors per block.
    DWORD pBaseAddress;             // Filesystem base address
    DWORD FilesystemSize;           // Length of flash to be managed.
    DWORD TotalBlockNumbers;        // Total Flash numbers
    DWORD FilesystemBlocks;         // Number of filesystem flash blocks.
    DWORD dwPhyIntr;                // phy interrupt numbers
    DWORD dwNandcBaseAddr;          // Nandc buffer address
    DWORD SpareSize;                // size of spare area
    BOOL  bRunWithIntr;             // Interrupt enable or not
    SectorInfo stSectorInfo;

    PBYTE pNvBlock;                   // Nv Block buffer
    BOOL  bNvInitialFlag;             // Nv is initizlized
    DWORD dwNvAddr[NV_BLOCK_NUM];// Nv address map

    DWORD dwAddrShift;              // address shift bit
    DWORD dwStatusBits;             // status bits
    BYTE  pucSpareArea[64];

    PFN_CHECKBADBLOCK   pfnCheckOrgBadBlock;

}
FLASH_CHIP_STRU;
    /*------------------------------- Public Interface (used by the FMD/BMM) ------------------------------*/
    DWORD NF_Init(DWORD *pdwFlashID);
    VOID  NF_Deinit(VOID);
    DWORD NF_ReadID(PDWORD pIDBuf);
    DWORD NF_PageRead(DWORD startAddr, PBYTE pDataBuff, DWORD dwLength);
    DWORD NF_PageProgram(DWORD startAddr, CONST BYTE * pDataBuff, DWORD dwLength);
    DWORD NF_BlockErase(BLOCK_ID blockID);
    DWORD NF_ReadStatus(PWORD pStatus);
    DWORD NF_IsBadBlock(BLOCK_ID blockID,PDWORD pIsBadBlock);


#endif  /*_NAND_H_*/

⌨️ 快捷键说明

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