加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

nand flash裸板驱动的基本流程(s3c2440)

发布时间:2020-12-15 06:42:55 所属栏目:百科 来源:网络整理
导读:?********************************************************* nand flash裸板驱动的基本流程(s3c2440) ********************************************************* NAND FLASH的工作模式 ①自动启动模式 ②NAND FLASH 模式(软件) 一、自动启动模式:(
?*********************************************************
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读