- 论坛徽章:
- 0
|
*********************************************************
nand flash裸板驱动的基本流程(s3c2440)
*********************************************************
NAND FLASH的工作模式
①自动启动模式
②NAND FLASH 模式(软件)
一、自动启动模式:(auto boot)
1、H/W set 硬件配置
2、复位之后,NAND FLASH的最先4KB的,代码被复制到stepping stone中。stepping stone为内部SRAM(4Kbytes)
3、stepping stone 被映射为Bank0(nGS0),且CPU在此4KB内部SRAM中开始执行启动代码(Bootloader)
【注】启动之后 stepping stone 可用于其他用途。
由于NAND FLASH的特殊结构和寻址方式(串行),使得无法在NAND FLASH上执行代码。因此,在程序开始时,需将
NAND FLASH上的代码复制到SDRAM中,之后程序在SDRAM中执行。复制的任务是在stepping stone中完成的,也就
是NAND FLASH 中的最开始4KB程序的任务
另外,2440A的Memory Map中,只有BANK6/7可以映射SDRAM,最大容量为128M*2=256MB
当main代码总量超过这个值时(256MB),就不能采用NAND FLASH启动模式。只能使用Nor FLASH启动【OM[1:0]=01,10】
同样与硬件的使用情况有关。
二、NAND FLASH(软件)模式:
======================================================================== NAND FLASH初始化========================================================================
1.NFCONF[0x4E000000]
TACLS [14:12] CLE&ALE duration = HCLK*TACLS
TWRPH0 [10:8] TWRPH0 duration = HCLK*(TWRPH0+1)
TWRPH1 [6:4] TWRPH1 duration = HCLK*(TWRPH1+1)
AdvFlash(R) [3] Advanced NAND, 0:256/512, 1:1024/2048
PageSize(R) [2] NAND memory page size
when [3]==0, 0:256, 1:512 bytes/page.
when [3]==1, 0:1024, 1:2048 bytes/page.
AddrCycle(R) [1] NAND flash addr size
when [3]==0, 0:3-addr, 1:4-addr.
when [3]==1, 0:4-addr, 1:5-addr.
BusWidth(R/W) [0] NAND bus width. 0:8-bit, 1:16-bit.
2.NFCONT[0x4E000004]
Lock-tight [13] 0:Disable lock, 1:Enable lock.
Soft Lock [12] 0:Disable lock, 1:Enable lock.
EnablillegalAcINT [10] Illegal access interupt control. 0:Disable, 1:Enable
当soft lock 或者lock-tight置一时,
NAND FLASH可用区域被锁定
其范围为NFSBLK[0x4E000038]和NFEBLK[0x4E00003C]-1指定的区域
凡是对可用区域以外的访问都是illegal access
EnbRnBINT [9] RnB interrupt. 0:Disable, 1:Enable
RnB_TrandMode [8] RnB transition detection config. 0:Low to High, 1:High to Low
SpareECCLock [6] 0:Unlock, 1:Lock
MainECCLock [5] 0:Unlock, 1:Lock
InitECC(W) [4] 1:Init ECC decoder/encoder.
Reg_nCE [1] 0:nFCE=0, 1:nFCE=1.
NANDC Enable [0] operating mode. 0:Disable, 1:Enable.
=====================================================================
读取NAND FLASH ID
=====================================================================
1.NFChipEn(); //使能NAND FLASH
2.WrNFCmd(RdIDCMD); //读取ID指令RdIDCMD=0x90
3.WrNFAddr(0); //写入地址,必须是00h
4.While(NFIsBusy()); //等待NFSTAT:0=0
5.id=RdNFDat()>8); //写入A17~A24
if(NandAddr) //如果NAND FLASH容量>32M NandAddr=1否则NandAddr=0
WrNFAddr(addr>>16);//NAND FLASH>32MB,写入A25
//当NAND FLASH32MB时,page地址线有17根(A9~A25)
5.WrNFCmd(ERASECMD1); //块擦除指令EARSECMD1=0xd0【2nd cycle】
6.NFChipDs(); //NAND FLASH除能
========================================================================
NAND FLASH页读取
========================================================================
1.NFChipEn(); //NAND FLASH使能
2.WrNFCmd(READCMD0) //读取指令READCMD0=0x0
3.WrNFAddr(0); //由于读页,所以地址页对准,A0~A7=00H
WrNFAddr(addr); //写入地址A9~A16
WrNFAddr(addr>>8); //写入地址A17~A24
if(NandAddr)
WrNFAddr(addr>>16); //NAND FLASH>32MB,写入地址A25
4 InitEcc(); //reset Ecc:rNFCONT|=(1>8); //写入地址A17~A24
if(NandAddr)
WrNFAddr(addr>>16); //NAND FLASH>32MB时,写入A25
4.InitEcc(); //reset ECC
5.MEccUnlock(); //MEccUnlock: rNFCONT&=~(1>8)&0xff;
tmp2=(mecc>>16)&0xff;
tmp3=(mecc>>24)&0xff;
tmp5=0xff; //0xff将作为good block标识,储存在spare area
9.SEccUnlock(); //SEccUnlock:rNFCONT&=~(1>8); //写入地址A17~A24
if(NandAddr)
WrNFAddr(addr>>16); //NAND FLASH>32MB,写入A25
5.NFWaitBusy(); //延时+等待NFSTAT:0=0
//也可以通过NAND状态读取来查询状态
//【注意】等待的子程序中不能有READCMD0等指令写入,
//否则pointer指向A块
6.data=RdNFDat(); //读取data=NFDATA[0x4E000010]
7.WrNFCmd(READCMD0); //读取指令READCMD0=0x0,pointer指向A块(1st main area)
8.NFChipDs(); //NAND FLASH除能
若data!=0xff,则当前块(addr)为坏块。
========================================================================
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/96362/showart_2113251.html |
|