【详解】如何编写Linux下Nand Flash驱动

版本:v2.2.1

Crifan Li

摘要

本文先解释了Nand Flash相关的一些名词,再从Flash硬件机制开始,介绍到Nand Flash的常见的物理特性,且深入介绍了Nand Flash的一些高级功能,然后开始介绍Linux下面和Nand Flash相关的软件架构MTD的相关知识,最后介绍了在Linux的MTD驱动框架下,如何实现Nand Flash的驱动。

[提示] 本文提供多种格式供:
在线阅读 HTML HTMLs PDF CHM TXT RTF WEBHELP
下载(7zip压缩包) HTML HTMLs PDF CHM TXT RTF WEBHELP

HTML版本的在线地址为:

http://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html

有任何意见,建议,提交bug等,都欢迎去讨论组发帖讨论:

http://www.crifan.com/bbs/categories/linux_nand_driver/

2015-05-24

修订历史
修订 1.0 2009-07-21 crl
  1. 简介如何在Linux下实现Nand Flash驱动
修订 1.2 2011-03-15 crl
  1. 整理了排版
  2. 添加了很多内容
修订 1.3 2011-06-12 crl
  1. 修正了Nand Flash行列地址的计算方法
修订 1.7 2011-07-02 crl
  1. 添加了ONFI,LBA规范的介绍
  2. 添加了Unique ID介绍
  3. 添加了对应的MTD中检测不同类型芯片的代码
  4. 增加了关于Nand Flash的软件和硬件的ECC算法的简介
修订 1.8 2011-10-04 crl
  1. 添加了Nand Flash位翻转的详细介绍
  2. 添加了Nand Flash的结构图
修订 1.9 2012-06-14 crl
  1. 通过Docbook发布
修订 2.2.1 2015-05-24 crl
  1. 修正关于Nand Flash物理架构组成总容量方面的解释
  2. 修正其他一些笔误
  3. 添加了和Nand Flash相关的一些资料,比如id的命名规则
  4. 添加了keyword,第二章所有章节的id
  5. 修正了笔误,把"第7000个块中的第25页中的1208字节处"改为"第7000个块中的第64页中的1208字节处",以及同步修正了相关的数字
  6. 添加eMMC,eUSB等接口的简介

目录

