nand.h

来自「ebd9307开发板wince bsp源码,包括cs8900,lcd,nand,」· C头文件 代码 · 共 143 行

H
143
字号
#ifndef _FMD_H_
#define _FMD_H_

#include <windows.h>
#include <diskio.h>
#include <bldver.h>
#include <pcireg.h>

// FMD IOCTL definitions.
//
#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)


#define NUM_BLOCKS           0x800
#define SECTOR_SIZE          512
#define SPARE_SIZE           16
#define SECTORS_PER_BLOCK    32
#define BYTES_PER_BLOCK      (SECTOR_SIZE * SECTORS_PER_BLOCK)

#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 CMD_READ             0x00
#define CMD_READ1            0x01
#define CMD_READ2            0x50
#define CMD_READID           0x90
#define CMD_WRITE            0x80
#define CMD_WRITE2           0x10
#define CMD_ERASE            0x60
#define CMD_ERASE2           0xD0
#define CMD_STATUS           0x70
#define CMD_RESET            0xFF

#define NF_CE_H()                   (*GPIO_PFDR |= 0x80)
#define NF_CE_L()                   (*GPIO_PFDR &= 0x7F)
#define NF_ALE_H()                  (*GPIO_PFDR |= 0x01)
#define NF_ALE_L()                  (*GPIO_PFDR &= 0xFE)
#define NF_CLE_H()                  (*GPIO_PFDR |= 0x20)
#define NF_CLE_L()                  (*GPIO_PFDR &= 0xDF)
#define NF_RB                       (*GPIO_PBDR & 0x80)

#define ReadByte()               ((*NandFlashVIO))
#define WriteByte(b)             (*NandFlashVIO = b)
#define NandWaitBusy()           {while(!NF_RB);}
//#define NandWaitBusy()           {while(!(*NandFlashVIO&0x40));}

#define VALIDADDR                  0x05
#define BADBLOCKMARK               0x00
#define STATUS_ERROR               0x01
#define IMAGE_BLOCK                0x00

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;
	BYTE bOEMReserved;
	BYTE bBadBlock;
	WORD wReserved2;
}SectorInfo,*PSectorInfo;

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

typedef PVOID  (*PFN_INIT)(LPCTSTR lpActiveReg, PPCI_REG_INFO pRegIn, PPCI_REG_INFO pRegOut);
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;


PVOID  FMD_Init(LPCTSTR lpActiveReg, PPCI_REG_INFO pRegIn, PPCI_REG_INFO pRegOut);
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);

void GetPhysSectorAddr(DWORD dwSector, PSECTOR_ADDR pStartSectorAddr);


#endif

⌨️ 快捷键说明

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