本文用于学习uboot中对NandFlash坏块的处理,适用于AM3352,u-boot-2011.09,H27_2G8 NandFlash。
1.1.1    出厂时的坏块标记

依据datasheet中的说明,每2Gb中最多有40个坏块(5MB),且出厂时的第一个块保证不是坏块。

(*) Each 2Gb hasmaximum 40 bad blocks

NOTE: The 1stblock is quranteed to be a valid blick at the time of shipment.

在硬件上,只要每一块的第一页或者第二页的spare area的第一个字节不是FF,即认为这是一个块坏。

Any block wherethe 1st Byte in the spare area of the 1st or 2nd th page (if the 1st page isBad) does not contain FFh is a Bad Block. The Bad Block Information must be readbefore any erase is attempted as the Bad Block Information may be erased.

1.1.2    Uboot的坏块标记

与硬件datasheet说明略有不同的是,uboot将这个坏块标记做了更进一步的区分,使用下面的几种模式进行标记:

static uint8_t bbt_pattern[] = {'B', 'b', 't', '0' };
    static uint8_t mirror_pattern[] = {'1', 't', 'b', 'B' };
    static uint8_t scan_ff_pattern[] = { 0xff, 0xff };

在默认情况下,将使用scan_ff_pattern,即与硬件保持一致。

1.1.3    坏块表的建立

在uboot启动时,会快速扫描NandFlash上的坏块并在内存中建立坏块表。

这个过程由下面的函数完成:

/**
     * create_bbt - [GENERIC] Create a bad block table by scanning the device
     * @mtd:    MTD device structure
     * @buf:    temporary buffer
     * @bd:        descriptor for the good/bad block search pattern
     * @chip:    create the table for a specific chip, -1 read all chips.
     *        Applies only if NAND_BBT_PERCHIP option is set
     *
     * Create a bad block table by scanning the device
     * for the given good/bad block identify pattern
     */
    static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
        struct nand_bbt_descr *bd, int chip)

1.1.4    手工标识坏块

uboot提供了一个叫nand markbad的命令,可以将指定的坏标识为坏块。

使用nand dump.oob命令可以发现,markbad将坏块页的oob前两个字节写为00 00。

1.1.5    擦除所有坏块标记

nand erase支持一个叫scrub的参数,当加上此参数后,nand erase将擦除所有出厂时标定的坏块标记。

1.2  块擦除

当在uboot下执行nand erase时,最终将调用下面的函数:

/**
     * nand_erase_opts: - erase NAND flash with support for various options
     *              (jffs2 formating)
     *
     * @param meminfo    NAND device to erase
     * @param opts        options,  @see struct nand_erase_options
     * @return        0 in case of success
     *
     * This code is ported from flash_eraseall.c from Linux mtd utils by
     * Arcom Control System Ltd.
     */
    int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)

1.2.1    对已有坏块的处理

当执行擦除操作时,除非指定scrub参数,否则将直接跳过坏块的处理:

if (!opts->scrub && bbtest) {
                int ret = meminfo->block_isbad(meminfo, erase.addr);
                if (ret > 0) {
                    if (!opts->quiet)
                        printf("\rSkipping bad block at  "
                               "0x%08llx                 "
                               "                         \n",
                               erase.addr);
     
                    if (!opts->spread)
                        erased_length++;
     
                    continue;
     
                } else if (ret < 0) {
                    printf("\n%s: MTD get bad block failed: %d\n",
                           mtd_device,
                           ret);
                    return -1;
                }
            }

1.2.2    擦除时坏块的处理

当擦除发现坏块而导致擦除失败时,uboot没有做任何处理,直接返回。

