如何编写Linux下Nand Flash驱动

如何编写Linux下Nand Flash驱动,第1张

1. 硬件特性:

【Flash硬件实现机制】

Flash全名叫做Flash Memory属于非易失性存储设备(Non-volatile Memory Device)与相应易失性存储设备(Volatile Memory Device)关于非易失性/易失性名字看非易失性容易丢失数据存储类设备即使断电丢失类设备除Flash其比较见入硬盘ROM等与相易失性断电数据丢失比家用内存论前SDRAMDDR SDRAM现DDR2DDR3等都断电数据没

Flash内部存储MOSFET面悬浮门(Floating Gate)真存储数据单元

Flash前紫外线擦除(uv-erasable)EPROM已经采用用Floating Gate存储数据技术

图1.典型Flash内存单元物理结构

数据Flash内存单元电荷(electrical charge) 形式存储存储电荷少取决于图外部门(external gate)所施加电压其控制向存储单元冲入电荷使其释放电荷数据表示所存储电荷电压否超特定阈值Vth表示

【SLCMLC实现机制】

Nand Flash按照内部存储数据单元电压同层单内存单元存储1位数据位数据SLCMLC:

1.SLCSingle Level Cell:

单存储单元存储位数据表示1或0.

面介绍于数据表示单存储单元内部所存储电荷电压某特定阈值电压Vth相比于Vth值表示1反于Vth表示0.

于nand Flash数据写入1控制External Gate充电使存储电荷够超阈值Vth表示1于写入0其放电电荷减少于Vth表示0

关于何Nand Flash能0变1我理解物理说实现每位0变1实际于实际物理实现于效率考虑于每存储单元都能单独控制即0变1每存储单元单独充电所需要硬件实现复杂昂贵同所进行块擦除 *** 作实现前闪速度失Flash众特性

2.MLCMulti Level Cell:

与SLC相应单存储单元存储位比2位4位等其实现机制说起比较简单通控制内部电荷少阈值通控制面电荷少达我所需要存储同数据比假设输入电压Vin=4V(实际没电压处举例便)设计22=4阈值 1/4 Vin=1V2/4Vin=2V3/4Vin=3VVin=4V别表示2位数据00011011于写入数据充电通控制内部电荷少应表示同数据

于读取则通应内部电流(与Vth反比)通系列解码电路完读取解析所存储数据些具体物理实现都足够精确设备技术才能实现精确数据写入读

单存储单元存储2位数据称作22=4 Level Cell2 Level Cell点前差点搞晕同理于新单存储单元存储4位数据称作 24=16 Level Cell

【关于何识别SLCMLC】

Nand Flash设计命令叫做Read ID读取ID意思读取芯片ID像家身份z读取ID读取几字节般少4新芯片支持5甚至更些字节解析相关信息比Nand Flash内部几芯片(chip)所组每chip包含几片(Plane)每片页块等等些信息其识别flashSLCMLC面见Nand Flashdatasheet所规定第3字节3rd byte所表示信息其SLC/MLC识别信息:

表1.Nand Flash 第3ID含义

【Nand Flash物理存储单元阵列组织结构】

Nand flash内部组织结构处用图解释比较容易理解:

图2.Nand Flash物理存储单元阵列组织结构

图K9K8G08U0Adatasheet描述

简单解释:

1.nand flash由块(Block)组块般128KB256KB512KB处128KB

2.每块面包含页(page)每页于现见nand flash数2KB更新nand flash4KB类页于2KBnand flash称作big block应发读写命令址共5周期(cycle)nand flash页256B512B类nand flash称作small block址周期4

块Nand Flash擦除 *** 作基本/单位

3.每页应块区域叫做空闲区域(spare area)/冗余区域(redundant area)Linux系统般叫做OOB(Out Of Band)区域初基于Nand Flash硬件特性:数据读写候相容易错误所保证数据确性必须要应检测纠错机制机制叫做EDC(Error Detection Code)/ECC(Error Code Correction, 或者 Error Checking and Correcting)所设计余区域用于放置数据校验值

页Nand Flash写入 *** 作基本/单位

【Nand Flash数据存储单元整体架构】

简单说见nand flash内部chip每chipplane

些复杂容量更nand flash内部chip每chipplane类nand flash往往更加高级功能比面要介绍Multi Plane ProgramInterleave Page Program等

