Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15339615
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2008-05-23 17:32:24

如何快速检测NAND的坏块

首先调用erase,将NAND全部擦除一遍,然后执行如下检测操作,
如果页大于512字节,
badblockpos   = 0;
badblockbytes = 2;
如果页小于512字节,
badblockpos   = 5;
badblockbytes = 1;
读取每个block的前两页OOB区域的第badblockpos开始的后badblockbytes字节是否为0xff,
如果是,那么说明该block是好的,否则该block是坏块[gliethttp_20080523]!

UINT_T create_bbt(FlashBootType_T fbt)
{
    UINT_T Retval;
    P_FlashProperties_T pFlashP = GetFlashProperties(fbt);
    UINT_T BlkSize,BlkNum;
    UINT_T flash_addr;
#define page_size (2048)
#define page_spare_size (64)
#define block_size (64*page_size)
#define tmp_buffer_addr (0x80200000 - page_size - page_spare_size)
#define tmp_spare_buffer_addr (tmp_buffer_addr + page_size)
    int i,j;
    char *bbpos;

    bbpos = (char*)(tmp_spare_buffer_addr + 0);
    BlkSize = pFlashP->BlockSize;
    BlkNum = pFlashP->NumBlocks;
    
    for(i = 0;i < BlkNum;i++)
    {
        flash_addr = i * BlkSize;
        for(j = 0;j < 2;j++)
        {
            Retval = xdfc_read((UINT_T *)tmp_buffer_addr, flash_addr + j*page_size, page_size, (UINT_T *)tmp_spare_buffer_addr, GetNANDProperties());
            if(Retval)
            {
                goto __create_bbt_mark;
            }
            
            if(bbpos[0] != 0xff)goto __create_bbt_mark;
            if(bbpos[1] != 0xff)goto __create_bbt_mark;
        }
        continue;

__create_bbt_mark:
        RelocateBlock( i, &GetFMProperties()->BBT, fbt );
    }
}

阅读(9503) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-08-14 15:23:52

1,出厂坏块一定不能擦除或编程,必须严格遵守; 2,页大于512字节的,例如samsung的k9k8g08u0a,查看的是块第一页和第 二页的OOB区域的第1个字节,必须都为0xff,否则为坏块。 bz所说的,不知道针对哪家的NandFlash,好像有问题。 我只用过samsung的。 ------------------------------------------------------------------------------------------------- 欢迎探讨 QQ---2584----65756------