/**
     * nand_erase_nand - [Internal] erase block(s)
     * @mtd:    MTD device structure
     * @instr:    erase instruction
     * @allowbbt:    allow erasing the bbt area
     *
     * Erase one ore more blocks
     */
    int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
                int allowbbt)
    {.....
            chip->erase_cmd(mtd, page & chip->pagemask);
     
            status = chip->waitfunc(mtd, chip);
     
            /*
             * See if operation failed and additional status checks are
             * available
             */
            if ((status & NAND_STATUS_FAIL) && (chip->errstat))
                status = chip->errstat(mtd, chip, FL_ERASING,
                               status, page);
     
            /* See if block erase succeeded */
            if (status & NAND_STATUS_FAIL) {
                MTDDEBUG (MTD_DEBUG_LEVEL0, "nand_erase: "
                      "Failed erase, page 0x%08x\n", page);
                instr->state = MTD_ERASE_FAILED;
                instr->fail_addr = ((loff_t)page << chip->page_shift);
                goto erase_exit;
            }
    ......
    }

1.3  写入操作

当在uboot下使用nand write写入时,实际执行下面的函数:

/**
     * nand_write_skip_bad:
     *
     * Write image to NAND flash.
     * Blocks that are marked bad are skipped and the is written to the next
     * block instead as long as the image is short enough to fit even after
     * skipping the bad blocks.
     *
     * @param nand      NAND device
     * @param offset    offset in flash
     * @param length    buffer length
     * @param buffer        buffer to read from
     * @param flags        flags modifying the behaviour of the write to NAND
     * @return        0 in case of success
     */
    int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
                u_char *buffer, int flags)

从下面的代码可以看出nand write对坏块的处理:

while (left_to_write > 0) {
            size_t block_offset = offset & (nand->erasesize - 1);
            size_t write_size, truncated_write_size;
     
            WATCHDOG_RESET ();
     
            if (nand_block_isbad (nand, offset & ~(nand->erasesize - 1))) {
                printf ("Skip bad block 0x%08llx\n",
                    offset & ~(nand->erasesize - 1));
                offset += nand->erasesize - block_offset;
                continue;
            }
    ......
            left_to_write -= write_size;
        }

也就是说,nandwrite将跳过坏块并持续到数据完全写入。

此操作保证数据的完全写入,除非NandFlash已经没有空间。

1.4  读取操作

nand读取操作由下面的函数实现:

/**
     * nand_read_skip_bad:
     *
     * Read image from NAND flash.
     * Blocks that are marked bad are skipped and the next block is readen
     * instead as long as the image is short enough to fit even after skipping the
     * bad blocks.
     *
     * @param nand NAND device
     * @param offset offset in flash
     * @param length buffer length, on return holds remaining bytes to read
     * @param buffer buffer to write to
     * @return 0 in case of success
     */
    int nand_read_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
                   u_char *buffer)

下面是它的读取流程。

while (left_to_read > 0) {
            size_t block_offset = offset & (nand->erasesize - 1);
            size_t read_length;
     
            WATCHDOG_RESET ();
     
            if (nand_block_isbad (nand, offset & ~(nand->erasesize - 1))) {
                printf ("Skipping bad block 0x%08llx\n",
                    offset & ~(nand->erasesize - 1));
                offset += nand->erasesize - block_offset;
                continue;
            }
    .....
     
            left_to_read -= read_length;
            offset       += read_length;
            p_buffer     += read_length;
        }

可以明确,读取操作保证读取足够数量的数据,当有坏块时直接跳过坏块。

————————————————
版权声明:本文为CSDN博主「嵌云阁主」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lights_joy/article/details/51649765

