NAND FLASH坏块处理机制
大家都知道,机械硬盘会产生坏道,FLASH芯片也会这样,一般我们称此为“坏块(Bad Block)”。在NAND FLASH中,一个块中含有1个或多个位是坏的,就称其为坏块。
产生坏块的原因有两种:
(1)出厂时就有的坏块,称作Factory masked bad block(厂屏蔽坏块)或Initial bad/invalid block(初始坏/无效块),NAND FLASH器件中的坏块是随机分布的。以前做过消除坏块的努力,但发现成品率太低,代价太高,成本不划算。
(2)使用过程中产生的坏块,称作Worn-out bad block(破旧的坏块)。由于使用过程时间长了,在擦除块时出错,说明此块坏了,在程序运行过程中发现,并且标记成坏块。
正常的块写入读出都是正常的,而坏块的读写是无法保证的。在Linux系统中,对于NAND FLASH有坏块管理(BBM,Bad Block Managment)机制,通过一个对应的坏块表(BBT,Bad Block Table)来记录好块,坏块的信息,以及坏块是出厂就有的,还是后来使用产生的。
在L i n u x内核M T D(M e m o r y Technology Device,内存技术设备)架构和Uboot中的NAND FLASH驱动,在加载完驱动后,都会主动扫描坏块,建立必要的BBT,以备后面坏块管理所使用。下面是DM800 se机器在系统启动过程中,通过超级终端获取的一段进程信息,可以看出执行BBT和ECC管理。
[4294669.853000] BrcmNAND mfg ad 76 Hynix HY27US08121A (dream) 64MB
[4294669.854000]
[4294669.854000] Found NAND: A C C = 1 7 f f 1 0 1 0 , c f g = 0 4 0 4 2 3 0 0 , flashId=ad76ad76, tim16
[4294669.855000] BrcmNAND version= 0x0302 64MB @00000000
[ 4 2 9 4 6 6 9 . 8 5 6 0 0 0 ] B 4 : N a n d S e l e c t = 4 0 0 0 0 0 0 2 , nandConfig=04042300, chipSelect=-1
[4294669.856000] brcmnand_probe: CS-1: dev_id=ad76ad76
[ 4 2 9 4 6 6 9 . 8 5 7 0 0 0 ] A f t e r : N a n d S e l e c t = 4 0 0 0 0 0 0 2 , nandConfig=04042300
[4294669.858000] Found NAND chip on Chip Select -1, chipSize=64MB, usable size=x
[4294669.859000] brcmnand_scan: B4 nand_select = 40000002
[4294669.859000] brcmnand_scan: After nand_select = 40000002
[4294669.860000] page_shift=9, bbt_ erase_shift=14, chip_shift=26, phys_erase_ sh4
[4294669.861000] Brcm NAND controller version = 3.2 NAND flash size 64MB @1c0000
[4294669.862000] mtd->oobsize=16, mtd->eccOobSize=16
[4294669.862000] brcmnand_scan: mtd->oobsize=16
[4294669.863000] brcmnand_scan: oobavail=12, eccsize=512, writesize=512
[4294669.864000] brcmnand_scan, eccsize=512, writesize=512, eccsteps=1, eccleve3
[4294669.865000] brcmnand_default_ bbt: bbt_td = bbt_main_descr
[4294669.867000] brcmnandCET: Status -> Deferred
DM800 se NAND FLASH芯片分区
D M 8 0 0 s e机器(包括S R 4机器)N A N D F L A S H芯片型号为HY27U518S2CTR(2011年前期采用HY27US08121B)(U703),如图1所示。这是韩国Hynix(海力士)公司的NAND FLASH芯片,采用64M×8bit结构,容量为64MB,用于存储接收机的系统软件。
HY27U518S2CTR芯片划分为三个分区:第1分区(partition 1)为引导装载程序(loader)、第2分区(partition 2)为内核启动系统(boot)、第3分区(partition 3)为根文件系统(root),分配容量分别为:0.25MB、3.75MB、60MB。FLASH分区地址信息可以在系统启动过程中通过超级终端获取:
[4294669.867000] numchips=1, size=4000000
[4294669.868000] Creating 4 MTD partitions on "bcm7xxx-nand.0":
[4294669.869000] 0x0000000000000000-0x0000000004000000 :"complete"
[4294669.873000] 0x0000000000000000-0x0000000000040000 :"loader" ……………………………………partition 1
[4294669.874000] 0x0000000000040000-0 x 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 : " b o o t p a r t i t i o n "……………………………………partition 2
[4294669.875000] 0x0000000000400000-0 x 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 : " r o o t p a r t i t i o n "……………………………………partition 3
如果制作过DM800 se机器的固件(IMG),就知道IMG是由第二引导系统(secondstage,main.bin.gz)、启动(boot.jffs2)、根系统(root.jffs2)三个部分组成,图2所示的是《山水评测室》制作的DM800se G3-iCVS8#84B打造版固件的内部包,对应于上述的三个分区。
DM800 se NAND FLASH芯片坏块检测
对于DM800 se机器NAND FLASH芯片坏块检查,可以安装FLASH芯片检查插件检查出坏块、空块、填充块等数量(图3)。在FLASH芯片检查插件主界面,提供了mtd0整片、mtd1(secondstage loader)、mtd2(boot)、mtd3(root)四项检查内容(图4)。
检查前,首先了解各个字符代码的注释:每一个坏块用一个“B”表示,每一个空块用一个“.”表示,每一个部分使用块用一个“-”表示,每一个全部使用块用一个“=”表示,具体如图5所示。
下面,我们对采用DM800 se G3-iCVS8#84B打造版IMG的NAND FLASH芯片进行检查。
1. mtd0整片检查
执行mtd0检查整片,如图6所示。
从图中可以看出:
(1)一个典型的NAND FLASH都是由4096块(Block)组成,HY27U518S2CTR芯片每块大小是16384bytes(即16kB),容量合计:16384×4096=67108864(bytes),也就是67108864÷1024÷1024=64(MB)
《山水评测室》提示:
空闲区域并非真的“空闲”,它在物理上与其它页并没有区别。ECC、耗损均衡(Wear Leveling)、其它软件开销等很多额外的功能要依托于这部分空间来实现。换一句话说:对于一个页,0~511 bytes为主存储区,即通常所说的用户可设定地址区,用来存储数据;512~527共16 bytes为扩展存储区,用来存储页的信息。扩展区的16字节用于描述主存储区的512字节。而对于坏块,也仅仅是将这16字节的第6字节设置为不等于0xff,来标示坏块。
2. mtd1引导系统检查
执行mtd1检查,如图7所示。可以看出分配了16个块给第二引导系统(secondstage),分配容量为16×16=256(kB),即0.25MB,其中未使用5个块,已全部使用11个块,容量为16×11=176(kB),和制作的main. bin.gz(即secondstage84b.bin)容量176456÷024=175.25(kB)完全符合。
3. mtd2启动系统检查
执行mtd2检查,如图8所示。可以看出分配了240个块给启动系统(boot),分配容量容量为240×16=3840kB,即3.75MB,其中已全部使用145个块,已部分使用1个块,容量为16×145.5=2328(kB),和制作的boot.jffs2容量2382988÷024=2327.1(kB)完全符合。
4. mtd3根系统检查
执行mtd3检查,如图9所示。可以看出分配了3840个块给根系统(root),分配容量为3840×16=61440(kB),即60MB,具体固件使用容量不再分析了。
5. 坏块检查
我们收到一个用户的故障DM800 se机器,反映不能安装某些插件,运行不稳定。我们刷写同样的56MB容量的DM800 se G3-iCVS8#84B打造版固件,经过DCC-E2的【Memory Info】选项检查,故障机(图10a)的和《山水评测室》全新的打造版机器(图10b)的ROOT占用率分别为92%、89%。
具体检查对比如图11~图16所示,其中(a)图为故障机界面,(b)图为正常机界面,可见故障机有很多坏块,而和全新打造版没有一个坏块(注:FLASH芯片末尾坏块是无需作统计的)。
图中的第257块到第4096块分配给根系统(root),经统计,故障机一共显示8+31+10+44+14=107坏块,占用容量为107×16÷1024=1.7(MB),坏块占用率为1.7÷60=2.8%,因此故障机FLASH的root占用率=89%(固件空间占用率)+2.8%(坏块空间占用率),即显示已占用92%。
分区坏块导致DM800 se无法刷机的解决方法
1. 由于分区坏块导致无法刷机
当采用Web网页RJ-45网口刷写时,出现如图17所示的“too much data (or bad sectors) in ……”提示,表示分区3(partition 3)有坏扇区。
当采用DreamUp软件USB虚拟串口在刷写时,如果DreamUp软件【Log】日志区域里显示类似如下提示:
Log: +++ 006 verify failed, at 0003c000: e0. Block will be marked as bad.
Flashing failed (!!! 005 too much data(or bad sectors) in partition 1 (end: 00040000, pos: 00040000)), box will be unusable now!!
其意是:FLASH芯片分区1(partition 1)有太多的坏扇区,无法刷写。这些都是由于NAND FLASH芯片坏块引起的,因为坏了的块是无法擦除和写人数据的。
2. 刷机方法
对于NAND FLASH芯片坏块引起的刷机,如果还是想采用Web网页进行刷写,我们可以先进入机器的BIOS进行设置一下。
在其中的Misc(杂项)设置界面中,显示DM800 se机器的一些杂项设置,如图18所示。
其中的【Flash Sector Recovery】(闪存扇区恢复)选项,默认为禁用状态,当遇到因坏扇区而无法刷写软件时,可以启用该选项来解决。有时机器无法启动,也可以启用该选项试一试。
如果采用DreamUp软件刷机,在刷写前,先点击DreamUp软件菜单栏的【Extras】(附加)功能,勾选“recover bad sectors”(恢复坏扇区)功能,如图19所示,再重新刷写一次就可解决。
所谓“恢复坏扇区”,实际上就是使用相同的地址可以屏蔽掉坏了的块,而指针指向好块,也就是地址重映射,跳过坏块。
DM800 se NAND FLASH芯片更换
对于Dreambox高清机来讲,NAND FLASH芯片产生坏块的原因有多种,主要有以下一些因素:① NAND FLASH芯片质量差,寿命短,一些机器甚至采用二手的旧芯;②不正确的机器操作,如不正确的开关机,频繁地刷写有问题的固件,导致NAND FLASH芯片一些扇区或块的过分磨损、出现坏块;③芯片自然老化、接近生命周期规定的读写次数。
对于NAND FLASH芯片出现少量的坏块,用户不必担心,因为DM800机器驱动在读写NAND FLASH芯片时,通常检测坏块,同时还在NAND驱动中加入坏块管理的功能,使得机器完全能够正常工作。
不过NAND FLASH芯片过多的坏块,除了由此引发的数据丢失而工作不正常外,还会导致剩余容量减小,机器不能正常安装一些稍大容量的插件。一般机器运行时,ROOT占用率不能超过93%,即FLASH芯片剩余容量不低于4MB,否则,机器运行可能不稳定,易死机。对于FLASH芯片剩余容量,可以在【蓝色面板】下进入山水插件服务器,从下载页面左上角查看,如图20所示。
坏块过多的NAND FLASH芯片建议更换,找到机器主板的NAND FLASH芯片(U703),用热风枪将它拆下(图21),更换一片全新的、带有DM800 se机器底层驱动的NAND FLASH芯片,更换完成后,需要重新刷写IMG。