没有合适的资源?快使用搜索试试~ 我知道了~
Linux MTD 下获取Nand flash 各个参数的过程的详细解析
5星 · 超过95%的资源 需积分: 13 34 下载量 159 浏览量
2010-07-13
17:16:54
上传
评论 1
收藏 441KB PDF 举报
温馨提示
试读
14页
Linux MTD 下获取Nand flash 各个参数的过程的详细解析
资源推荐
资源详情
资源评论
Linux MTD 下获取 Nand flash 各个参数的过程的详细解析
version: 1.0
date:20090728
Author:crifan
Mail:green-waste(At)163.com
下面是 Linux MTD 中,获取 nand flash 型号,各个参数,以及硬件特性的函数,其实也就是
nand_get_flash_type,下面对其详细解析:
【看此文之前,一些有必要先解释的术语】
1. Program(编程):此处的编程,不是写软件,写代码,而是对于硬件来说的,可以理解
为对硬件编程,只不过其工具是硬件内部的逻辑,而不是你用的软件。对 Nand Flash 的
编程,本质上就是实现写操作,将数据写到 Nand Flash 里面去,所以对于 nand flash,
可以简单的理解为 program 编程=write 写(数据)。
2. Datasheet(数据手册):这个词,本来没啥好说的,接触多了,自然就知道了。但是对于
和我类似,最开始接触的时候,就是没搞懂这个词的具体含义。其中文翻译,一般称作,
数据手册,意思就是,一个关于描述硬件各个硬件特性,参数以及/或者如何操作,如何
使用的文档。
3. Erasesize / Writesize:这个是 Linux MTD 中,关于块大小和页大小的别名,第一次见到
的时候,把我搞糊涂了,后来才慢慢明白的。因为,nand 操作的写基本单位页,所以,
writesize,对应的就是 pagesize,页大小。而擦除操作的基本单位是 blocksize,块大小,
所以也叫它 erasesize。在此简单提一下这几个名词,方便和我遇到类似问题的朋友。
4. Spare Area / Redundant Area / OOB:nand flash 中每一页对应一块区域,用于存放校验
的 ECC 数据和其他一些信息,比如上层文件系统放的和自己文件系统相关的数据。这
个区域,在 Linux MTD 相关系统中,被称作 oob(out of band),可以翻译为带外,也就
是 nand flash 的一个页,可以称作一个 band,band 之外,对应的就是指那个多出来的,
特殊的区域了。而 nand flash 的 datasheet 中,一般成为 spare area,可译为空闲区域,另
外,在 ID 的含义解释中也叫做 redundant area,可译为冗余区域,归根结底,都是一个
含义。不要被搞糊涂了就好。
5. Page Register(页寄存器):nand flash 硬件中的一块地方,名字叫做 register,实际就是一
个数据缓存,一个 buffer,用于存放那些从 flash 读出来或者将要写入到 flash 中的。其
实叫做页缓存,更合适,更容易明白其含义。此页寄存器的大小=页大小+ oob 大小,
即 pagesize+oob,对于常见的页是 2KB 的,此页寄存器就是 2KB+64=2112 字节。
6. Chip 和 Plane:对于 chip,其实任何某个型号的 flash,都可以称其是一个 chip,但是实
际上,此处的 chip,是针对内部来说的,也就是某型号的 flash,内部有几个 chip,比如
下面会举例说到的,三星的 2GB 的 K9WAG08U1A 芯片(可以理解为外部芯片/型号)
内部装了 2 个单片是 1GB 的 K9K8G08U0A,此时就称 K9WAG08U1A 内部有 2 个 chip,
而有些单个的 chip,内部又包含多个 plane,比如上面的 K9K8G08U0A 内部包含 4 个单
片是 2Gb 的 Plane。只有搞清楚了此处的 chip 和 plane 的关系,才能明白后面提到的多
页(Multi Plane / Multi Page)编程和交互(interleave)编程的含义。
7. 编程(Program):此处的编程,不是写软件,写代码,而是对于硬件来说的,可以理解
为对硬件编程,只不过其工具是硬件内部的逻辑,而不是你用的软件。对 Nand Flash 的
编程,本质上就是实现写操作,将数据写到 Nand Flash 里面去,所以对于 nand flash,
可以简单的理解为 program 编程=write 写(数据)。
详细代码可以在这里找到:
linux/drivers/mtd/nand/nand_base.c
2407/*
2408 * Get the flash and manufacturer id and lookup if the type is supported
2409 */
2410static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
2411 struct nand_chip *chip,
2412 int busw, int *maf_id)
2413{
2414 struct nand_flash_dev *type = NULL;
2415 int i, dev_id, maf_idx;
2416 int tmp_id, tmp_manf;
2417
/* 选中芯片,才能对其操作。 */
2418 /* Select the device */
2419 chip->select_chip(mtd, 0);
2420
2421 /*
2422 * Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx)
2423 * after power-up
2424 */
2425 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
2426
/* 发送 ReadID 的命令:0x90,去驱动芯片的 ID 信息 */
2427 /* Send the command for reading device ID */
2428 chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
2429
/* 根据 datasheet 中的定义,第一个字节,简称 byte1,是生产厂商的信息,不同的厂商,对
应不同的数字。而 byte2 是芯片类型,不同的 nand flash 芯片,对应不同的设备 ID,也就是
一个字节的数字。
关于读取出来的 ID 的具体含义,可以参考三星 K9K8G08U0A 的 datasheet 中解释:
图 1.Nand Flash 读取出来的各个 ID 的含义
*/
2430 /* Read manufacturer and device IDs */
2431 *maf_id = chip->read_byte(mtd);
2432 dev_id = chip->read_byte(mtd);
2433
2434 /* Try again to make sure, as some systems the bus-hold or other
2435 * interface concerns can cause random data which looks like a
2436 * possibly credible NAND flash to appear. If the two results do
2437 * not match, ignore the device completely.
2438 */
2439
/* 再次发送 ReadID 命令,其目的,上面注释代码中说了,有些特殊的系统中,第一次读取
的信息,看起来是很正常,但是实际是错的,所以这里读两次,正常的设备,肯定都会一样
的,如果两次不一样,那么说明设备有问题,也就直接函数返回了。*/
2440 chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
2441
2442 /* Read manufacturer and device IDs */
2443
2444 tmp_manf = chip->read_byte(mtd);
2445 tmp_id = chip->read_byte(mtd);
2446
2447 if (tmp_manf != *maf_id || tmp_id != dev_id) {
2448 printk(KERN_INFO "%s: second ID read did not match "
2449 "%02x,%02x against %02x,%02x\n", __func__,
2450 *maf_id, dev_id, tmp_manf, tmp_id);
2451 return ERR_PTR(-ENODEV);
2452 }
2453
/* 下面根据读取出来的 flash ID,也就是具体 flash 芯片,或叫做设备 ID,不同的数值,对
应不同的容量和物理参数的 flash。
其中,nand_flash_ids 是个预先定义好的数组,其定义在:
drivers\mtd\nand\nand_ids.c 中,此处简要摘录如下:
/*
* Chip ID list
*
* Name. ID code, pagesize, chipsize in MegaByte, eraseblock size, options
*
* Pagesize; 0, 256, 512
* 0 get this information from the extended chip ID
+ 256 256 Byte page size
* 512 512 Byte page size
*/
struct nand_flash_dev nand_flash_ids[] = {
剩余13页未读,继续阅读
资源评论
- paniven2014-04-22不错,可以对nand有个基本全面的了解。
arkofnoach
- 粉丝: 131
- 资源: 146
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功