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.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初始化

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

  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应用开发手册

时间: 2024-08-11 16:50:55

SylixOS nand驱动框架理解的相关文章

驱动框架理解

概述 API在某个头文件中定义,被封装在某个DLL中,而这个DLL会进一步被封装在ntdll.dll中(它里面的API叫native api),比如,ReadFile在ntdll.dll中就对应着ntReadFile;然后这个API会通过sysenter的方式进入内核层. 那么,比如对于CreateFile的执行参数,必须告知内核,而这些参数就被封装在IRP中.IRP是一个结构体,它封装了应用层传下的命令和数据. 驱动拿到IRP并进行处理,并把处理结果返回给应用层. 现在随意附加到一个进程当中,

SylixOS下基于NUC970的NAND驱动

开发环境 开发环境 宿主机: Windows7 64bits 系统 开发板: 安米MDK972 软件环境: RealEvo-IDE3.0 NAND Flash: S34ML02G100TF100 S34ML02G100TF100芯片参数 Density:2 Gbit Input / Output Bus Width: 8-bits Page Size:2112 (2048 + 64) bytes; 64 bytes is spare area Block Size: 64 Pages;128k

SylixOS网卡驱动调用篇

1. 开发环境 操作系统:SylixOS 编程环境:RealEvo-IDE3.1 硬件平台:IMX6Q实验箱 2. 技术实现 <SylixOS网卡驱动框架篇>里提过,网卡驱动的收发功能是通过netdev结构里的transmit和receive两个成员实现的.本篇文章将介绍SylixOS里的LWIP协议栈是如何调用底层网卡驱动里的这两个成员函数的. 2.1      网卡发送函数的调用 整个网卡驱动发送函数的调用关系如图 21所示. 网卡驱动在向SylixOS注册网卡驱动时,需要调用netdev

SylixOS字符设备驱动框架

1.概述 本文档主要介绍SylixOS中字符设备驱动框架,适用于在SylixOS集成开发环境下进行字符设备驱动开发的学习. 注:文中xxx是指具体设备名,编写对应驱动时,自行命名(如RTC.COMPASS等). 2.SylixOS字符设备驱动简介 字符设备是指只能以字节为单位进行读写的设备,读取数据需按照先后顺序,不能随机读取设备内存中某一数据.常见的字符设备如:鼠标.键盘.串口等. 在SylixOS中,每个字符设备都会在/dev目录下对应一个设备文件,用户程序可通过设备文件(或设备节点)来使用

块设备驱动框架详解

一.正确的理解块设备驱动的概念 1.块设备和字符设备的差异 (1)块和字符是两种不同的访问设备的策略 (2)同一个设备可以同时支持块和字符两种访问策略 (3)设备本身的物理特性决定了哪一种访问策略更适合 (4)块设备本身驱动层支持缓冲区,而字符设备驱动层没有缓冲 (5)块设备驱动最适合存储设备 2.块设备驱动的特点 (1)字符设备只能顺序访问(如串口发送数据顺序),而块设备可以随机访问(不连续块访问). (2)传统的机械式块设备(如硬盘.DVD)虽然可以随机访问,但是连续访问效率更高,因此块设备

MTK平台LCD驱动框架详解(一)

许多学习嵌入式的进入MTK开发平台,很多东西都会感到很陌生.在MTK平台上你可以简简单单几分钟就点亮一块屏.加上MTK快速开发的节奏,也很少有时间自己整理学习.如果不思进取,不加班加点学习.很容易就慢慢--.这也难怪有些人说MTK造就了一批懒人,毁掉了一批工程师.但其实都是基于linux开发,核心的东西都是一样一样的.我刚入行业,在迷茫之际,自己整理跟踪源码.想慢慢找回自己熟悉的感觉,掌握MTK的整体框架.也希望能给有需要的人带来些帮助.好吧!前话说到这,开始正题. 本文肯定有不少地方会出现错误

【智能家居篇】wifi驱动的理解(1)——驱动架构

转载请注明出处:http://blog.csdn.net/Righthek 谢谢! 在分析WIFI驱动前,分享一下个人对Linux驱动的一些了解,其实纵观Linux众多的设备驱动,几乎都是以总线为载体,所有的数据传输都是基于总线形式的,即使设备没有所谓的总线接口,但是Linux还是会给它添加一条虚拟总线,如platform总线等:介于WIFI的驱动实在是太庞大了,同时又是基于比较复杂的USB总线,所以建议读者在看此文章之前,先了解一下USB设备驱动和网络设备驱动. 我们要看懂WIFI驱动,首先要

Linux USB驱动框架分析 【转】

转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结当然不可缺,更何况我决定为嵌入式卖命了.好,言归正传,我说一说这段时间的收获,跟大家分享一下Linux的驱动开发.但这次只先针对Linux的USB子系统作分析,因为周五研讨老板催货.当然,还会顺带提一下其他的驱动程序写法. 事实上,Linux的设备驱动都遵循一个惯例——表征驱动程序(用driver更

Linux USB驱动框架分析(2)【转】

转自:http://blog.chinaunix.net/uid-23046336-id-3243543.html 看了http://blog.chinaunix.net/uid-11848011-id-96188.html的驱动框架分析,感觉受益匪浅.对于一些内容,我自己查漏补缺. 首先我们按照顺序,看内核模块的注册以及释放函数如下: 点击(此处)折叠或打开 static int __init usb_skel_init(void) { int result; /* register this