从物理层,逻辑层和驱动文件系统接口层分析NAND FLASH驱动程序的实现

2019-01-28 13:50:49 来源:网络
标签:

 

1 引言

随着U盘、数码相机、mp3音乐播放器等移动设备的广泛应用,FLASH存储器已经逐步取代其它半导体存储元件,成为嵌入式系统中主要数据和程序的载体。NAND FLASH是一种可在线多次擦除的非易失性存储器,其结构提供了极高的单元密度,可以达到数据的高密度存储,并且写入和擦除的速度也很快,所以 NAND FLASH是高密度数据存储的理想[2] 。本文主要从物理层逻辑层驱动文件系统接口层三个方面具体分析NAND FLASH驱动程序的实现。


2 物理层驱动实现

NAND芯片的存储空间是按照块和页的概念来组织的。现在市面上的NAND主要按大页和小页两种存储类型来进行数据管理。本文采用的NAND型号是K9F1G08X0A,该NAND为大页结构,即芯片每块()有64页(Page),每页有2K 的数据存储区和64的冗余数据区(用来存放ECC校验码)。2K 的数据存储区作为数据缓冲单元,用来实现I/0缓冲和存储器之间的数据传输。芯片的存储阵列组织如图1所示。

 

NAND FLASH的物理层驱动主要涉及到:NAND的初始化(ID以及相关属性信息的读取)、擦除(以块作为单位),数据读写(以页作为基本单位)。在这一系列的过程中,会涉及到NAND命令的发送以及NAND地址的发送。其中地址的发送会因NAND型号的不同而有所区别。一般来说,小页的NAND其地址周期通常为4个:1个列地址(Column Address)和3个行地址(Row Address),而对大页的NAND来说,列地址至少是2个周期,行地址会因芯片的容量大小而有所区别。本文采用的三星NAND芯片是2个列地址和2个行地址。对于NAND FLASH 来讲,地址和命令只能在I/O[7:0]上并行传递。NAND FLASH 以页为单位读写数据,而以块为单位擦除数据。NAND的数据传输方式有基本的I/O传输方式,即在I/O[7:0]数据线上进行的数据传输。这种操作的缺点是系统CPU要频繁参与控制数据的传输,会影响到数据传输速度。本文采用DMA传输方式,数据宽度是8/16/32bit,通过中断的形式通知CPU数据的传输情况,DMA传输主要涉及DMA 控制器的配置以及通道的选择。

 

3 逻辑层驱动实现以及坏块管理机制

3.1 逻辑基本读写操作

驱动逻辑层的主要任务是整合物理层的驱动,并为文件系统驱动层提供接口。在该层中主要涉及的操作包括NAND 的逻辑读、写以及擦除。逻辑层对NAND 的操作都是以块()作为单位来进行操作的。因此须在逻辑层中构建一个块缓存( Buffer)来临时存放读出/写入NAND 的数据。这样,NAND 的读取机制分为两种:页读取(Page )和块读取(Block)。在页读取时,通过坏块表进行索引指定块(Block)和页(Page)来进行数据读操作,而块读取时则是通过整合页读取时的缓存数据,把NAND 的数据以块的形式进行缓存(BlockBuffer)。NAND 的写入机制不像其它的FLASH 器件,NAND 要求在写入数据时,首先必须进行数据的擦除。因此我们在写数据的时候,先把将要被写入的数据块的内容读出到块缓存,然后再把要写入NAND 的数据以页为单位的形式写入块缓存(Block Buffer)中的对应地址。接着把以前存放数据的块进行擦除操作,最后把更新的数据写到NAND 去。经过这一系列的操作,实现了NAND 数据的逻辑写入。图2 说明了一次写操作的具体流程。

3.2 坏块管理机制的原理及实现

 

NAND 由于采用了高密集的存储单元,在使用过程中难免会损坏一些存储单元,这就是我们所说的坏块[3]。数据操作时应该避免对这些坏块进行操作,否则会引起数据的错误。

 

