1.适用范围
该应用笔记适用于帮助用户在SylixOS下使用nandflash器件。
2.原理概述
2.1nandflash存储结构
nandflash存储结构如图2-1所示,下面以mini2440开发板上的k9f1g08系列nandflash为例,简单介绍nandflash的存储结构。
图2-1 nandflash存储结构
nandflash的存储结构主要有两个单位:页(page),块(block)。每页大小为2K+64字节,2K用来存储数据,64字节用来存储控制信息(OOB区,例如坏块信息、ECC校验),每块大小为64页。整个nand有2048个块组成,所以mini2440中的nand大小为:(2K+64)*64*2048=228B=256MB。
nand的地址编排精确到字节,但是实际读写却只能精确到页,并且每次写之前都需要擦除nand,擦除的单位是块。nand读写时地址传递是通过IO线发送的,因为地址有30位而IO只有8位,所以需要多个cycle(循环)才能发送完毕。一般的nand都是4cycle或者5cycle发送地址。
2.2SylixOS下nand的驱动框架
2.2.1整体框架
SylixOS下nand的整体框架如图2-2所示:
图2-2 nand总体框架
2.2.2MTD设备
nandflash与传统块设备相似,都是存储设备,但又有所不同。比如块设备不区分写和擦除操作,也没有OOB区。这些区别决定了系统需要一种特殊的设备来抽象nandflash设备,简化驱动开发,这就是MTD设备,MTD既不属于块设备也不属于字符设备。
MTD是memory technology Device的缩写。MTD支持类似于内存的存储器,它是底层硬件和上层软件之间的桥梁。对底层来说,它无论对norflash或是nandflash都有很好的驱动支持。对上层来说,它抽象出文件系统所需要的接口函数。有了MTD,编写nandflash的驱动变得十分轻松,因为上层的架构都已经做好,驱动编写者只用参考nandflash的datasheet写最底层的硬件初始化即可。
2.2.3nand通用层
Nand_chip是nand通用层的核心结构体,它与nand芯片密切相关,主要包含两方面内容:
1、对nand芯片进行实际操作的函数,包括读、写、擦除等函数。
2、nand芯片特性的成员变量,包括页大小、块大小、坏块信息位置等。
2.2.4yaffs2文件系统层
yaffs2文件系统是一个专门为nandflash设计的嵌入式型文件系统提供磨损平衡和掉电恢复的健壮性。yaffs2与MTD设备的连接是通过yaffs_dev结构体来完成的。一个yaffs_dev结构体表示一个yaffs分区。
2.3代码实现
在mini2440 BSP驱动里面,nand挂载到yaffs2文件系统由三个*.c文件实现。
如图2-3所示:
图2-3 nand驱动文件
各个*.c文件的作用分别是:
s3c24xx_nand.c函数实现nand控制器硬件的初始化。
nand.c是将nand封装成mtd设备。
k9f1g08.c是调用MTD提供的函数读取nand的信息,并将其挂载到yaffs2文件系统下。
2.3.1封装MTD设备
nand驱动的代码由nand_init函数开始,调用nand_init_chip函数初始化nand芯片,函数里主要调用如图2-4、图2-5所示的三个函数来实现具体初始化的步骤。
图2-4 nand芯片初始化
图2-5 nand初始化
驱动需要定义两个重要的结构体:
mtd_info 表示了一个MTD设备。2.nand_chip表示了一个nand设备。将nand_chip结构体放到mtd_info结构体下,以完成mtd_info结构体封装。
图2-4的三个函数主要是对以上两个结构体的初始化。下面介绍三个函数的主要功能:
board_nand_init函数实现nandfalsh控制器的初始化和相关时间参数的设置;并填充nand_chip结构体下的两个操作函数。如图2-6所示:
图2-6 nand_chip的操作函数
cmd_ctrl函数作用:想要对nandflash进行读写擦除等操作,必须要先选中nandflash并向其发送相应的命令和地址,cmd_ctrl函数完成上述功能。
向nandflash写完数据后,要等待一段时间,直到nandflash运行就绪,dev_ready函数用来判断nandflash是否运行就绪。
nand_scan函数用来填充nand_chip结构体和mtd_info结构体。主要操作如图2-6所示:
图2-7 nand_scan函数
nand_register函数调用核心层提供的函数add_mtd_device函数将MTD加入到MTD核心层(mtd_table数组中),这样nandflash就被封装成了MTD设备。
2.3.2MTD设备挂载到yaffs2文件系统
yaffs_dev结构体表示了yaffs2文件系统的一个分区。这里面封装了对nand分区的参数、nand硬件信息以及mtd_info结构体下的操作函数,mini2440的驱动中将nand分成了两个区,一个是boot区,主要存放设备固件及一些常用配置文件;一个是comm区,主要存放通用文件。如图2-7所示:
图2-8 yaffs2分区
对yaffs_dev填充,如图2-9所示:
图2-9 yaffs_dev封装
封装好之后只需执行下面三个函数数,即可完成挂载,如图2-10所示。
图2-10 分区挂载
注意:yaffs文件系统的分区在驱动里已经分好,不能再用fdisk再进行分区。
3.参考资料
SylixOS应用开发手册
本文出自 “11614185” 博客,请务必保留此出处http://11624185.blog.51cto.com/11614185/1895194
原文地址:http://11624185.blog.51cto.com/11614185/1895194