nand flash坏块管理

坏块表

nand_scan_tail    // nand_base.c
    ...
    if (chip->options & NAND_SKIP_BBTSCAN)
        return 0;
    return chip->scan_bbt(mtd);    
    //控制器驱动或nand_base.c=> nand_scan_ident=> nand_set_defaults指定
    //后者指定:chip->scan_bbt = nand_default_bbt;    
        
nand_default_bbt(mtd)        //nand_bbt.c (drivers/mtd/nand)
    struct nand_chip *this = mtd_to_nand(mtd);
    //如果使用flash存储bbt
    if (this->bbt_options & NAND_BBT_USE_FLASH)
        指定this->bbt_td, this->bbt_md

    nand_create_badblock_pattern(this);                        //nand_bbt.c
        分配struct nand_bbt_descr *bd,设置其成员
        this->badblock_pattern = bd;
    nand_scan_bbt(mtd, this->badblock_pattern);    //nand_bbt.c
        struct nand_chip *this = mtd_to_nand(mtd);
        如果this->bbt_td没指定     
            //创建在内存中的bbt
            nand_memory_bbt(mtd, bd)                                //nand_bbt.c
                create_bbt(mtd, this->buffers->databuf, bd, -1);    //nand_bbt.c
                    struct nand_chip *this = mtd_to_nand(mtd);
                    如果bd->options有NAND_BBT_SCAN2NDPAGE或NAND_BBT_SCANLASTPAGE,进行处理
                    对于每一块
                        如果bd->options中有NAND_BBT_NO_OOB,直接BUG()
                        ret = scan_block_fast(mtd, bd, from, buf, numpages)    //nand_bbt.c
                            mtd_read_oob(mtd, offs, &ops);
                            与td->pattern(一般是0xff)比较是否相同
                            不同,返回1
                        若ret大于0
                            bbt_mark_entry(this, i, BBT_BLOCK_FACTORY_BAD);
                            mtd->ecc_stats.badblocks++;
                             
                         
    

你可能感兴趣的:(Linux)