MTD坏块管理机制中,起着核心作用的数据结构是nand_chip,在此以TCC8900-Linux中MTD的坏块管理为例作一次介绍。

MTD在Linux内核中同样以模块的形式被启用,TCC_MTD_IO_Init()函数完成了nand_chip初始化、mtd_info初始注册,

坏块表的管理机制建立等工作。

nand_chip在TCC_MTD_IO_Init函数中的实例名称是this,mtd_info 的实例名称为TCC_mtd,这里有一个比较巧妙的处理方法:

TCC_mtd=kmalloc(sizeof(struct mtd_info)+sizeof(struct nand_chip),GFP_KERNEL);

this=(struct nand_chip*)(&TCC_mtd[1]);

在以后的操作中,只需得知TCC_mtd即可找到对应的nan_chip实例。

获得必要的信息后(包括nand_chip方法的绑定),流程进入nand_scan(TCC_mtd,1).

nand_scan(struct mdt_info *mtd, int maxchips);

调用nand_scan_ident(mtd,maxchips)和nand_scan_tail(mtd);

nand_scan_ident(...)调用了一个很重要的函数:nand_get_flash_type(...)

*从nand_get_flash_type(...)函数中可以看出每个nandflash前几个字节所代表的意思都是约定好了的:

第一个字节:制造商ID

第二个字节:设备ID

第三个字节:MLC 数据

第四个字节:extid (比较总要)

其中设备ID是访问nand_flash_ids表的参照,该表在drivers/mtd/nand/nand_ids.c中定义

Linux内核在nand_flash_ids参照表中,通过匹配上述设备ID来查找nandflash的详细信息,

nand_flash_ids中的举例如下:

struct nand_flash_dev nand_flash_ids[]={

......

{"NAND 16MiB 1,8V 8-bit",   0x33, 512, 16, 0x4000, 0},

{"NAND 16MiB 3,3V 8-bit",   0x73, 512, 16, 0x4000, 0},

{"NAND 16MiB 1,8V 16-bit",  0x43, 512, 16, 0x4000, NAND_BUSWIDTH_16},

{"NAND 16MiB 3,3V 16-bit",  0x53, 512, 16, 0x4000, NAND_BUSWIDTH_16},

......

}

466 struct nand_flash_dev {

467     char *name;

468     int id;

469     unsigned long pagesize;

470     unsigned long chipsize;

471     unsigned long erasesize;

472     unsigned long options;

473 };

值得一提的是,MTD子系统会把从nand_flash_ids表中找到的chipsize复制给mtd->size,这在有些应用中显得不合适,

在有些方案中,并不是把nandflash的所有存储空间都划分为MTD分区,Telechips的TCC89XX方案就是这样,4G的nandflash

上,可以划分任意大小的MTD分区,错误的mtd->size的后果非常严重,造成系统启动慢,整个MTD的坏块管理机制瘫痪等等。

随后,nand_get_flash_type通过extid计算出了以下信息:

mtd可写区大小:mtd->writesize=1024<

这里可以看成1024*(1*2的(extid&0x03)次方),

mtdoob区大小:extid>>=2;mtd->oobsize = (8<writesize>>9);

每512字节对应(8*2的(extid&0x1)次方)字节oob数据

mtd擦写块大小:extid>>=2;mtd->erasesize=(64*1024)<

nand数据宽度 :extid>>=2;busw=(extid&0x01)?NAND_BUSEWIDTH_16:0; 现在大多为8位数据宽度

可以看出第四个字节extid的意义:

高|0    |  0        |   00        | 0   | 0         |  00           |低

|无用|数据宽度|擦写块算阶|无用|oob算阶|  可写区算阶|

nand_get_flash_type(...)还确立了nandflash中的坏块标记在oob信息中的位置:

if(mtd->writesize>512||(busw&NAND_BUSWIDTH_16))

chip->badblockpos = NAND_LARGE_BADBLOCKS_POS;//大页面flash的坏块信息存储地址为oob信息中的第1个字节开始处

else

chip->badblockpos = NAND_SMALL_BADBLOCKS_POS;//大页面flash的坏块信息存储地址为oob信息中的第6个字节开始处

对于Samsun和Hynix的MLC型nandflash,坏块标记所在的页是每块的最后一个页,而Samsung,Hynix,和AMD的SLC型nandflash

