第 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驱动工作原理

摘要

1.1. 一些相关的名词的解释

1.1.1. Non-Volatile Memory非易失性存储器

NVM,即NV (RAM)Memory,断电数据也不会丢失的存储器,比如Nand Flash,Nor Flash,硬盘等等。于此相对的是,断电了数据会丢失的存储器,比如DRAM等。

1.1.2. OTP一次性可编程存储器

OTP,一种非易失性存储器,但是只允许一次性写入数据,写入(或称烧写)数据之后,就不能修改了。

OTP的好处或者说用途是,常用于写入一些和芯片相关的一些特定数据,用于加密的一些数据等。

与一次性写入数据的OTP相对应的是,像Nand Flash,硬盘等存储器,可以被多次写入数据。只要硬盘这类的存储器没坏,你高兴写入几次就写入几次,而OTP就只能写入一次,就没法再修改里面的数据了。

1.1.3. NDA 保密协议

NDA,中文可以翻译为,非公开协议,保密协议。

说白了,还是一种协议,常用于这种情况:

某家厂商的某种技术或资料,是保密的,不希望公开的。

但是呢,如果你要用他家的芯片啊之类的东西,在开发过程中,又必须得到对应的技术和资料,才能开发产品,所以,他就会要求和你签订这样的NDA协议,意思就是,你可以用我的技术和资料,但是你不能公开给(我未授权的)其他人。如果非法泄露我的机密技术,那我肯定要走法律程序控告你,之类的。

1.1.4. Datasheet数据手册和Specification规范

英文datasheet,中文一般翻译为数据手册。

指的是对应某个硬件,多为芯片,的功能说明,定义了如何操作该硬件,达到你要的功能,这其中主要包括芯片中的相关寄存器的定义,如何发送命令,发送什么命令,以此来操作此硬件等等。

而英文Specification,引文常缩写为Spec.,中文一般翻译为规范。

多指某个组织(盈利的或非盈利的),定义了一些规矩,如果你要用某种东西,在计算机领域,常常指的是某硬件和相关的软件协议,就要按照此规矩来操作,人家这个组织呢,保证你只要实现了此规范,设备就能按照你所期望的运行,能够实现对应的功能,而你的芯片实现了此规范,就叫做,是和此规范兼容(compatible)的。

1.1.5. Nand Flash相关的一些名词解释

1.1.5.1. (Bad) Block Management(坏)块管理

Nand Flash由于其物理特性,只有有限的擦写次数,超过那个次数,基本上就是坏了。在使用过程中,有些Nand Flash的block会出现被用坏了,当发现了,要及时将此block标注为坏块,不再使用。

于此相关的管理工作,属于Nand Flash的坏块管理的一部分工作。

1.1.5.2. Wear-Leveling负载平衡

Nand Flash的block的管理,还包括负载平衡。

正是由于Nand Flash的block,都是有一定寿命限制的,所以如果你每次都往同一个block擦除然后写入数据,那么那个block就很容易被用坏了,所以我们要去管理一下,将这么多次的对同一个block的操作,平均分布到其他一些block上面,使得在block的使用上,相对较平均,这样相对来说,可以更能充分利用Nand Flash。

关于wear-leveling这个词,再简单解释一下,wear就是穿(衣服)等,用(东西)导致磨损,而leveling就是使得均衡,所以放在一起就是,使得对于Nand Flash的那么多的block的使用磨损,相对均衡一些,以此延长Nand Flash的使用寿命或者说更加充分利用Nand Flash。

1.1.5.3. ECC错误校验码

Nand Flash物理特性上使得其数据读写过程中会发生一定几率的错误,所以要有个对应的错误检测和纠正的机制,于是才有此ECC,用于数据错误的检测与纠正。Nand Flash的ECC,常见的算法有海明码和BCH,这类算法的实现,可以是软件也可以是硬件。不同系统,根据自己的需求,采用对应的软件或者是硬件。

相对来说,硬件实现这类ECC算法,肯定要比软件速度要快,但是多加了对应的硬件部分,所以成本相对要高些。如果系统对于性能要求不是很高,那么可以采用软件实现这类ECC算法,但是由于增加了数据读取和写入前后要做的数据错误检测和纠错,所以性能相对要降低一些,即Nand Flash的读取和写入速度相对会有所影响。

其中,Linux中的软件实现ECC算法,即NAND_ECC_SOFT模式,就是用的对应的海明码。

而对于目前常见的MLC的Nand Flash来说,由于容量比较大,动辄2GB,4GB,8GB等,常用BCH算法。BCH算法,相对来说,算法比较复杂。

笔者由于水平有限,目前仍未完全搞懂BCH算法的原理。

BCH算法,通常是由对应的Nand Flash的Controller中,包含对应的硬件BCH ECC模块,实现了BCH算法,而作为软件方面,需要在读取数据后,写入数据之前,分别操作对应BCH相关的寄存器,设置成BCH模式,然后读取对应的BCH状态寄存器,得知是否有错误,和生成的BCH校验码,用于写入。

其具体代码是如何操作这些寄存器的,由于是和具体的硬件,具体的nand flash的controller不同而不同,无法用同一的代码。如果你是nand flash驱动开发者,自然会得到对应的起nand flash的controller部分的datasheet,按照手册说明,去操作即可。

不过,额外说明一下的是,关于BCH算法,往往是要从专门的做软件算法的厂家购买的,但是Micron之前在网上放出一个免费版本的BCH算法。

想要此免费的BCH算法,可以在[18]找到下载地址