缩略词
正文之前
1. 目的
2. 目标读者和阅读此文的前提
3. 说明
4. 声明
1. 编写驱动之前要了解的知识
1.1. 一些相关的名词的解释
1.1.1. Non-Volatile Memory非易失性存储器
1.1.2. OTP一次性可编程存储器
1.1.3. NDA 保密协议
1.1.4. Datasheet数据手册和Specification规范
1.1.5. Nand Flash相关的一些名词解释
1.1.5.1. (Bad) Block Management(坏)块管理
1.1.5.2. Wear-Leveling负载平衡
1.1.5.3. ECC错误校验码
1.2. 硬件特性
1.2.1. 什么是Flash
1.2.1.1. Flash的硬件实现机制
1.2.2. 什么是Nand Flash
1.2.2.1. Nand Flash的详细分类
1.2.3. SLC和MLC的实现机制
1.2.3.1. SLC(Single Level Cell)
1.2.3.2. MLC(Multi Level Cell)
1.2.3.3. 关于如何识别SLC还是MLC
1.2.4. Nand Flash数据存储单元的整体架构
1.2.5. Nand Flash的物理存储单元的阵列组织结构
1.2.5.1. Block块
1.2.5.2. Page页
1.2.5.3. oob / Redundant Area / Spare Area
1.2.6. Flash名称的由来
1.2.7. Flash相对于普通设备的特殊性
1.2.8. Nand Flash的位反转特性
1.2.8.1. Nand Flash位反转的原因
1.2.8.2. Nand Flash位反转的影响
1.2.8.3. Nand Flash位反转的类型和解决办法
1.2.9. Nand Flash引脚(Pin)的说明
1.2.9.1. 为何需要ALE和CLE
1.2.9.2. Nand Flash只有8个I/O引脚的好处
1.2.9.2.1. 减少外围连线
1.2.9.2.2. 提高系统的可扩展性
1.2.10. Nand Flash的一些典型(typical)的特性
1.2.11. Nand Flash控制器与Nand Flash芯片
1.2.12. Nand Flash中的特殊硬件结构
1.2.13. Nand Flash中的坏块(Bad Block)
1.2.13.1. 坏块的分类
1.2.13.2. 坏块的标记
1.2.13.3. 坏块的管理
1.2.13.4. 坏块的比例
1.2.14. Nand Flash中页的访问顺序
1.2.15. 常见的Nand Flash的操作
1.2.15.1. 页编程(Page Program)注意事项
1.2.15.2. 读(Read)操作过程详解
1.2.15.2.1. 需要使用何种命令
1.2.15.2.2. 发送命令前的准备工作以及时序图各个信号的具体含义
1.2.15.2.3. 如何计算出我们要传入的行地址和列地址
1.2.15.2.4. 读操作过程的解释
1.2.16. Nand Flash的一些高级特性
1.2.16.1. Nand Flash的Unique ID
1.2.16.1.1. 什么是Unique ID唯一性标识
1.2.16.1.2. 不同Nand Flash厂商的对Unique ID的不同的实现方法
1.2.16.1.2.1. Toshiba东芝的Nand的Unique ID
1.2.16.1.2.2. 读取Toshiba的Nand的Unique ID
1.2.16.1.3. Samsung三星的Nand的Unique ID
1.2.16.1.3.1. 读取Samsung的Nand的Unique ID
1.2.16.1.4. 遵循ONFI规范的厂商的Nand的Unique ID
1.2.16.1.4.1. 读取遵循ONFI的厂商的Nand的Unique ID
1.2.16.2. 片选无关(CE don’t-care)技术
1.2.16.3. 带EDC的拷回操作以及Sector的定义(Copy-Back Operation with EDC & Sector Definition for EDC)
1.2.16.4. 多片同时编程(Simultaneously Program Multi Plane)
1.2.16.5. 交错页编程(Interleave Page Program)
1.2.16.6. 随机输出页内数据(Random Data Output In a Page)
1.3. 软件方面
1.3.1. Nand Flash相关规范 – ONFI和LBA
1.3.1.1. ONFI是什么
1.3.1.1.1. ONFI Block Abstracted NAND
1.3.1.1.2. ONFI的好处
1.3.1.2. LBA规范是什么
1.3.1.3. 为何会有ONFI和LBA
1.3.1.3.1. 技术层面的解释
1.3.1.3.2. 现实层面的解释
1.3.1.4. ONFI和LBA的区别和联系
1.3.1.4.1. ONFI和LBA的区别
1.3.1.4.2. ONFI和LBA的联系
1.3.2. 内存技术设备,MTD(Memory Technology Device)
1.3.2.1. Linux MTD中检测不同类型Nand Flash的ID部分的代码
1.3.3. 读操作的硬件到软件的映射
1.3.4. Nand flash驱动工作原理
2. Linux下Nand Flash驱动编写步骤简介
2.1. 对于驱动框架部分
2.1.1. 对于Nand Flash底层操作实现部分
3. 和Nand Flash相关的一些资料
3.1. Nand Flash的型号/Part Number/Id的命名规则
3.1.1. 三星(Samsung)的Nand Flash芯片的命名规则
3.1.2. 美光(Micron)的Nand Flash芯片的命名规则
3.1.3. 海力士(Hynix)的Nand Flash芯片的命名规则
参考书目

插图清单

1.1. 典型的Flash内存单元的物理结构
1.2. Nand Flash的结构图
1.3. Nand Flash物理存储单元的阵列组织结构
1.4. Nand Flash引脚功能说明
1.5. Nand Flash读写时的数据流向
1.6. Nand Flash K9K8G08U0A的命令集合
1.7. Nand Flash数据读取操作的时序图
1.8. Nand Flash的地址周期组成
1.9. Toshiba的Unique ID
1.10. ONFI的参数页数据结构定义
1.11. ONFI中Unique ID的结构
1.12. ONFI中Read Unique ID命令的时序图
1.13. ONFI中的Nand Flash的命令集合
1.14. Nand Flash数据读取操作的时序图

表格清单

1.1. Nand Flash第3个ID的含义
1.2. Flash和普通设备相比所具有的特殊性
1.3. Nand Flash引脚功能的中文说明
1.4. MTD设备和硬盘设备之间的区别

公式清单

1.1. K9K8G08U0A的物理结构所组成的总容量