📄 nand.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 + -