wince系统中对nand坏块的修正

wince系统中对nand坏块的修正

产生坏块的原因是因为NANDFlash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,所以,在NAND

的生产中及使用过程中会产生坏块。

一、坏块的具体表现:

当编程/擦除这个块时,不能将某些位拉高,这会造成Page Program和Block Erase操作时的错误,相应地反映到

Status Register的相应位。

二、坏块的种类:

1.先天性坏块

这种坏块是在生产过程中产生的,一般芯片原厂都会在出厂时都会将坏块第一个page的spare area的第6个byte标记为不等于

0xff的值。

2. 后天性坏块

这种坏块是在NAND Flash使用过程中产生的,如果Block Erase

或者Page Program错误,就可以简单地将这个块作为坏块来处理,这个时候需要把坏块标记起来。为了和先天性坏块信息保持一致,

将新发现的坏块的第一个page的spare area的第6个Byte标记为非0xff的值,这个坏块标记字节的位置不具有通用性,具体以nand的datasheet为准。

三、坏块的处理

理解了先天性坏块和后天性坏块后,我们已明白NAND Flash出厂时在spare area中已经反映出了坏块信息,因此,如果在擦除一个块之前,一定要先check一下spare area的第6个byte是否是

0xff,如果是就证明这是一个好块,可以擦除;如果是非0xff,那么就不能擦除。

不过,这样处理可能会错杀伪坏块,因为在芯片操作过程中可能由于电压不稳定等偶然因素会造成NAND操作的错误。但是,为了数据的可靠性及软件设计的简单化,坏块一个也不能放过。

但是wince为了防止这种伪坏块的浪费,采用了一定的补救措施来进一步验证该坏块为物理坏块还是伪坏块。该部分实现在BOOL WriteFlashReserved(PBYTE  pBuffer, UINT32 dwLength)函数里,具体代码如下:

for (i=0; i < dwSectorSize; i++)

{

// 写入新的Block时, 作一些判断

if (i%g_FlashInfo.wSectorsPerBlock == 0)

{

if (!FMD_ReadSector(dwCurrentWriteBlock*g_FlashInfo.wSectorsPerBlock,
NULL, g_pSectorInfoBuf, 1))

{

OALLog(L"Fail read info %d\n", dwCurrentWriteBlock);

}

RETAILMSG(1, (TEXT("g_pSectorInfoBuf->bBadBlock1 = %d \r\n", g_pSectorInfoBuf->bBadBlock)));//add by zhang , 20150303

//add end

// 算出这个物理block的值

BadBlockCheck:

dwCurrentWriteBlock = dwStartBlock + dwSkipBlock + i/g_FlashInfo.wSectorsPerBlock;

// 擦除这个block

if (!FMD_EraseBlock(dwCurrentWriteBlock))

{

OALLog(L"Fail erase %d\n", dwCurrentWriteBlock);

goto BadBlock;

}

// 再次读出info

if (!FMD_ReadSector(dwCurrentWriteBlock*g_FlashInfo.wSectorsPerBlock,
NULL, g_pSectorInfoBuf, 1))

{

OALLog(L"Fail read info %d\n", dwCurrentWriteBlock);

goto BadBlock;

}

RETAILMSG(1, (TEXT("g_pSectorInfoBuf->bBadBlock2 = %d \r\n", g_pSectorInfoBuf->bBadBlock)));//add
by zhang , 20150303

// 擦除后, 再次读出, 却发现bBadBlock不为0xFF, 是物理坏块!

if ((g_pSectorInfoBuf->bBadBlock != 0xff) || (g_pSectorInfoBuf->bOEMReserved
!= 0xff))

{

OALLog(L"Fail oxff %d\n", dwCurrentWriteBlock);

goto BadBlock;

}

goto GoodBlock;

BadBlock:

if (dwCurrentWriteBlock >= LOGO_BLOCK)

{

// 在写Logo区时允许坏块

FMD_SetBlockStatus(dwCurrentWriteBlock, BLOCK_STATUS_BAD);

dwSkipBlock++; //移到下一个Block

goto BadBlockCheck;

}

else

{

RETAILMSG(1, (TEXT("WriteFlaseReserved Fail.
#%x\n"), dwCurrentWriteBlock));

return FALSE;

}

GoodBlock:

;

}

以上为部分实现代码,红色的部分为我加的串口打印消息,主要是将处理之前和处理之后该块的坏块标记位的值打印出来,以方便观察是否能够将坏块通过处理之后变为好块。

串口打印的消息如下:

CheckSum: eecf

CheckSum Success, USBDownLoadRaw Done

WriteFlashReserved

g_pSectorInfoBuf->bBadBlock1 = 0

g_pSectorInfoBuf->bBadBlock2 = 255

g_pSectorInfoBuf->bBadBlock1 = 0

g_pSectorInfoBuf->bBadBlock2 = 255

以上部分是下载EBOOT时候打印的消息,EBOOT占两个block;

Send image (DNW->UsbPort->Transmite)

Supported: stepldr.nb0 eboot.nb0 *.bmp  nk.bin(<32MB)

ReadCheckSum: 395f

CheckSum: 395f

CheckSum Success, USBDownLoadRaw Done

WriteFlashReserved

g_pSectorInfoBuf->bBadBlock1 = 0

g_pSectorInfoBuf->bBadBlock2 = 255

以上部分是下载STEPLDR时候打印的消息,STEPLDR占一个block;

处理方法从代码部分也能看得出来,首先对将要写的块进行擦除,擦除的时候忽略坏块的标志,也就是说不管好块还是坏块都进行擦除,擦除其实就相当于对当前块的所有地址全部写FF,写完之后会从新生产坏块标记,保存在spare area区域;然后再次读出该spare area区域的数据进行判断,如果为FF则表示修正成功,该块为好块,可以进行读写操作,如果为非FF,则证明该块为不可修正的坏块,禁止对其读和写操作,这样既避免了错杀一千的浪费,同时又保证了数据传输的稳定性。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-15 01:51:15

wince系统中对nand坏块的修正的相关文章

芯片为什么会有坏块?

坏块的种类:第一种是出厂时就有的坏块,也就是,你买到的新的,还没用过的Nand Flash,就可能包含了坏块.此类出厂时就有的坏块,被称作factory (masked) bad block 或initial bad/invalid block,在出厂之前,就会做对应的标记,标为坏块.第二种是在使用过程中产生的坏块,由于使用过程时间长了,在擦块除的时候,出错了,说明此块坏了,也要在程序运行过程中,发现,并且标记成坏块的.具体标记的位置,和上面一样.这类块叫做worn-out bad block.

如何处理Oracle数据库中的坏块问题

本文主要介绍如何去处理在Oracle数据库中出现坏块的问题,对于坏块产生在不同的对象上,处理的方法会有所不同,本文将大致对这些方法做一些介绍.因为数据库运行时间长了,由于硬件设备的老化,出现坏块的几率会越来越大,因此,做为一个DBA,怎么去解决数据库出现的坏块问题就成了一个重要的议题了. 一:什么是数据库的坏块   首先我们来大概看一下数据库块的格式和结构 数据库的数据块有固定的格式和结构,分三层:cache layer,transaction layer,data layer.在我们对数据块进

学习笔记:Oracle dul数据挖掘 导出Oracle11G数据文件坏块中表中

试验模拟导出Oracle 11G数据库中数据文件坏块中表中的数据 以前一直以为dul对应的版本只能恢复最高的数据库版本一致,今天测试发现dul 10可以恢复11g最新版的数据库.模拟环境 SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition

Oracle 处理坏块

本文主要介绍如何去处理在Oracle数据库中出现坏块的问题,对于坏块产生在不同的对象上,处理的方法会有所不同,本文将大致对这些方法做一些介绍.因为数据库运行时间长了,由于硬件设备的老化,出现坏块的几率会越来越大,因此,做为一个DBA,怎么去解决数据库出现的坏块问题就成了一个重要的议题了. 什么是数据库的坏块首先我们来大概看一下数据库块的格式和结构 数据库的数据块有固定的格式和结构,分三层:cache layer,transaction layer,data layer.在我们对数据块进行读取写入

对Oracle数据库坏块的理解

1.物理坏块和逻辑坏块 在数据库中有一个概念叫做数据块的一致性,Oracle的数据块的一致性包括了两个层次:物理一致性和逻辑一致性,如果一个数据块在这两个层次上存在不一致性,那就对应到了我们今天要要说的物理坏块和逻辑坏块. 在每一个数据块的头部有一个校验和字段,每当数据块要被写回磁盘前,Oracle都会重新计算 这个数据块的校验和,并记录到这个字段最终写会磁盘.下次数据块被读入内存,Oracle会重新 计算数据块的校验和,并和块头的字段相比较,如果有差异,Oracle就知道这个数据块有错误, 会

STM32 下 FatFs的移植,实现了擦写均衡,坏块管理,硬件 ECC,ECC纠错

最近因项目需要,做一个数据采集的单片机平台.需要移植 FatFs .现在把最后成果贴上来. 在 STM32 单片机上,成功移植 FatFs 0.12b,使用的 Nand Flash 芯片为 K9F2G08 . 特点: 系统配合 FatFs 实现了擦写均衡,坏块管理,硬件ECC,软件 ECC 纠错 文件组成: FatFs 目录 +---- ffconf.h 对 FatFs 进行配置的文件 +---- ff.h +---- ff.c 是 FatFs 的实现文件,擦写均衡 在 f_getfree 函数

Oracle corrupt block(坏块) 详解

转自:http://blog.csdn.net/tianlesoftware/article/details/5024966 一. 坏块说明 1.1 相关链接 在看坏块之前,先看几个相关的链接,在后面的说明中,会用到链接中的一些内容. ORA-600 各个参数含义说明 http://blog.csdn.net/tianlesoftware/article/details/6645809 Oracle 不同故障的恢复方案 http://blog.csdn.net/tianlesoftware/ar

架构设计:系统存储(2)——块存储方案(2)

接上文<架构设计:系统存储(1)--块存储方案(1)> 4-2.固态硬盘工作过程 本小节我们要解决一个关键问题:既然机械硬盘和固态硬盘从工作原理.制作工艺.技术规范等多个方面都完全不一样,那为什么无论硬件层是使用机械硬盘还是固态硬盘操作系统却都可以进行识别,并在其上进行数据读写呢? 这个问题中,计算机系统不同层次对数据操作最小单位的定义不一致都还是一个小问题:虽然机械硬盘上数据操作单元为512字节.固态硬盘上数据操作单元为4KB.操作系统层面定义的数据操作单元可能是1KB\2KB\4KB\8K

Linux上检测硬盘上的坏道和坏块

                            Linux上检测硬盘上的坏道和坏块 让我们从坏道和坏块的定义开始说起,它们是一块磁盘或闪存上不再能够被读写的部分,一般是由于磁盘表面特定的物理损坏或闪存晶体管失效导致的. 磁盘坏道分为三种: 0磁道坏道,逻辑坏道,硬盘坏道. 其中逻辑坏道可以使用上面的方法修复,0磁道坏道的修复方法是隔离0磁道,使用fdsk划分区的时候从1磁道开始划分区.如果是硬盘坏道的话,只能隔离不能修复.硬盘坏道的监测方法:使用上述方法检测修复后,再使用badblock