首页 > 代码库 > SylixOS nand驱动框架理解

SylixOS nand驱动框架理解

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.2SylixOSnand的驱动框架

2.2.1整体框架

SylixOSnand的整体框架如图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初始化

驱动需要定义两个重要的结构体:

  1. 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

SylixOS nand驱动框架理解