没有合适的资源?快使用搜索试试~ 我知道了~
首页【详解】如何编写Linux下Nand Flash驱动 v1.8
深入浅出地解释了Flash,Nand Flash的来龙去脉; 以及如果要去实现Linux下面的Nand Flash驱动之前,所要了解到的 Nand FLash的硬件知识,Linux下面Nand Flash的框架, 以及如何去在Linux的框架下,实现对应的Nand Flash的驱动。 在1.7的版本上: 1. 添加了Nand Flash位翻转的详细介绍 2. 添加了Nand Flash的结构图
资源详情
资源评论
资源推荐

【详解】如何编写 Linux 下 Nand Flash 驱动
版本: 1.8
作者:crifan
邮箱: green-waste(At)163.com
版本历史
版本
日期
内容更新
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
单层单元,单层式存储

1 正文乊前
1.1 目的
本文的主要目的是,看了之后,你应该对 Nand Flash 的硬件特性以及对应的 Linux 下软件平
台有了基本的认识,进一步地,对如何实现 Linux 下的 Nand Flash 的驱动,知道要做哪些事
情了,以及大概是如何实现的。这样,如果有了对应的开发环境,你就可以自己去实现 Nand
Flash 的驱动了。
不过额外提示一句的是,写出代码,并不代表你就完全搞懂了整个系统的流程。而且已经写
好的代码,很可能有 bug,要你不断地调试,通过调试,你才会对整个系统以及 Nand Flash
的方方面面有个更深入的了解的。
而且,你会发现,为了写驱动那点代码之前,却要弄懂太多的东西,包括硬件的工作原理,
软件的协议规范,软件的逻辑架构等等,最后才能去实现你的驱动,所以有人会说,你写驱
动不是很简单嘛,不就是写那几行代码吗,对此,一个经典的回答就是,对于整个写驱动的
工作的价值算作 100 元的话,写代码值 1 块钱,但是知道怎么写,值 99 块钱。^_^
1.2 目标读者和阅读此文的前提
正因为此文目的是让你搞懂如何在 Linux 下面实现 Nand Flash 的驱动,所以,目标读者就是,
希望对 Nand Flash 硬件知识有一定了解,和想要在 Linux 下面实现 Nand Flash 驱动的读者。
而阅读此文的前提,是要有一些基本的软硬件基础知识,和了解如何在 v2.6 内核之后 Linux
的下面开发驱动的流程。有了这些知识,再看本文,然后你才能清楚真正要去实现 Nand Flash
的驱动,是如何下手。
1.3 说明
本文的逻辑是,先介绍 Nand Flash 的一些基本的硬件知识,然后详细分析 Nand Flash 的 Read
操作的具体的流程,清楚硬件实现的逻辑,接着介绍软件平台,即 Linux 下面和 Nand Flash
相关的内容,这样,硬件和软件都清楚是怎么回事了,然后再介绍如何去在 Linux 的架构下,
实现 Nand Flash 驱动。
之前写的版本,虽然前面关于 Nand Flash 的内容介绍的比较详细,但是后面关于相关的 MTD
知识,尤其是 Linux 的 MTD 的架构和如何实现具体的 Nand 的 Flash 的操作等部分的内容,
写的很简略,导致有些读者看了后,觉得是,关于如何写驱动,和没说差不多,呵呵。
因此,现在继续更新,将更详细的解释,如何从硬件 Nand Flash 的规范,一步步映射到具
体的软件实现的过程,这样,使得读者更明白其中的内在逻辑,然后接着再介绍如何在理解
了软硬件各自的所具有的功能,以及 Linux 的 MTD 系统,已经帮你实现了哪些功能,然后
才会更加明白,余下的要实现的软件部分,就是你所要实现的 Linux 下的 Nand Flash 的驱动
部分了。
1.4 声明
关于此贴版权问题,欢迎转载,但是希望注明联系方式,至少其他人看到被转帖的内容,如
果有疑问,建议和意见,可以及时与笔者沟通:green-waste (at) 163.com。
剩余54页未读,继续阅读

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论25