linux 内核 mtd读取,MTD坏块管理(二)-内核获取Nandflash的参数过程
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的参数过程相关推荐
- linux nand 坏块_Linux内核中NAND Flash坏块管理
由于NAND Flash的现有工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此在NAND芯片出厂的时候,厂家只能保证block 0不是坏块,对于其它block,则均有可 ...
- nand flash 的oob 及坏块管理
转载出处:http://blog.csdn.net/liukun321/article/details/6598921#comments 0.NAND的操作管理方式 NAND FLASH的管 ...
- linux nand 坏块_linux内核中对nand的坏块管理
闲来无事,追踪了下linux内核中对nand的坏块管理代码.大致记录一下. 内核中对nand的坏块管理是在nand的驱动中实现的,一般情况下,我们在实现nand控制器的驱动时不用考虑坏块的管理,这些机 ...
- MTD的坏块管理(一)-快速了解MTD的坏块管理
为什么80%的码农都做不了架构师?>>> 由于NAND Flash的现有工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此在NAND芯片出厂的时候 ...
- linux nand 坏块_NAND Flash的坏块管理设计
摘要:主要介绍了基于嵌入式Linux的NAND Flash坏块管理设计和实现方案,详细阐述了坏块映射表的建立.维护及其相关算法,同时分析了此坏块算法在Linux内核及Bootloader中的具体应用. ...
- linux挂载fc存储有超级坏块_Nand Flash基础知识与坏块管理机制的研究
欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多 ...
- Nand Flash基础知识与坏块管理机制的研究
概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...
- nand flash坏块管理OOB,BBT,ECC
0.NAND的操作管理方式 NAND FLASH的管理方式:以三星FLASH为例,一片Nand flash为一个设备(device),1 (Device) = xxxx (Blocks),1 ...
- 固态硬盘的坏块管理,你知道和不知道的
坏块是如何产生的,SSD又是通过什么样的手段来发现和管理坏块,厂商建议的坏块管理策略存在什么样的问题,什么样的管理方法会更优,格式化硬盘会不对导致坏块表丢失,SSD返修后产生哪些安全隐患,本文逐一进行 ...
最新文章
- win10系统配置apache 2.4的虚拟主机以及查看 apache的版本
- LAMP 系统性能调优:第2 部分: 优化Apache 和PHP-学习笔记
- fir滤波器应用matlab,fir滤波器应用.ppt
- VC内存泄露检查工具:Visual Leak Detector
- java注意的一些细节问题
- 数据库系统实训——实验七——触发器
- Python编程基础06:认识程序控制结构
- 华为拟安装“俄版安卓”;百度回应内部贪腐;Android Studio 3.5 RC2 发布 | 极客头条...
- python元组是有序还是无序_python-03 元组和字典
- Stacked injection--堆叠注入--堆查询注入
- LINUX SHELL使用变量控制循环
- postman下载文件
- mediator模式-调停者模式
- 2021年4月12日 关于VRRP!!!
- python使用Tkinter库制作文件和文件夹创建功能
- PHP解决验证码无法显示的方法
- rabbitmq的web管理界面无法使用guest用户登录
- 神秘美女接机刘谦 网友见证奇迹时刻:女子像舒淇
- Python导入数据
- wordpress后台管理(七)说说管理:所有说说、发表说说
热门文章
- 计算机树表查找算法的适用场景,利用基于R-树连续最近邻查询算法来渲染雨滴,形成了逼真的下雨天场景图...
- (1小时数据结构)数据结构c++描述(十九) --- 最大左高树
- 使用Python读取XMind格式测试用例,循环处理字符串
- 跳过评价教师看成绩html,学校评优秀教师只看成绩,这种做法对吗?
- 请出中本聪,迎接新世界(1-5)
- 重装系统计算机无法启动,重装系统电脑无法开机怎么办?重装系统后电脑无法开机常见故障...
- Spring Boot与Shiro实现权限管理02
- CDLinux U盘启动教程
- 会讲话是学问,会听话是学问
- 你见过最听话的狗狗有多听话?