一. 前言

现在虽然出现了很多EMMC,并且在很多公司也开始更多的使用EMMC,但EMMC里使用的也是NandFlash,EMMC只是一个标准接口。在使用NandFlash时最重要的是对坏块的识别,避免将数据写入坏块中从而导致数据的丢失。既然是对坏块做检测,首先得明确什么是坏块:坏块就是无法通过program,erase操作改变相应的存储位且无法通过ECC究错来还原回原来的数据信息的块.下面我将对NandFlash的一些常识及对坏块识别的方法作出说明。


二. 正文:

  1. 首先得明确NandFlash的数据线,地址线(包括行列地址,块地址),指令线都是共用的8根信号线。一般通过把它们组合成5个字节,分5次送入NandFlash控制器中。
  2. 里面每一页的布局(8位的NandFlash):
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++ vector0 || vector1 || vector2 ||…|| vector7 || 预留区 || ECC校验区 || ++++
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    其中1vector=512Bytes , 1page=8vector=4K , 1block=64 / 32page;
  3. NandFlash坏块成员:
    1. NandFlash在出厂时就有的坏块(在出厂时由生产商在坏块头部标记成坏块,不同的生产商标记的地方不一样且标记的符号也不同,Micron镁光是在坏块的第一页的预留区的第一字节标记成0x00,即在首页的第4096字节处)
    2. 在用户使用过程中用坏了的坏块。

  4. 检测用户使用过程中出现的新的坏块的方法:
    通过在进行program/erase操作后和向NandFlash发送一个 statue command指令,它会返回操作是否正确,如果操作failed,说明可能是坏块(记住只是可能,呆会会说明原因)。
  5. NandFlash在出厂时就被标记了的坏块在擦除操作下会把坏块标志也擦除,因此在擦除前要先把这些被标记了的坏块地址存下来。
  6. 检测出的坏块的管理方式:
    首先要把NandFlash中由厂商标记了的坏块记录到一个坏块表bad block table中,然后再把检测出来的新坏块添加到坏块表中(有的人不光只维护一个坏块表,还在表中添加坏块映射,具体的就不在这说明了).
  7. 坏块检测的应用:
    在一些手机,平板等嵌入式产品中,通常用NandFlash,EMMC来存放boot loader,系统映像(多为linux kernel),用户数据,然而要确保系统能正确的装载到ram中就必须保证存放boot loader,kernel区中无坏块,用户数据区可以有坏块,因为linux kernel中有对NandFlash坏块进行动态维护,其代码路径为:…/linux-dir/dirvers/mtd/nand/nand_ttb.c;在用户空间我们不须要去管所存的地方是否是个坏块,因为kernel把ECC,坏块检测,坏块管理,负载均衡全做好了。

三.内容补充:

  1. 网上有很多网友都说NandFlash被标记的坏块中存在伪坏块(在正常环境下能正确存取数据的块),厂商所标记的坏块是在厂商安排的最恶劣的环境下进行数据存取测试的,那些没通过在恶劣环境下的块都被标记成坏块,而我们使用的环境一般都是在正常环境下,所以被标记的坏块有部分是可以使用的。但生产商在芯片datasheet中也明确说明了如果使用这些伪坏块存在很大的风险,所以还是不要用它们吧.
  2. 在正文中的tag 4中所说的只是可能为坏块现在在此说明原因:
    因为是正常的块中有时也会出现program,erase失败的情况(在读扰动,写扰动等情况下),那如何分辨是否是坏块呢?由扰动所引起的失败是有它们具体的表现形式的,这点可以看各大半导体开发商官方芯片手册,英文原版的说明的最清晰,我不喜欢把它们翻成中文.
  3. 以上的坏块检测与管理是最基本的方式,然而在很多实际工程中对Landflash进行坏块检测时并不仅仅是为了检测与管理坏块,其更重要的目的是为了检测硬件引脚的连接(是否有虚焊,引脚是否有沾连等)和引脚时序的可靠性.因此在一些大公司里就很少用软件方式去检测硬件的可靠性,而是通过套件进行边界扫描(Boundary scan),用的是JTAG接口,可以实时显示出硬件出问题的引脚.