比型号K9K8G08U0A芯片(chip)内部两K9F4G08U0A每K9F4G08U0A包含2Plane每Plane1Gb所K9F4G08U0A1Gb×2=2Gb=256MBK9K8G08U0A内部2K9F4G08U0A即4Plane总4×256MB=1GB

型号K9WAG08U1Anand flash内部包含2K9K8G08U0A所总容量K9K8G08U0A两倍=1GB×2=2GB类似K9NBG08U5A内部包含4K9K8G08U0A总4×1GB=4GB

【Flash名称由】

Flash擦除 *** 作block块单位与相应其存储设备bit位读取/写入单位Flash性擦除整块:发送擦除命令性block见块128KB/256KB全部擦除1面内容全部都0xFF由于擦除相说擦除用间短用闪形容所叫做Flash Memory文翻译 (快速)闪存

【Flash相于普通设备特殊性】

1. 面提Flash *** 作单位些特殊

般设备比硬盘/内存读取写入都bit位单位读取bit值某值写入应址位都按位 *** 作

Flash由于物理特性使内部存储数据能1变0点前面内部实现机制解便统充电便单独存储单元放电所才说能1变0释放电荷

所总结Flash特殊性:

表2.Flash普通设备相比所具特殊性

注:

① 所写 *** 作叫做编程flash 前EPROMEEPROM继承发展前EEPROM(Electrically Erasable Programmable Read-Only Memory)往面写入数据叫做编程Program所称呼其数据写入需要用电擦除/写入叫做编程

② 于目前见页2K/4KNand Flash其块128KB/256KB/512KB等于Nor Flash见块64K/32K等

③写数据前要先擦除内部都变0xFF才能写入数据应位由1变0

【Nand Flash引脚(Pin)说明】

图3.Nand Flash引脚功能说明

图见Nand Flash所拥引脚(Pin)所应功能简单翻译:

1. I/O0 ~ I/O7:用于输入址/数据/命令输数据

2. CLE:Command Latch Enable命令锁存使能输入命令前要先模式寄存器设置CLE使能

3. ALE:Address Latch Enable址锁存使能输入址前要先模式寄存器设置ALE使能

4. CE#:Chip Enable芯片使能 *** 作Nand Flash前要先选芯片才能 *** 作

5. RE#:Read Enable读使能读取数据前要先使CE#效

6. WE#:Write Enable写使能, 写取数据前要先使WE#效

7. WP#:Write Protect写保护

8. R/B#:Ready/Busy Output,绪/忙,主要用于发送完编程/擦除命令,检测些 *** 作否完,忙,表示编程/擦除 *** 作仍进行,绪表示 *** 作完.

9. Vcc:Power电源

10. Vss:Ground接

11. N.C:Non-Connection,未定义未连接

[识]

数据手册看于引脚定义些字母面带横杠说明引脚/信号低电平效比面看RE横线说明RE低电平效外书写便字母面加#表示低电平效比我面写CE#;字母啥都没默认高电平效比面CLE高电平效

【何需要ALECLE】

突想明白Nand Flash, 何设计命令,整系统搞复杂原:

比命令锁存使能(Command Latch Enable,CLE) 址锁存使能(Address Latch EnableALE)Nand Flash8I/O且复用传数据传址传命令区前传入底啥所先要用发CLE(或ALE)命令告诉nand Flash控制器声我面要传命令(或址)面才能根据传入内容进行应作否则,nand flash内部,知道传入数据,址,命令啊,实现确 *** 作.

【Nand Flash8I/O引脚处】

1.减少外围引脚:相于并口(Parellel)Nor Flash48或52引脚说确减引脚数目封装芯片体积现芯片向体积更功能更强功耗更低发展减芯片体积优势同减少芯片接口意味着使用芯片相关外围电路更简化避免繁琐硬件连线

2.提高系统扩展性没像其设备用物理应完全数目addr引脚芯片内部换芯片等改于用全部址addr引脚引起些引脚数目增加比容量扩倍址空间/寻址空间扩倍所址线数目/addr引脚数目要加于统用8I/O引脚Nand Flash由于外提供都统8引脚内部芯片变化或者其变化于外部使用者(比编写nand flash驱)说需要关保证新芯片遵循同接口同序同命令提高系统扩展性

如何把设备驱动文件添加到Linux内核编译选项配置的menuconfig中:

【目的】

把一个字符设备驱动文件,添加到内核中,希望编译成模块,而非build-in。

【具体步骤】

1.首先保证已经有驱动源文件了:as352x_afe_charger.c

放在和其他你所要添加的模块放在一个目录下,此处是drivers\i2c\chips下。

