免费注册 查看新帖 |

Chinaunix

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

对Nand flash操作的分析 [复制链接]

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

这几天看关于2440的nandflash部分,看到这篇文章,挺不错,转来鼓励一下自己。
此文章不是本人所写,转自他人,出处不太详

前几天大致分析了u-boot针对smdk2410的源码,了解了启动的流程,但是对板上许多硬件的驱动过程还不太清楚。smdk2410源码中有针对Nor Flash的初始化和读取,但源码中没有对Nand Flash的操作,虽然针对其他型号的板子应该有Nand的源码,但方便起见,我查阅了vivi的源码,它支持从Nand Flash启动,自然有我需要的东西。下面我就自己的分析和总结列出来,中间当然也从google上得到不少前人留下的宝贵资料:)。
我先摘录一段对Nor和Nand flash区别的几条总结:
    NOR flash采用位读写,因为它具有sram的接口,有足够的引脚来寻址,可以很容易的存取其内部的每一个字节。
    NAND flash使用复杂的I/O口来串行地存取数据。8个引脚用来传送控制、地址和数据信息(复用)。NAND的读和写单位为512Byte的页,擦写单位为32页的块。
    ● NOR的读速度比NAND稍快一些。
    ● NAND的写入速度比NOR快很多。
   ● NAND的4ms擦除速度远比NOR的5s快。
   ● 大多数写入操作需要先进行擦除操作。
   ● NAND的擦除单元更小,相应的擦除电路更少。
    在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。
再来看看Nand flash自身的特点(部分摘自August0703的文章):
     Nand Flash的数据是以bit的方式保存在memory cell中,一般来说,一个cell 中只能存储一个bit。这些cell 以8个或者16个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device的位宽。
    多个line(多个位宽大小的数据)会再组成Page。我使用的Nand flash是三星的K9F1208U0M,从datesheet上得知,此flash每页528Bytes(512byte的Main Area + 16byte的Spare Area),每32个page形成一个Block(32*528B)。具体一片flash上有多少个Block视需要所定。我所使用的k9f1208U0M具有4096个block,故总容量为4096*(32*528B)=66MB,但是其中的2MB(Spaer Area)是用来保存ECC校验码等额外数据的,故实际中可使用的为64MB。
    Nand flash以页(512Byte)为单位读写数据,而以块(16KB)为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址:
    ● Column Address:列地址,地址的低8位
    ● Page Address :页地址
    ● Block Address :块地址
    对于NAND Flash来讲,地址命令只能在I/O[7:0]上传递,数据宽度也是8,这导致在读写指定地址的数据时,地址是分4次传递的(3次右移),见后文。
    s3c2410这个处理器之所以可以直接从Nand flash启动,是因为CPU内置了4KB的片内SRAM,手册上称作“Steppingstone”。板子上电复位之后,CPU会自动将Nand flash的前4KB代码拷贝到片内SRAM中去执行(此过程是靠硬件实现的,见datasheet图Figure 6-1. NAND Flash Controller Block Diagram),这也是导致从Nor和Nand启动后的内存映射不同的原因。所以,vivi的stage1代码head.S必须要小于4KB,其中实现基本的CPU初始化等工作,并且要实现把自身拷贝到SDRAM中,之后的stage2就实现复杂功能。
    关于SDRAM的初始化,之前分析u-boot时虽然涉及,但那篇没有仔细分析,我将另外归纳一篇。
下面具体看一下如何读写这块Nand flash:
    从s3c2410的datasheet上得知,Nand flash的操作通过NFCONF、NFCMD、NFADDR、NFDATA、NFSTAT和NFECC这六个寄存器来完成,并且列出操作Nand flash的4个步骤:
NAND FLASH MODE CONFIGURATION
1. Set NAND flash configuration by NFCONF register.
2. Write NAND flash command onto NFCMD register.
3. Write NAND flash address onto NFADDR register.
4. Read/Write data while checking NAND flash status by NFSTAT register. R/nB signal should be checked before read operation or after program operation.
    下面结合vivi源码来详细的分析具体如何操作这6个寄存器来完成以上4个步骤来完成读过程:
先要初始化Nand flash,紧接着复位一下:
void reset_nand()
{
    int i=0;
     NFCONF &= ~0x800;    /* 现在真正使用Nand flash,bit[11]要置0,与初始化时相反 */
        for(; i10; i++);
     NFCMD = 0xff;    //reset command
/* 复位命令。NFCMD寄存器只用到低8位(bit[7:0])。
K9F1208U0M手册中列出了针对此块flash的各种命令,见Table 1. Command Sets。vivi/include/mtd/nand.h更直观的列出了各种命令 */
     wait_idle();
}
/* 初始化NAND Flash */
/* NFCONF设定为0xf830,作用是使能Nand flash控制器、初始化ECC、Nand flash片选信号nFCE=1(inactive,真正使用时再让它等于0)、设置TACLS、TWRPH0、TWRPH1。
TACLS、 TWRPH0、TWRPH1这三个参数是控制Nand flash信号线CLE/ALE和写控制信号nWE的时序关系的,要参照具体的flash芯片手册来设置。我这个是K9F1208U0M ,在表“AC Timing Characteristics for Command / Address / Data Input”中可以看到:
CLE setup Time = 0 ns,CLE Hold Time = 10 ns,
ALE setup Time = 0 ns,ALE Hold Time = 10 ns,
WE Pulse Width = 25 ns
可 以计算,即使在HCLK=100MHz的情况下,TACLS+TWRPH0+TWRPH1=6/100 uS=60 ns,也是可以满足NAND Flash K9F1208U0M的时序要求的。(此句摘自thisway.diy@163.com的文章。关于如何配置时序,以后我得好好学习一下,还自诩电子出 身,丢人啊。。。)*/
void init_nand()
{
     NFCONF = 0xf830;
     reset_nand();
}
    初始化Nand flash之后,就可以把stage2的main函数代码拷贝到SDRAM中去执行,当然之前已经配置好了SDRAM。以上工作都是在stage1阶段(片内SRAM中)完成的,之后就可以读写Nand flash了。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/95243/showart_1929188.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP