免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1887 | 回复: 0
打印 上一主题 下一主题

nand flash裸板驱动的基本流程(s3c2440) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-07 21:10 |只看该作者 |倒序浏览


*********************************************************
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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP