NANDFlash的驱动程序设计措施 .docx
精品名师归纳总结NAND Flash 的驱动程序设计方案以三星公司 K9F2808UOB为例,设计了 NAND Flash与 S3C2410的接口电路 ,介绍了 NAND Flash在 ARM嵌入式系统中的设计与实现方法 , 并在 UBoot 上进行了验证。所设计的驱动易于移植,可简化嵌入式系统开发。关键词ARMUBootNAND FlashK9F2808UOB驱动程序引言当前各类嵌入式系统开发设计中,储备模块设计是不行或缺的重要方面。NOR和 NAND是目前市场上两种主要的非易失闪存技术。NOR Flash储备器的容量较小、写入速度较慢,但因其随机读取速度快,因此在嵌入式系统中,常用于程序代码的储备。与 NOR相比,NAND闪存的优点是容量 大, 但其速度较慢, 由于它的 I/O 端口只有 8 或 16 个, 要完成的址和数据的传输就必需让这些信号轮番传送。 NAND型 Flash 具有极高的单元密度 , 容量 可以比较大 , 价格相对廉价。本文以三星公司的 K9F2808UOB芯片为例 , 介绍了 NAND Flash的接口电路与驱动的设计方法。文中介绍了开发 NAND Flash驱动基本原理,意在简化嵌入式系统开发过程。1 NAND Flash 工作原理S3C2410板的 NAND Flash支持由两部分组成:集成在 S3C2410 CPU上的 NAND Flash掌握器和 NAND Flash储备芯片。要拜访 NAND Flash中的数据 , 必需通过 NAND Flash 掌握器发送命令才能完成。所以, NAND Flash 相当于 S3C2410的一个外设, 并不位于它的内存的址区。1.1 芯片内部储备布局及储备操作特点一片 NAND Flash为一个设备 ,其数据储备分层为: 1 设备=4 096 块。 1 块=32 页。1 页=528 字节=数据块大小 512 字节+OOB块大小 16 字节 。在每一页中,最终 16 字节(又称 OOB, OutofBand)用于 NAND Flash命令执行完后设置状态用,剩余512 字节又分为前半部分和后半部分。可以通过NAND Flash 命令 00h/01h/50h 分别对前半部、后半部、 OOB进行定位,通过 NAND Flash 内置的指针指向各自的首的址。储备操作特点有: 擦除操作的最小单位是块。 NAND Flash芯片每一位只能从 1 变为 0,而不能从 0 变为 1,所以在对其进行写入操作之前肯定要将 相应块擦除 擦除即是将相应块的位全部变为 1 。 OOB部分 的第 6 字节 即 517可编辑资料 - - - 欢迎下载精品名师归纳总结字节 标志是否是坏块,值为 FF 时不是坏块,否就为坏块。除 OOB第 6 字节外,通常至少把 OOB的前 3 字节用来存放 NAND Flash硬件 ECC码。1.2 NAND Flash 接口电路第一介绍开发板的硬件设计,图 1 为 NAND Flash接口电路。其中开关SW的 1、2 连接时 R/B 表示预备好 / 忙, 2、3 连接时 nWAIT可用于增加读 / 写拜访的额外等待周期。在 S3C2410处 理器中已经集成了 NAND Flash掌握器,图2 为微掌握器与 NAND Flash连接的方式。图 1NAND Flash 接口电路1.3 掌握器工作原理NAND Flash掌握器在其专用寄存器区 SFR的址空间中映射有属于自己的特别功能寄存器,就是通过将NAND Flash芯片的内设命令写到其特别功能寄存器中,从而实现对NAND Flash芯片读、检验和编程掌握。特别功能寄存器可编辑资料 - - - 欢迎下载精品名师归纳总结有: NFCON、F NFCM、D NFADD、R NFDAT、ANFSTA、TNFEC。C可编辑资料 - - - 欢迎下载精品名师归纳总结图 2NAND Flash 与 S3C2410连接电路2 Flash烧写程序原理及结构可编辑资料 - - - 欢迎下载精品名师归纳总结基本原理:将在 SDRAM中的一段储备区域中的数据写到 NAND Flash储备空间中。烧写程序在纵向上分三层完成。第一层:主烧写函数,将 SDRAM中一段储备区域的数据写到 NAND Flash储备空间中。其次层 :该层供应对 NAND Flash 进行操作的页读、写及块擦除等函数。第三层:为其次层供应具体NAND Flash 掌握器中对特别功能寄存器进行操作的核心函数,该层也是真正将数据在 SDRAM和 NAND Flash之间实现传送的函数。其中其次层为驱动程序的设计关键所在,下面对该层的读、写 又称编程 、擦除功能编码进行具体介绍。2.1 NAND Flash Read功能:读数据操作以页为单位 , 读数据时第一写入读数据命令 00H,然后输入要读取页的的址 , 接着从数据寄存器中读取数据 , 最终进行 ECC校验。参数说明: block ,块号。 page,页号。 buffer ,指向将要读取到内存中的起始位置。返回值1,读胜利,返回值 0:读失败。static int NF_ReadPageunsigned int block, unsigned int page, unsigned char *bufferNF_RSTECC。 /*初始化 ECC */NF_nFCE_L。 /*片选 NAND Flash芯片*/NF_CMD0x00。/*从 A 区开头读 */* A0A7列的址 */NF_ADDR0。/* A9A16页的址 */NF_ADDRblockPage&0xff。 /* A17A24,页的址 */ NF_ADDRblockPage>>8&0xff 。/* A25, 页的址 */NF_ADDRblockPage>>16&0xff 。/*等待 NAND Flash处于再预备状态 */ReadPage。/*读整个页 , 512 字节 */ReadECC。/*读取 ECC码 */ReadOOB。 /*读取该页的 OOB块 */*取消 NAND Flash 选中*/NF_nFCE_H。 /*校验 ECC码,并返回 */Return checkEcc2.2 NAND Flash Program可编辑资料 - - - 欢迎下载精品名师归纳总结功能:对页进行编程命令 ,用于写操作。命令代码:第一写入 00hA 区/01hB 区/05hC 区, 表示写入那个区。 再写入 80h 开头编程模式 写入模式 ,接下来写入的址和数据。 最终写入 10h 表示编程终止。图 3 为程序流程图。图 3写程序流程参数说明: block ,块号。 page,页号。 buffer ,指向内存中待写入NAND Flash中的数据起始位置。返回值 0,写错误,返回值 1,写胜利。static int NF_WritePageunsigned int block, unsigned int page, unsigned char *bufferNF_RSTECC。 /*初始化 ECC */NF_nFCE_L。 /*片选 NAND Flash芯片*/NF_CMD0x0。/*从 A 区开头写 */NF_CMD0x80。/*写第一条命令 */* A0A7列的址 */NF_ADDR0。 /* A9A16 页的址 */NF_ADDRblockPage&0xff。/* A17A24 页的址 */ NF_ADDRblockPage>>8&0xff 。 /* A25页的址 */可编辑资料 - - - 欢迎下载精品名师归纳总结NF_ADDRblockPage>>16&0xff 。/*写页为 512B 到 NAND Flash芯片 */WRDATA。 /*OOB 一共 16 字节,每一个字节存放什么由程序员自己定义,在 Byte0 Byte2存 ECC检验码, Byte6 存放坏块标志 */WRDATA。 /*写该页的 OOB数据块 */CMD0x10。 /*终止写命令 */WAITRB。/*等待 NAND Flash处于预备状态 */*发送读状态命令给 NAND Flash */CMD0x70。if RDDATA&0x1 /*假如写有错 ,就标示为坏块 , 取消 NAND Flash选中*/MarkBadBlockblock。return 0。 else /*正常退出, 取消 NAND Flash 选中*/ return 1。2.3 NAND Flash Erase功能:块擦除命令。命令代码:第一写入 60h 进入擦写模式,然后输入块的址,接下来写入 D0h, 表示擦写终止。参数说明: block ,块号。返回值 0,擦除错误(如是坏块直接返回0。如擦除显现错误就标记为坏块然后返回0),返回值 1,胜利擦除。static int NF_EraseBlockunsigned int block/*假如该块是坏块 ,就返回 */ifNF_IsBadBlockblock return 0。NF_nFCE_L。 /*片选 NAND Flash芯片*/可编辑资料 - - - 欢迎下载精品名师归纳总结NF_CMD0x60。基于块擦除 */*设置擦写模式 */* A9A16Page Address ,是可编辑资料 - - - 欢迎下载精品名师归纳总结NF_ADDRblockPage&0xff。NF_ADDRblockPage>>8&0xff 。 /* A25Page Address */NF_ADDRblockPage>>16&0xff 。 NF_CMD0xd0。 WAITRB。CMD0x70。ifRDDATA&0x1/*如有错, 标为坏块 , 取消 Flash 选中*/ MarkBadBlockblock。return 0。 else /*退出, 取消 Flash选中*/ return 1。3 ECC校检原理与实现由于 NAND Flash的工艺不能保证 NAND的 Memory Array 在其生命周期中保持性能牢靠,因此在 NAND的生产及使用过程中会产生坏块。为了检测数据的牢靠性,在应用 NAND Flash的系统中一般都会采纳肯定的坏区治理策略,而治理坏区的前提是能比较牢靠的进行坏区检测。假如操作时序和电路稳固性不存在问题的话, NAND Flash出错的时候一般不会造成整个块或是页不能读取或全部出错,而是整个页(例如 512 字节)中只有一位或几位出错。对数据的校验常用的有奇偶校验、 CRC校验等,而在 NAND Flash处理中,一般使用一种专用的校验 ECC。ECC能订正单位错误和检测双位错误,而且运算速度很快,但对 1 位以上的错误无法订正,对 2 位以上 的错误不保证能检测。 ECC一般每 256 字节原始数据生成 3 字节 ECC校验数据,这 3 字节共 24 位分成两部分: 6 位的列校验和 16 位的行校验,余外的 2 位 置 1,如表 1 所列。表 1校检数据组成第一介绍 ECC的列校检。 ECC的列校验和生成规章如图 4 所示,“ ” 表示“位异或”操作。由于篇幅关系,行校检不作介绍,感爱好的读者可以参考芯片 datasheet ,在三星公司网站可以免费下载。可编辑资料 - - - 欢迎下载精品名师归纳总结图 4列校验和生成规章数学表达式为:当向 NAND Flash的页中写入数据时,每256 字节生成一个 ECC校验和,称之为原 ECC校验和,储存到页的 OOB数据区中。当从 NAND Flash中读取数据时,每 256 字节生成一个 ECC校验和,称之为新 ECC校验和。校验的时候,依据上述 ECC生成原理不难推断:将从 OOB区中读出的 原 ECC校验和与新ECC校验和按位异或,如结果为 0,就表示无错(或者显现了 ECC无法检测的错误)。如 3 字节异或结果中存在 11 位为 1,表示存在一个位错误,且可订正。如 3 个字节异或结果中只存在1 位为 1,表示 OOB区出错。其他情形均表示显现了无法订正的错误。4 UBOOT下功能验证实现 UBOOT对 NAND Flash的支持主要是在命令行下实现对 NAND Flash 的操作。对 NAND Flash实现的命令为: nand info、nand device 、nand read 、nand write、nand erease 、nand bad 。用到的主要数据结构有: struct nand_flash_dev和 struct nand_chip,前者包括主要的芯片型号、储备容量、 设备 ID、I/O 总线宽度等信息,后者是对 NAND Flash进行具体操作时用到的信息。由于将驱动移植到UBoot 的方法不是本文重点,故不作具体介绍。验证方式:通过 TFTP将数据下载到 SDRAM中,利用 nand read 、nand write 、nand erease 三个命令对 NAND Flash进行读、编程、擦写测试。测试可编辑资料 - - - 欢迎下载精品名师归纳总结结果如表 2 所列。和 datasheet中数据对比,可以得出结论,驱动在系统中运行良好。表 2测试结果结语现在嵌入式系统应用越来越广泛,而储备器件又是嵌入式系统必不行少的一部分, NAND Flash在不超过 4 GB容量的需求下,较其他储备器件优势明显。本文所设计的驱动并未基于任何操作系统,可以便利的移植到多种操作 系统和 Boot Loader下,对于简化嵌入式系统开发有肯定的实际意义。可编辑资料 - - - 欢迎下载