Linux 下 Nand Flash 驱动说明
注册 driver_register
通过 module_init(s3c2410_nand_init);注册 Nand Flash 驱动. 在 s3c2410_nand_init ()中通过 driver_register()注册
s3c2410_nand_driver 驱动程序,如下所示:
static struct device_driver s3c2410_nand_driver = {
.name = "s3c2410-nand",
.bus = &platform_bus_type, /* 在 drivers/base/platform.c 中定义 */
.probe = s3c2410_nand_probe,
.remove = s3c2410_nand_remove,
};
探测设备 probe
在注册的 Nand Flash 驱动程序中, probe 方法为 s3c2410_nand_probe(). s3c2410_nand_probe()再调用 s3c24xx_nand_probe(). 在该函数中, 把*info 作为 Nand Flash 驱动的私有数据结构, 并通过 dev_set_drvdata(dev, info)把*info 保存在*device 的*driver_data 字段中.然后通过 clk_get(dev, "nand")获取 Nand Flash 的时钟资 源, clk_use(info->clk)增加时钟资源的使用计数, clk_enable(info->clk)开启资源.填写*info 的其它字段, 其中包括:
- 通过 request_mem_region()为 Nand Flash 寄存器区申请 I/O 内存地址空间区,并通过 ioremap()把它映射到虚 拟地址空间.
- 调用 s3c2410_nand_inithw()初始化 Nand Flash 控制器. 3. 为 mtd 设备分配设备信息的存储空间.
4. 对当前 mtd 设备,调用 s3c2410_nand_init_chip()进行初始化.
5. 对当前 mtd 设备, 调用 nand_scan()检测 Nand Flash 芯片, nand_scan()函数在 drivers/mtd/nand/nand_base.c 中 定义.该函数的作用是初始化 struct nand_chip 中一些方法, 并从 Nand Flash 中读取芯片 ID, 并初始化 struct mtd_info 中的方法.
6. 对当前 mtd 设备,加入其分区信息.
7. 如果还有更多 mtd 设备,到 4 执行.
初始化 Nand Flash 控制器
s3c2410_nand_inithw()函数会初始化 Nand Flash 控制器, 通过设置 Nand Flash 控制寄存器(S3C2410_NFCONF)来
完成, 这里最重要的是根据 S3C2410 的 PCLK 计算出 tacls, twrph0 以及 twrph1 值.
移除设备
s3c2410_nand_remove()当设备被移除时,被 device 核心驱动调用.它完成的主要工作如下:
- 把*device 的*driver_data 字段置空.
2. 释放 mtd 设备信息. 3. 释放 clk 资源.
4. 通过 iounmap()取消映地址空间. 5. 释放申请的 I/O 内存资源.
6. 释放设备私有数据*info 的空间.
Nand Flash 芯片初始化
s3c2410_nand_init_chip()初始化 struct nand_chip 中的一些主要字段以及方法.其中主要包括的方法有:
- s3c2410_nand_hwcontrol(); 硬件控制
2. s3c2410_nand_devready(); 设备是否准备好
- s3c2410_nand_write_buf(); 写一个 buffer 到 nand flash
- s3c2410_nand_read_buf(); 读一个 buffer 到 nand flash 5. s3c2410_nand_select_chip(); 选择操作芯片
如果支持 ECC 硬件校验,还设置如下方法:
- s3c2410_nand_correct_data();
通过 ECC 码校正数据 - s3c2410_nand_enable_hwecc();
开启硬件 ECC 检查 - s3c2410_nand_calculate_ecc();
计算 ECC 码
读 Nand
Flash
当对 nand flash 的设备文件(nand flash 在/dev 下对应的文件)执行系统调用 read(),或在某个文件系统中对该 设备进行读操作时. 会调用
struct mtd_info 中的 read 方法,他们缺省调用函数为 nand_read(),在 drivers/mtd/nand/nand_base.c
中定义.nand_read()调用 nand_do_read_ecc(),执行读操作. 在 nand_do_read_ecc()函数中,主要完成如下几项工作:
- 会调用在
nand flash 驱动中对
struct nand_chip 重载的 select_chip 方法,即 s3c2410_nand_select_chip()选择要操作的 MTD 芯片. - 会调用在
struct nand_chip 中系统缺省的方法 cmdfunc 发送读命令到 nand flash. - 会调用在 nand
flash 驱动中对 struct
nand_chip 重载的 read_buf(),即 s3c2410_nand_read_buf() 从 Nand Flash
的控制器的数据寄存器中读出数据. - 如果有必要的话,会调用在 nand
flash 驱动中对 struct
nand_chip 重载的
enable_hwecc,correct_data 以及 calculate_ecc 方法,进行数据 ECC 校验。
写 Nand Flash
当对 nand flash 的设备文件(nand flash 在/dev 下对应的文件)执行系统调用 write(),或在某个文件系统中对该设备 进行读操作时, 会调用
struct mtd_info 中 write 方法,他们缺省调用函数为 nand_write(),这两个函数在
drivers/mtd/nand/nand_base.c 中定义. nand_write()调用 nand_write_ecc(),执行写操作.在
nand_do_write_ecc()函数中,主要完成如下几项工作:
- 会调用在
nand flash 驱动中对
struct nand_chip 重载的 select_chip 方法,即 s3c2410_nand_select_chip()选择要操作的 MTD 芯片. - 调用 nand_write_page()写一个页.
- 在 nand_write_page()中,会调用在 struct
nand_chip 中系统缺省的方法 cmdfunc
发送写命令 到 nand flash. - 在
nand_write_page()中,会调用在 nand flash 驱动中对 struct nand_chip 重载的 write_buf(),即 s3c2410_nand_write_buf()从 Nand
Flash 的控制器的数据寄存器中写入数据. - 在
nand_write_page()中,会调用在 nand flash
驱动中对 struct nand_chip 重载 waitfunc 方法, 该方法调用系统缺省函数 nand_wait(),该方法获取操作状态,并等待 nand flash 操作完成.等
待操作完成,是调用 nand flash 驱动中对 struct nand_chip 中重载的 dev_ready 方法,即
s3c2410_nand_devready()函数.
Linux 下 Nand Flash 驱动说明的更多相关文章
- 如何编写linux下nand flash驱动-4
2. 软件方面 如果想要在Linux下编写Nand Flash驱动,那么就先要搞清楚Linux下,关于此部分的整个框架.弄明白,系统是如何管理你的nand flash的,以及,系统都帮你做 ...
- 如何编写linux下nand flash驱动-2
[Nand Flash引脚(Pin)的说明] 图3.Nand Flash引脚功能说明 上图是常见的Nand Flash所拥有的引脚(Pin)所对应的功能,简单翻译如下: 1. I/O0 ~ ...
- 如何编写linux下nand flash驱动-1
1. 硬件特性: [Flash的硬件实现机制] Flash全名叫做Flash Memory,属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失 ...
- 如何编写linux下nand flash驱动-3
[读(read)操作过程详解] 以最简单的read操作为例,解释如何理解时序图,以及将时序图 中的要求,转化为代码. 解释时序图之前,让我们先要搞清楚,我们要做的事情:那就是,要从nand flash ...
- Linux 下 Nand Flash 驱动主要数据结构说明
s3c2410 专有数据结构 s3c2410_nand_set struct s3c2410_nand_set { int nr_chips; /* 芯片 ...
- 15.1 linux操作系统下nand flash驱动框架2
当我们需要在操作系统上读写普通文件的时候,总是需要一层层往下,最终到达硬件相关操作,当然底层设备大多数都是块设备 NAND FLASH就作为一个最底层的块设备. 而写驱动,就是要构建硬件与操作系统之间 ...
- Linux 下 Nand Flash 调用关系
Nand Flash 设备添加时数据结构包含关系 struct mtd_partition partition_info[] --> struct s3c2410_nand_set ...
- Smart210学习记录----nand flash驱动
[详解]如何编写Linux下Nand Flash驱动 :http://www.cnblogs.com/linux-rookie/articles/3016990.html 当读写文件请求到来的时候, ...
- 【驱动】linux系统下nand flash驱动程序框架
linux操作系统下nand flash驱动框架 当我们需要在操作系统上读写普通文件的时候,总是需要一层层往下,最终到达硬件相关操作,当然底层设备大多数都是块设备 NAND FLASH就作为一个最底层 ...
随机推荐
- delphi根据不同图片生成不规则窗口的实现(仅限于BMP格式)
unit CreateImageForm; interface uses Windows, SysUtils, Variants, Classes, Graphics; procedure Creat ...
- ES6 箭头函数this指向
箭头函数有几个使用注意点. (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. (2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误. (3)不可以使 ...
- 快速排序--Python实现
快速排序算法:1.选择一个基准数2.小于基准数的放左边,大于基准数的放右边3.利用递归的方法针对左边的数据进行快速排序,再对右边的数据进行快速排序4.递归停止的条件:数组为空或者只有一个元素 时间复杂 ...
- C# sort System.InvalidOperationException: Failed to compare two elements in the ar
System.InvalidOperationException: Failed to compare two elements in the array. ---> System.NullRe ...
- 剑指offer——11矩阵覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 题解: 使用递归或者动态规划,明显,递归没有动态规划优 ...
- HTTP协议:响应消息
一.请求消息:客户端发送给服务器端的数据 数据格式: 1.请求行 2.请求头 3.请求空行 4.请求体 二.响应消息:服务器端发送给客户的数据 数据格式: 1.响应行: 1.组成:协议/版本 响应状态 ...
- 理解Spring框架中Bean的5个作用域
当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring I ...
- 分布式唯一ID实现
ID生成的核心需求 全局唯一 趋势有序 为什么要全局唯一 避免ID冲突 著名的例子就是身份证号码,身份证号码确实是对人唯一的,然而一个人是可以办理多个身份证的,例如你身份证丢了,又重新补办了一张,号码 ...
- day18 函数定义、参数;名称空间;全局变量及局部变量。
Python之路,Day6 = Python基础6 函数的定义 def func1(): # 定义一个函数,名字叫func1,括号中没有传入参数 print('hello word') # 这里是 f ...
- mfcs100d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MSVCRTD.lib(dllmain.obj)
转自VC错误:http://www.vcerror.com/?p=55 问题描述: mfcs100d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 al ...