一般而言,NAND 的第0 块常被用来作为程序的引导区,因此NAND 芯片厂商会保证第0块不会成为坏区。而作为0 块以后的数据存储块,当坏块产生时,系统级的设计必须能够用地址映射把这些坏块屏蔽掉。芯片在出厂时,除保存坏块信息的区域外,部分一律被擦除(值为0xFF),对坏块的读操作是允许的,但不推荐进行写和擦除操作,以免由于结构方面的原因使邻近的块也失效。系统设计时必须根据初始的坏块信息识别出坏块,并建立坏块列表。进行写或擦除操作时将欲操作块的地址与坏块地址表的地址相比较,若是坏块则应跳过。芯片在使用过程中,可能有新坏块的产生,为了系统的可靠性,必须对此情况加以考虑。

 

在数据写入或块擦除操作后,如果读状态寄存器出现错误,则表示块内有坏页存在,也即表明此块已坏,因为块内坏页的存在并不影响页的读写,这时可采用块操作来把页内有用数据转移到空闲块内,并把坏块信息存入坏块表中。因此,当我们在格式化NAND的时候,要给出一定的区域用来存放坏块索引表和坏块表。考虑到一个块(Block)的大小为128KB,而现在市面上的一般的NAND的容量大小为128MB-2GB不等。故分配10 个块(Block)来进行存储。由于第0 块为用户不可见块,实际要求为1-11 块作为存储空间。图 3 表明了如何建立坏块索引表和坏块表的流程。

 

其中,在坏块索引(BBTINDEX)中,整型变量biTIsBadBlock 中的每一个bit,标记一个块的状态(1 表示坏块,0 表示好块),在ARM 体系中,可以标记32 个块。该区域被称为一个索引区域。整型变量mPosInBBT 表示如果有坏块,则表示索引区域在坏块表中的偏移。

 

这样通过定义一个索引tableTopPos 变量,来指示下一个坏块在数组中的位置。同样在坏块表(BBTENTRY)中,整型变量mBadBlock 标志块是坏块,而mReplaceBlock 变量则表示该坏块在备份区中对应的可以的好块。这样通过定义一个索引bakupTopPos 变量,来指示下一个坏块在备用区的位置。通过结合坏块索引和坏块表,可以对数据进行准确的操作,而每次对NAND 操作完成后,及时地更新坏块索引和坏块表。

 

4 文件系统层的接口实现

现在一般对NAND 支持的文件系统用的最多的是YAFFS 文件系统。本文由于基于的操作系统平台是uC/OS,故采用了uC/FS 文件系统作为NAND 的文件驱动接口,uC/FS 文件系统进行的操作都是基于FAT 文件格式的。对用户来说,所用对NAND 的操作,都是通过文件接口层来完成的。文件接口层对数据的操作都是以扇区(Sector)来进行的。因此,文件接口层的主要任务是把从逻辑层的逻辑操作转化为以扇区(Sector)为单位的操作,文件系统的接口函数主要通过一个结构体 (FS___)来进行描述[4],该结构体包含了驱动设备的名称以及4 个基本的驱动设备挂接函数的函数指针。

 

在这几个函数中,dev_status()函数主要实现FAT 表状态信息的读取,并表明该NAND 设备可以使用;dev_()函数实现对NAND 进行文件系统块数据的读取;dev_write()函数实现对NAND 进行文件系统块数据的写入;dev_()函数则主要实现文件操作的相关指令,包括文件格式化,数据cache 回写等操作。通过这几个文件接口函数,用户可以实现对NAND 进行的数据基本操作。

 

其中,mCache 数组大小为数据读取时的存储大小,由NAND 的文件系统遵循 标准决定,大小为512Byte;mTImes 表示被Cache 的块(Sector)的命中次数,反映了数据块的存取几率;mSectorId 表示被Cache 块(Sector)的序号,通过该序号来对Cache 的数据块进行索引。

 

5 总结