中,坏块标记分别保存在每块开始的第1,2个页中,其他型号的nandflash大多都保存在第一个也中,为此需要作下标记:

坏块标记保存在块的最后一页中:chip->options |= NAND_BBT_SCANLASTPAGE;

坏块标记保存在块的第1,2页中 :chip->options |= NAND_BBT_SCAN2NDPAGE;

nand_scan之后调用nand_scan_tail(mtd)函数,

nand_scan_tail(...)函数主要完成MTD实例中各种方法的绑定,例如:

3338     mtd->read = nand_read;

3339     mtd->write = nand_write;

3340     mtd->panic_write = panic_nand_write;

3341     mtd->read_oob = nand_read_oob;

3342     mtd->write_oob = nand_write_oob;

3343     mtd->sync = nand_sync;

nand_scan_tail(...)调用chip->scan_bbt()完成坏块表的有关操作。

chip->scan_bbt的绑定过程是在nand_scan_ident()->nand_set_defaults():chip->scan_bbt = nand_default_bbt.

即真正用于坏块操作的是nand_default_bbt函数,该函数在nand_bbt.c中被定义。

linux 内核 mtd读取,MTD坏块管理(二)-内核获取Nandflash的参数过程相关推荐

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

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

  2. nand flash 的oob 及坏块管理

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

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

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

  4. MTD的坏块管理(一)-快速了解MTD的坏块管理

    为什么80%的码农都做不了架构师?>>>    由于NAND Flash的现有工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此在NAND芯片出厂的时候 ...

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

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

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

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

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

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

  8. nand flash坏块管理OOB,BBT,ECC

    0.NAND的操作管理方式      NAND FLASH的管理方式:以三星FLASH为例,一片Nand flash为一个设备(device),1 (Device) = xxxx (Blocks),1 ...

  9. 固态硬盘的坏块管理,你知道和不知道的

    坏块是如何产生的,SSD又是通过什么样的手段来发现和管理坏块,厂商建议的坏块管理策略存在什么样的问题,什么样的管理方法会更优,格式化硬盘会不对导致坏块表丢失,SSD返修后产生哪些安全隐患,本文逐一进行 ...

最新文章

  1. win10系统配置apache 2.4的虚拟主机以及查看 apache的版本
  2. LAMP 系统性能调优:第2 部分: 优化Apache 和PHP-学习笔记
  3. fir滤波器应用matlab,fir滤波器应用.ppt
  4. VC内存泄露检查工具:Visual Leak Detector
  5. java注意的一些细节问题
  6. 数据库系统实训——实验七——触发器
  7. Python编程基础06:认识程序控制结构
  8. 华为拟安装“俄版安卓”;百度回应内部贪腐;Android Studio 3.5 RC2 发布 | 极客头条...
  9. python元组是有序还是无序_python-03 元组和字典
  10. Stacked injection--堆叠注入--堆查询注入
  11. LINUX SHELL使用变量控制循环
  12. postman下载文件
  13. mediator模式-调停者模式
  14. 2021年4月12日 关于VRRP!!!
  15. python使用Tkinter库制作文件和文件夹创建功能
  16. PHP解决验证码无法显示的方法
  17. rabbitmq的web管理界面无法使用guest用户登录
  18. 神秘美女接机刘谦 网友见证奇迹时刻:女子像舒淇
  19. Python导入数据
  20. wordpress后台管理(七)说说管理:所有说说、发表说说

热门文章

  1. 计算机树表查找算法的适用场景,利用基于R-树连续最近邻查询算法来渲染雨滴,形成了逼真的下雨天场景图...
  2. (1小时数据结构)数据结构c++描述(十九) --- 最大左高树
  3. 使用Python读取XMind格式测试用例,循环处理字符串
  4. 跳过评价教师看成绩html,学校评优秀教师只看成绩,这种做法对吗?
  5. 请出中本聪,迎接新世界(1-5)
  6. 重装系统计算机无法启动,重装系统电脑无法开机怎么办?重装系统后电脑无法开机常见故障...
  7. Spring Boot与Shiro实现权限管理02
  8. CDLinux U盘启动教程
  9. 会讲话是学问,会听话是学问
  10. 你见过最听话的狗狗有多听话?