2.在drivers\i2c\chips\makefile中,添加:

obj-$(CONFIG_AS352X_AFE_CHG) += as352x_afe_charger.o

3.在drivers\i2c\chips\Kconfig

中,添加如下内容:

---------------------无敌分割线-------------------------

config AS352X_AFE_CHG

tristate "AS352X AFE Charger Driver"

depends on I2C_AS352X &&AS352X_AFE

help

If you say yes here you get support for AS352X AFE Charger.

This driver can also be built as a module. If so, the module

will be called AS352X AFE Charger.

---------------------无敌分割线-------------------------

解释如下:

(1)AS352X_AFE_CHG是自己定义的名字,当然要尽量保证有意义。

同时,你会注意到,在上面的makefile中添加的

obj-$(CONFIG_AS352X_AFE_CHG) += as352x_afe_charger.o

中的CONFIG_AS352X_AFE_CHG,是CONFIG_加上我们在kconfig下写的config变量。

这两个要匹配,才能实现你在menconfig定义的结果,传递到makefile中,

以便决定编译的时候是如何编译:不编译/编译进内核/编译成模块

(2)tristate 表示我此处添加的模块,可以

在make ARCH=arm menuconfig中看到的,选择之后:

* 编译到内核中

M 编译成模块,即生成XXX.ko

不选中,就不编译该文件

1. 硬件特性:

【Flash的硬件实现机制】

Flash全名叫做Flash Memory,属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device)。关于什么是非易失性/易失性,从名字中就可以看出,非易失性就是不容易丢失,数据存储在这类设备中,即使断电了,也不会丢失,这类设备,除了Flash,还有其他比较常见的入硬盘,ROM等,与此相对的,易失性就是断电了,数据就丢失了,比如大家常用的内存,不论是以前的SDRAM,DDR SDRAM,还是现在的DDR2,DDR3等,都是断电后,数据就没了。

Flash的内部存储是MOSFET,里面有个悬浮门(Floating Gate),是真正存储数据的单元。

在Flash之前,紫外线可擦除(uv-erasable)的EPROM,就已经采用用Floating Gate存储数据这一技术了。

图1.典型的Flash内存单元的物理结构

数据在Flash内存单元中是以电荷(electrical charge) 形式存储的。存储电荷的多少,取决于图中的外部门(external gate)所被施加的电压,其控制了是向存储单元中冲入电荷还是使其释放电荷。而数据的表示,以所存储的电荷的电压是否超过一个特定的阈值Vth来表示。

【SLC和MLC的实现机制】

Nand Flash按照内部存储数据单元的电压的不同层次,也就是单个内存单元中,是存储1位数据,还是多位数据,可以分为SLC和MLC:

1.SLC,Single Level Cell:

单个存储单元,只存储一位数据,表示成1或0.

就是上面介绍的,对于数据的表示,单个存储单元中内部所存储电荷的电压,和某个特定的阈值电压Vth,相比,如果大于此Vth值,就是表示1,反之,小于Vth,就表示0.

对于nand Flash的数据的写入1,就是控制External Gate去充电,使得存储的电荷够多,超过阈值Vth,就表示1了。而对于写入0,就是将其放电,电荷减少到小于Vth,就表示0了。

关于为何Nand Flash不能从0变成1,我的理解是,物理上来说,是可以实现每一位的,从0变成1的,但是实际上,对于实际的物理实现,出于效率的考虑,如果对于,每一个存储单元都能单独控制,即,0变成1就是,对每一个存储单元单独去充电,所需要的硬件实现就很复杂和昂贵,同时,所进行对块擦除的 *** 作,也就无法实现之前的,一闪而过的速度了,也就失去了Flash的众多特性了。

2.MLC,Multi Level Cell:

与SLC相对应,就是单个存储单元,可以存储多个位,比如2位,4位等。其实现机制,说起来比较简单,就是,通过控制内部电荷的多少,分成多个阈值,通过控制里面的电荷多少,而达到我们所需要的存储成不同的数据。比如,假设输入电压是Vin=4V(实际没有这样的电压,此处只是为了举例方便),那么,可以设计出2的2次方=4个阈值, 1/4 的Vin=1V,2/4的Vin=2V,3/4的Vin=3V,Vin=4V,分别表示2位数据00,01,10,11,对于写入数据,就是充电,通过控制内部的电荷的多少,对应表示不同的数据。

对于读取,则是通过对应的内部的电流(与Vth成反比),然后通过一系列解码电路完成读取,解析出所存储的数据。这些具体的物理实现,都是有足够精确的设备和技术,才能实现精确的数据写入和读出的。

单个存储单元可以存储2位数据的,称作2的2次方=4 Level Cell,而不是2 Level Cell,这点,之前差点搞晕了。。。,同理,对于新出的单个存储单元可以存储4位数据的,称作 2的4次方=16 Level Cell。

【关于如何识别SLC还是MLC】

Nand Flash设计中,有个命令叫做Read ID,读取ID,意思是读取芯片的ID,就像大家的身份z一样,这里读取的ID中,是读取好几个字节,一般最少是4个,新的芯片,支持5个甚至更多,从这些字节中,可以解析出很多相关的信息,比如此Nand Flash内部是几个芯片(chip)所组成的,每个chip包含了几片(Plane),每一片中的页大小,块大小,等等。在这些信息中,其中有一个,就是识别此flash是SLC还是MLC。下面这个就是最常见的Nand Flash的datasheet中所规定的,第3个字节,3rd byte,所表示的信息,其中就有SLC/MLC的识别信息:

表1.Nand Flash 第3个ID的含义

【Nand Flash的物理存储单元的阵列组织结构】

Nand flash的内部组织结构,此处还是用图来解释,比较容易理解:

图2.Nand Flash物理存储单元的阵列组织结构

上图是K9K8G08U0A的datasheet中的描述。

简单解释就是:

1.一个nand flash由很多个块(Block)组成,块的大小一般是128KB,256KB,512KB,此处是128KB。

2.每个块里面又包含了很多页(page)。每个页的大小,对于现在常见的nand flash多数是2KB,更新的nand flash是4KB,这类的,页大小大于2KB的nand flash,被称作big block,对应的发读写命令地址,一共5个周期(cycle),而老的nand flash,页大小是256B,512B,这类的nand flash被称作small block,。地址周期只有4个。

而块,也是Nand Flash的擦除 *** 作的基本/最小单位。

3.每一个页,对应还有一块区域,叫做空闲区域(spare area)/冗余区域(redundant area),而Linux系统中,一般叫做OOB(Out Of Band),这个区域,是最初基于Nand Flash的硬件特性:数据在读写时候相对容易错误,所以为了保证数据的正确性,必须要有对应的检测和纠错机制,此机制被叫做EDC(Error Detection Code)/ECC(Error Code Correction, 或者 Error Checking and Correcting),所以设计了多余的区域,用于放置数据的校验值。

页是Nand Flash的写入 *** 作的基本/最小的单位。

【Nand Flash数据存储单元的整体架构】

简单说就是,常见的nand flash,内部只有一个chip,每个chip只有一个plane。

而有些复杂的,容量更大的nand flash,内部有多个chip,每个chip有多个plane。这类的nand flash,往往也有更加高级的功能,比如下面要介绍的Multi Plane Program和Interleave Page Program等。

比如,型号为K9K8G08U0A这个芯片(chip),内部有两个K9F4G08U0A,每个K9F4G08U0A包含了2个Plane,每个Plane是1Gb,所以K9F4G08U0A的大小是1Gb×2=2Gb=256MB,因此,K9K8G08U0A内部有2个K9F4G08U0A,即4个Plane,总大小是4×256MB=1GB。

而型号是K9WAG08U1A的nand flash,内部包含了2个K9K8G08U0A,所以,总容量是K9K8G08U0A的两倍=1GB×2=2GB,类似地K9NBG08U5A,内部包含了4个K9K8G08U0A,总大小就是4×1GB=4GB。

【Flash名称的由来】

Flash的擦除 *** 作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次性地将一个block,常见的块的大小是128KB/256KB。。,全部擦除为1,也就是里面的内容全部都是0xFF了,由于是一下子就擦除了,相对来说,擦除用的时间很短,可以用一闪而过来形容,所以,叫做Flash Memory。中文有的翻译为 (快速)闪存。

【Flash相对于普通设备的特殊性】

1. 上面提到过的,Flash最小 *** 作单位,有些特殊。

一般设备,比如硬盘/内存,读取和写入都是以bit位为单位,读取一个bit的值,将某个值写入对应的地址的位,都是可以按位 *** 作的。

但是Flash由于物理特性,使得内部存储的数据,只能从1变成0,这点,可以从前面的内部实现机制了解到,只是方便统一充电,不方便单独的存储单元去放电,所以才说,只能从1变成0,也就是释放电荷。

所以,总结一下Flash的特殊性如下:

表2.Flash和普通设备相比所具有的特殊性

注:

① 之所以将写 *** 作叫做编程,是因为,flash 和之前的EPROM,EEPROM继承发展而来,而之前的EEPROM(Electrically Erasable Programmable Read-Only Memory),往里面写入数据,就叫做编程Program,之所以这么称呼,是因为其对数据的写入,是需要用电去擦除/写入的,就叫做编程。

② 对于目前常见的页大小是2K/4K的Nand Flash,其块的大小有128KB/256KB/512KB等。而对于Nor Flash,常见的块大小有64K/32K等。

③在写数据之前,要先擦除,内部就都变成0xFF了,然后才能写入数据,也就是将对应位由1变成0。

【Nand Flash引脚(Pin)的说明】

图3.Nand Flash引脚功能说明

上图是常见的Nand Flash所拥有的引脚(Pin)所对应的功能,简单翻译如下:

1. I/O0 ~ I/O7:用于输入地址/数据/命令,输出数据

2. CLE:Command Latch Enable,命令锁存使能,在输入命令之前,要先在模式寄存器中,设置CLE使能

3. ALE:Address Latch Enable,地址锁存使能,在输入地址之前,要先在模式寄存器中,设置ALE使能

4. CE#:Chip Enable,芯片使能,在 *** 作Nand Flash之前,要先选中此芯片,才能 *** 作

5. RE#:Read Enable,读使能,在读取数据之前,要先使CE#有效。

6. WE#:Write Enable,写使能, 在写取数据之前,要先使WE#有效。

7. WP#:Write Protect,写保护

8. R/B#:Ready/Busy Output,就绪/忙,主要用于在发送完编程/擦除命令后,检测这些 *** 作是否完成,忙,表示编程/擦除 *** 作仍在进行中,就绪表示 *** 作完成.

9. Vcc:Power,电源

10. Vss:Ground,接地

11. N.C:Non-Connection,未定义,未连接。

[小常识]

 

在数据手册中,你常会看到,对于一个引脚定义,有些字母上面带一横杠的,那是说明此引脚/信号是低电平有效,比如你上面看到的RE头上有个横线,就是说明,此RE是低电平有效,此外,为了书写方便,在字母后面加“#”,也是表示低电平有效,比如我上面写的CE#;如果字母头上啥都没有,就是默认的高电平有效,比如上面的CLE,就是高电平有效。

【为何需要ALE和CLE】

突然想明白了,Nand Flash中, 为何设计这么多的命令,把整个系统搞这么复杂的原因了:

比如命令锁存使能(Command Latch Enable,CLE) 和 地址锁存使能(Address Latch Enable,ALE),那是因为,Nand Flash就8个I/O,而且是复用的,也就是,可以传数据,也可以传地址,也可以传命令,为了区分你当前传入的到底是啥,所以,先要用发一个CLE(或ALE)命令,告诉nand Flash的控制器一声,我下面要传的是命令(或地址),这样,里面才能根据传入的内容,进行对应的动作。否则,nand flash内部,怎么知道你传入的是数据,还是地址,还是命令啊,也就无法实现正确的 *** 作了.

【Nand Flash只有8个I/O引脚的好处】

1.减少外围引脚:相对于并口(Parellel)的Nor Flash的48或52个引脚来说,的确是大大减小了引脚数目,这样封装后的芯片体积,就小很多。现在芯片在向体积更小,功能更强,功耗更低发展,减小芯片体积,就是很大的优势。同时,减少芯片接口,也意味着使用此芯片的相关的外围电路会更简化,避免了繁琐的硬件连线。

2.提高系统的可扩展性,因为没有像其他设备一样用物理大小对应的完全数目的addr引脚,在芯片内部换了芯片的大小等的改动,对于用全部的地址addr的引脚,那么就会引起这些引脚数目的增加,比如容量扩大一倍,地址空间/寻址空间扩大一倍,所以,地址线数目/addr引脚数目,就要多加一个,而对于统一用8个I/O的引脚的Nand Flash,由于对外提供的都是统一的8个引脚,内部的芯片大小的变化或者其他的变化,对于外部使用者(比如编写nand flash驱动的人)来说,不需要关心,只是保证新的芯片,还是遵循同样的接口,同样的时序,同样的命令,就可以了。这样就提高了系统的扩展性。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/6113442.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-15
下一篇2023-03-15

发表评论

登录后才能评论

评论列表(0条)

    保存