对大容量的 NAND FLASH 进行数据操作,坏块处理机制是很重要的,通过建立坏块处理表,避免了对无效块进行的操作,提高了数据的准确性。另外,ECC 作为NAND 纠错机制,在NAND 驱动中也广泛运用,本文的NAND 驱动中也加入了ECC 机制,由于篇幅有限,不对其进行深入探讨。

 
关注与非网微信 ( ee-focus )
限量版产业观察、行业动态、技术大餐每日推荐
享受快时代的精品慢阅读
 

 

继续阅读
在软件定义的时代,风河公司如何推动创新的步伐?
在软件定义的时代,风河公司如何推动创新的步伐?

风河公司在自治和互联的新要求和新时代下,通过新产品和新技术继续引领潮流,在软件定义的时代推动着创新的步伐,帮助一代代世界技术领军者不断适应安全设备的最严苛要求。

英特尔公布英特尔傲腾混合式固态盘,有啥看点?
英特尔公布英特尔傲腾混合式固态盘,有啥看点?

英特尔今日公布了英特尔傲腾混合式固态盘的详细信息,这款创新的设备采用M.2规格,体积小巧,将英特尔傲腾技术的卓越响应速度与英特尔Quad Level Cell (QLC) 3D NAND技术的强大存储容量融为一体。

英特尔新款企业级SSD竟然长这样?这也太长了吧
英特尔新款企业级SSD竟然长这样?这也太长了吧

在4月3日的英特尔创新产品发布会上,Intel发布了首款E1.L规格的SSD D5-P4326,基于企业级的QLC NAND闪存颗粒,可用容量高达15.36TB、30.72TB。

中国半导体行业未来前景如何?未来会诞生新一代本土半导体公司吗?
中国半导体行业未来前景如何?未来会诞生新一代本土半导体公司吗?

自2014年中国成立国家集成电路产业基金以来,中国集成电路供应链迅速发展,集成电路自给率逐步提高。但在中美贸易摩擦下,中国半导体产业的外部环境进一步恶化,如何形成各环节均衡发展的半导体产业生态是中国面临的重要问题,本期文章将介绍Morgan Stanley对中国半导体行业未来前景的观点。

详解5G新空口中的eMBB/mMTC/URLLC技术
详解5G新空口中的eMBB/mMTC/URLLC技术

提到5G,就能不说NR。5G NR,也就是5G新空口技术。所谓空口,指的是移动终端到基站之间的连接协议,是移动通信标准中一个至关重要的标准。

更多资讯
工程师为室内导航设计出“看不见”的二维码
工程师为室内导航设计出“看不见”的二维码

用于机器人室内导航的隐形二维码。 使用UV或IR照明可读的隐形标签。

英特尔收购Omnitek,只为进军FPGA市场?
英特尔收购Omnitek,只为进军FPGA市场?

4月18日消息,英特尔近日宣布收购了家领先的优化视频和视觉 FPGA IP解决方案提供商 Omnitek。据了解,Omnitek的技术在 FPGA 上实现了定制的高性能视觉和人工智能 (AI) 推理功能,能够满足各个终端市场的客户需求。

音乐也开源,工程师制作电子木管乐器

在当今的数字乐器市场中,MIDI木管乐器控制器的选择非常有限。 该项目旨在将DIY开源版本带到普通制造商可以创建和播放的版块中

芯科科技推出了满足最新一代PCIe 5.0规范的完整时钟解决方案

- Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)日前推出了满足最新一代PCI Express®(PCIe®)5.0规范的完整时钟解决方案组合,能够提供同类最佳的抖动性能,且具有显著的设计余量。

【技术分享】连续分配/固定分配/动态分区分配,浅谈内存分配方式
【技术分享】连续分配/固定分配/动态分区分配,浅谈内存分配方式

说到内存的分配方式,就不得不提连续分配方式。这种方式是指为一个用户程序分配一个连续的内存空间,它曾被广泛的用于20世纪60~70年代的OS中,至今仍被使用。连续分配方式可以进一步分为单一连续分配、固定分配方式、动态分区分配以及动态重定位分配。

电路方案