分类:
2012-12-27 17:01:00
【详解】如何编写Linux下Nand Flash驱动
版本: 1.8
作者:crifan
邮箱: green-waste(At)163.com
由于本文内容太长,不方便此处发表全文,所以只列出了目录。
这里有PDF版本:【详解】如何编写Linux下Nand Flash驱动 v1.8.pdf
1. 【详解】如何编写Linux下Nand Flash驱动 v1.8.pdf
2. (1.79 MB)
3.
4.
版本历史
版本 |
日期 |
内容更新 |
1.0 |
2009-07-21 |
简介如何在Linux下实现Nand Flash驱动 |
1.2 |
2011-03-15 |
整理了排版 添加了很多内容 |
1.3 |
2011-06-12 |
修正了Nand Flash行列地址的计算方法 |
1.7 |
2011-07-02 |
添加了ONFI,LBA规范的介绍 添加了Unique ID介绍 添加了对应的MTD中检测不同类型芯片的代码 增加了关于Nand Flash的软件和硬件的ECC算法的简介 |
1.8 |
2011-10-04 |
添加了Nand Flash位翻转的详细介绍 添加了Nand Flash的结构图 |
目录
1 正文之前 5
1.1 目的 5
1.2 目标读者和阅读此文的前提 5
1.3 说明 5
1.4 声明 5
2 编写驱动之前要了解的知识 6
2.1 一些相关的名词的解释 6
2.1.1 Non-Volatile Memory非易失性存储器 6
2.1.2 OTP一次性可编程存储器 6
2.1.3 NDA 6
2.1.4 Datasheet数据手册和Specification规范 6
2.1.5 Nand Flash相关的一些名词解释 6
2.1.5.1 (Bad) Block Management(坏)块管理 6
2.1.5.2 Wear-Leveling负载平衡 7
2.1.5.3 ECC错误校验码 7
2.2 硬件特性 8
2.2.1 什么是Flash 8
2.2.1.1 Flash的硬件实现机制 8
2.2.2 什么是Nand Flash 8
2.2.2.1 Nand Flash和Nor Flash的区别 9
2.2.2.2 Nand Flash的详细分类 10
2.2.3 SLC和MLC的实现机制 10
2.2.3.1 SLC(Single Level Cell) 10
2.2.3.2 MLC(Multi Level Cell) 10
2.2.3.3 关于如何识别SLC还是MLC 10
2.2.4 Nand Flash数据存储单元的整体架构 11
2.2.5 Nand Flash的物理存储单元的阵列组织结构 12
2.2.5.1 Block块 13
2.2.5.2 Page页 13
2.2.5.3 oob / Redundant Area / Spare Area 13
2.2.6 Flash名称的由来 14
2.2.7 Flash相对于普通设备的特殊性 14
2.2.8 Nand Flash的位反转特性 14
2.2.8.1 Nand Flash位反转的原因 15
2.2.8.2 Nand Flash位反转的影响 15
2.2.8.3 Nand Flash位反转的类型和解决办法 15
2.2.9 Nand Flash引脚(Pin)的说明 16
2.2.9.1 为何需要ALE和CLE 17
2.2.9.2 Nand Flash只有8个I/O引脚的好处 17
2.2.9.2.1 减少外围连线: 17
2.2.9.2.2 提高系统的可扩展性 18
2.2.10 Nand Flash的一些典型(typical)的特性 18
2.2.11 Nand Flash控制器与Nand Flash芯片 18
2.2.12 Nand Flash中的特殊硬件结构 18
2.2.13 Nand Flash中的坏块(Bad Block) 19
2.2.13.1 坏块的分类 19
2.2.13.2 坏块的标记 19
2.2.13.3 坏块的管理 20
2.2.13.4 坏块的比例 20
2.2.14 Nand Flash中页的访问顺序 20
2.2.15 常见的Nand Flash的操作 20
2.2.15.1 页编程(Page Program)注意事项 21
2.2.15.2 读(Read)操作过程详解 22
2.2.15.2.1 需要使用何种命令 22
2.2.15.2.2 发送命令前的准备工作以及时序图各个信号的具体含义 22
2.2.15.2.3 如何计算出我们要传入的行地址和列地址 24
2.2.15.2.4 读操作过程的解释 27
2.2.16 Nand Flash的一些高级特性 28
2.2.16.1 Nand Flash的Unique ID 28
2.2.16.1.1 什么是Unique ID唯一性标识 28
2.2.16.1.2 不同Nand Flash厂商的对Unique ID的不同的实现方法 28
2.2.16.1.2.1 Toshiba东芝的Nand的Unique ID 28
2.2.16.1.2.2 读取Toshiba的Nand的Unique ID 29
2.2.16.1.3 Samsung三星的Nand的Unique ID 29
2.2.16.1.3.1 读取Samsung的Nand的Unique ID 30
2.2.16.1.4 遵循ONFI规范的厂商的Nand的Unique ID 30
2.2.16.1.4.1 读取遵循ONFI的厂商的Nand的Unique ID 31
2.2.16.2 片选无关(CE don’t-care)技术 32
2.2.16.3 带EDC的拷回操作以及Sector的定义(Copy-Back Operation with EDC & Sector Definition for EDC) 33
2.2.16.4 多片同时编程(Simultaneously Program Multi Plane) 33
2.2.16.5 交错页编程(Interleave Page Program) 34
2.2.16.6 随机输出页内数据(Random Data Output In a Page) 34
2.3 软件方面 34
2.3.1 Nand Flash相关规范 – ONFI和LBA 34
2.3.1.1 ONFI是什么 34
2.3.1.1.1 ONFI Block Abstracted NAND 36
2.3.1.1.2 ONFI的好处 37
2.3.1.2 LBA规范是什么 37
2.3.1.3 为何会有ONFI和LBA 38
2.3.1.3.1 技术层面的解释 38
2.3.1.3.2 现实层面的解释 38
2.3.1.4 ONFI和LBA的区别和联系 38
2.3.1.4.1 ONFI和LBA的区别 38
2.3.1.4.2 ONFI和LBA的联系 38
2.3.2 内存技术设备,MTD(Memory Technology Device) 38
2.3.2.1 Linux MTD中检测不同类型Nand Flash的ID部分的代码 39
2.3.3 读操作的硬件到软件的映射 44
2.3.4 Nand flash驱动工作原理 49
3 Linux下Nand Flash驱动编写步骤简介 51
3.1 对于驱动框架部分 51
3.2 对于Nand Flash底层操作实现部分 51
4 引用文章 54
图表
图表 1 典型的Flash内存单元的物理结构 8
图表 2 Nand Flash 和 Nor Flash的区别 9
图表 3 Nand Flash 第3个ID的含义 11
图表 4 Nand Flash的结构图 12
图表 5 Nand Flash物理存储单元的阵列组织结构 13
图表 6 Flash和普通设备相比所具有的特殊性 14
图表 7 Nand Flash引脚功能说明 16
图表 8 Nand Flash引脚功能的中文说明 17
图表 9 Nand Flash读写时的数据流向 19
图表 10 Nand Flash K9K8G08U0A的命令集合 21
图表 11 Nand Flash数据读取操作的时序图 23
图表 12 Nand Flash的地址周期组成 24
图表 13 Toshiba的Unique ID 29
图表 14 ONFI的参数页数据结构定义 31
图表 15 ONFI中Unique ID的结构 32
图表 16 ONFI中Read Unique ID命令的时序图 32
图表 17 ONFI中的Nand Flash的命令集合 36
图表 18 MTD设备和硬盘设备之间的区别 39
图表 19 Nand Flash数据读取操作的时序图 45
缩略词
缩写 |
全称 |
中文含义 |
BBM |
Bad Block Management |
坏块管理 |
BBT |
Bad Block Table |
坏块表 |
ECC |
Error Correction Code |
错误校验码 |
EEPROM |
Electrically Erasable Programmable Read-Only Memory |
电可擦只读存储器 |
MLC |
Multi Level Cell |
多层单元 |
MOSFET |
Metal-Oxide –Semiconductor Field Effect Transistor |
金属氧化物半导体场效应晶体管 |
MTD |
Memory Technology Device |
内存技术设备 |
NDA |
None-Disclosure Agreement |
保密协议 |
OTP |
One Time Programmable |
一次性可编程(存储器) |
SLC |
Single Level Cell |
单层单元,单层式存储 |