AM3352 uboot中对NandFlash坏块的处理相关推荐

  1. linux nand 坏块_Linux内核中NAND Flash坏块管理

    由于NAND Flash的现有工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此在NAND芯片出厂的时候,厂家只能保证block 0不是坏块,对于其它block,则均有可 ...

  2. linux nand 坏块_Nand Flash 中的坏块(Bad Block)

    Nand Flash 中,一个块中含有 1 个或多个位是坏的,就称为其为坏块 Bad Block. 坏块的稳定性是无法保证的,也就是说,不能保证你写入的数据是对的,或者写入对了,读 出来也不一定对的. ...

  3. linux 内核 mtd读取,MTD坏块管理(二)-内核获取Nandflash的参数过程

    MTD坏块管理机制中,起着核心作用的数据结构是nand_chip,在此以TCC8900-Linux中MTD的坏块管理为例作一次介绍. MTD在Linux内核中同样以模块的形式被启用,TCC_MTD_I ...

  4. linux nand 坏块_linux内核中对nand的坏块管理

    闲来无事,追踪了下linux内核中对nand的坏块管理代码.大致记录一下. 内核中对nand的坏块管理是在nand的驱动中实现的,一般情况下,我们在实现nand控制器的驱动时不用考虑坏块的管理,这些机 ...

  5. oracle rman 检查坏块,Oracle中使用RMAN来检验坏块

    RMAN即recovery manager可以通过在执行的备份任务中,仅仅验证数据文件中的数据块而不生成实际的备份,这样做的目的是纯粹为了了解数据文件中是否有坏块. RMAN在这个环境中: 验证数据文 ...

  6. oracle 11g dul,学习笔记:Oracle dul数据挖掘 导出Oracle11G数据文件坏块中表中

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

  7. Nand Flash基础知识与坏块管理机制的研究

    概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...

  8. linux挂载fc存储有超级坏块_Nand Flash基础知识与坏块管理机制的研究

    欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多 ...

  9. linux nand 坏块_NAND Flash的坏块管理设计

    摘要:主要介绍了基于嵌入式Linux的NAND Flash坏块管理设计和实现方案,详细阐述了坏块映射表的建立.维护及其相关算法,同时分析了此坏块算法在Linux内核及Bootloader中的具体应用. ...

  10. nand flash 的oob 及坏块管理

    转载出处:http://blog.csdn.net/liukun321/article/details/6598921#comments 0.NAND的操作管理方式      NAND FLASH的管 ...

最新文章

  1. 你与ACM MM的距离只差一场算法比赛
  2. FPGA之道(75)静态时序分析(一)基本概念介绍
  3. [转]Display PDF within web browser using MVC3
  4. TCGA的样本命名规则
  5. 智能集群理论优化控制_无人机集群对抗研究的关键问题
  6. django 快速搭建blog
  7. SanFengClound
  8. Redis 的主从复制太强大了!
  9. mysql 同步更新_MySQL slave 不能同步更新
  10. developer pack_上汽大众MEB电池Pack制造车间
  11. 湖北计算机技能高考专科学校排名,湖北2021年技能高考专科录取分数线
  12. php 输出 继续执行,使用PHP中的实时输出运行进程
  13. ASP.net MVC Mock Context(上下文)
  14. python3下载流程_CentOS系统升级Python到Python3.3步骤
  15. 信息学奥赛一本通网站注册账号流程
  16. 手写一个多行文本溢出省略号显示,多行文本溢出省略号显示,单行文本溢出省略号显示
  17. 脱壳入门(一)之分析Aspack壳
  18. 武忠祥老师每日一题||不定积分基础训练(六)
  19. 欧洲上班族心碎:工作时网聊将无隐私可言
  20. Smartbi与华为云强强联合,共建云上BI新生态

热门文章

  1. UE5——材质学习笔记(4):溶解材质
  2. 交互设计常识:设计模型分析
  3. D盘根目录下的msdia80.dll文件能不能删除?
  4. 国家开发大学计算机平面设计试题,国家开放大学电大专科《计算机平面设计(1)》网络课形考任务1答案...
  5. 音频变压器阻抗匹配及案例
  6. 【SSH网上商城项目实战26】完成订单支付后的短信发送功能
  7. 浅谈文字编码和Unicode
  8. 解决window10播放.avi格式视频黑屏,只有声音没有视频0xc00d5212错误
  9. 如何将视频文件转为图片
  10. 使用STVP 下载STM32程序之后,弹出 Problem while trying to Run core of device. 的解决办法