K9F2G08U0A nand flash 的容量为256M byte,其内部有2048块,每块有64页,每页有2K+64字节,其间每页会分为main区(主域)和spare区(备用域),main区一般用来存入首要数据,spare一般用来寄存ECC校验码。
下面几点是编程时需求留意的:
1.NAND FLASH芯片手册里说的column是指页内地址,row是指页地址,page也是指页;
2.删去时是以块为单位的,可是删去块时写的是row地址,主动会删去row地点的块;
3.读写方法有页读写,或随机读写,所谓的随机读写便是能够在页内的任一当地读写一个字节;
4.ECC校验码分为main区的ECC和spare区的ECC,它们一般都会寄存在64字节的spare区内,下面是翻译2440手册的关于ECC编程的内容:
MainECCLock(NFCONT[5]) 和 SpareECCLock(NFCONT[6] 操控 ECC 校验码是否发生。
接下来是代码:
#ifndef __NAND_FLASH_H__ //为了避免重复包括
#define __NAND_FLASH_H__
#include “lhg_def.h” //U8,U32相关的宏,也即变量类型
#define MAX_NAND_BLOCK 2048
#define NAND_PAGE_SIZE 2048 //2048 blocks,1block has 64pages, each page has 2k+64 bytes
typedef struct nand_id_info //这样的结构体变量保存芯片的ID信息
{
} nand_id_info;
typedef struct bad_block_info //挂号坏块用的,只记载数量,没有记载坏块地址
{
} bad_block_info;
//
//NAND 操作指令,??从哪里来的,我看你怎样用
#define NAND_CMD_READ_1st
#define NAND_CMD_READ_2st
#define NAND_CMD_RANDOM_WRITE
#define NAND_CMD_RANDOM_READ_1st
#define NAND_CMD_RANDOM_READ_2st
#define NAND_CMD_READ_CB_1st
#define NAND_CMD_READ_CB_2st
#define NAND_CMD_READ_ID
#define NAND_CMD_RES
#define NAND_CMD_WRITE_PAGE_1st
#define NAND_CMD_WRITE_PAGE_2st
#define NAND_CMD_BLOCK_ERASE_1st
#define NAND_CMD_BLOCK_ERASE_2st
#define NAND_CMD_READ_STATUS
//NAND 中止向量,?这是什么意思
#define INT_NFCON (24)
//NFCONF HCLK=100MHZ,nandflash configuration register
#define S3C2440_NFCONF_TACLS_init (1<<12) //设置cle ale的持续时间,NFCONF[14:12]
#define S3C2440_NFCONF_TWRPH0_init (4<<8) //TWRPH0持续时间设置,NFCONF[10:8]
#define S3C2440_NFCONF_TWRPH1_init (0<<4) //TWRPH1持续时间设置,NFCONF[6:4]
#define S3C2440_NFCONF_BusWidth_init (0)
#define S3C2440_NFCONF_init() ( rNFCONF = S3C2440_NFCONF_TACLS_init
//NFCONT,nandflash control register
#define S3C2440_NFCONT_LockTight_init (0<<13)//disable lock-tight
#define S3C2440_NFCONT_SoftLock_init (0<<12)//disable lock
#define S3C2440_NFCONT_EnbIllegalAccINT_init (1<<10)//illegal access interrupt enable
#define S3C2440_NFCONT_EnbRnBINT_init (0<<9)//RnB ready not busy
#define S3C2440_NFCONT_RnB_TransMode_init (0<<8)//detect RnB type is rising edge
#define S3C2440_NFCONT_SpareECCLock_init (1<<6)//1 is to lock spare
#define S3C2440_NFCONT_MainECCLock_init (1<<5)//1 is to lock main area ecc generation
#define S3C2440_NFCONT_InitECC_init (1<<4)//1 is to initialize ecc decoder and encoder
#define S3C2440_NFCONT_Reg_nCE_init (1<<1)//force nFCE to high,namely disable chip-select
#define S3C2440_NFCONT_MODE_init (0)//disable nandflash controller
#define S3C2440_NFCONT_init() ( rNFCONT = S3C2440_NFCONT_LockTight_init | /