注册 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 的其它字段, 其中包括:

  1. 通过 request_mem_region()为 Nand Flash 寄存器区申请 I/O 内存地址空间区,并通过 ioremap()把它映射到虚 拟地址空间.
    1. 调用 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 核心驱动调用.它完成的主要工作如下:

  1. 把*device 的*driver_data 字段置空.

2. 释放 mtd 设备信息. 3. 释放 clk 资源.

4. 通过 iounmap()取消映地址空间. 5. 释放申请的 I/O 内存资源.

6. 释放设备私有数据*info 的空间.

    Nand Flash 芯片初始化

s3c2410_nand_init_chip()初始化 struct nand_chip 中的一些主要字段以及方法.其中主要包括的方法有:

  1. s3c2410_nand_hwcontrol(); 硬件控制

2. s3c2410_nand_devready(); 设备是否准备好

  1. s3c2410_nand_write_buf(); 写一个 buffer 到 nand flash
  2. s3c2410_nand_read_buf(); 读一个 buffer 到 nand flash 5. s3c2410_nand_select_chip(); 选择操作芯片

如果支持 ECC 硬件校验,还设置如下方法:

  1. s3c2410_nand_correct_data();
    通过 ECC 码校正数据
  2. s3c2410_nand_enable_hwecc();
    开启硬件 ECC 检查
  3. 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()函数中,主要完成如下几项工作:

  1. 会调用在
    nand flash 驱动中对
    struct nand_chip 重载的 select_chip 方法,即 s3c2410_nand_select_chip()选择要操作的 MTD 芯片.
  2. 会调用在
    struct nand_chip 中系统缺省的方法 cmdfunc 发送读命令到 nand flash.
  3. 会调用在 nand
    flash 驱动中对 struct
    nand_chip 重载的 read_buf(),即 s3c2410_nand_read_buf() 从 Nand Flash
    的控制器的数据寄存器中读出数据.
  4. 如果有必要的话,会调用在 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()函数中,主要完成如下几项工作:

    1. 会调用在
      nand flash 驱动中对
      struct nand_chip 重载的 select_chip 方法,即 s3c2410_nand_select_chip()选择要操作的 MTD 芯片.
    2. 调用 nand_write_page()写一个页.
    3. 在 nand_write_page()中,会调用在 struct
      nand_chip 中系统缺省的方法 cmdfunc
      发送写命令 到 nand flash.

    4. nand_write_page()中,会调用在 nand flash 驱动中对 struct nand_chip 重载的 write_buf(),即 s3c2410_nand_write_buf()从 Nand
      Flash 的控制器的数据寄存器中写入数据.

    5. 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 驱动说明的更多相关文章

  1. 如何编写linux下nand flash驱动-4

    2.       软件方面 如果想要在Linux下编写Nand Flash驱动,那么就先要搞清楚Linux下,关于此部分的整个框架.弄明白,系统是如何管理你的nand flash的,以及,系统都帮你做 ...

  2. 如何编写linux下nand flash驱动-2

    [Nand Flash引脚(Pin)的说明] 图3.Nand Flash引脚功能说明 上图是常见的Nand Flash所拥有的引脚(Pin)所对应的功能,简单翻译如下: 1.       I/O0 ~ ...

  3. 如何编写linux下nand flash驱动-1

    1.       硬件特性: [Flash的硬件实现机制] Flash全名叫做Flash Memory,属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失 ...

  4. 如何编写linux下nand flash驱动-3

    [读(read)操作过程详解] 以最简单的read操作为例,解释如何理解时序图,以及将时序图 中的要求,转化为代码. 解释时序图之前,让我们先要搞清楚,我们要做的事情:那就是,要从nand flash ...

  5. Linux 下 Nand Flash 驱动主要数据结构说明

    s3c2410 专有数据结构 s3c2410_nand_set struct s3c2410_nand_set { int                    nr_chips;     /* 芯片 ...

  6. 15.1 linux操作系统下nand flash驱动框架2

    当我们需要在操作系统上读写普通文件的时候,总是需要一层层往下,最终到达硬件相关操作,当然底层设备大多数都是块设备 NAND FLASH就作为一个最底层的块设备. 而写驱动,就是要构建硬件与操作系统之间 ...

  7. Linux 下 Nand Flash 调用关系

    Nand Flash 设备添加时数据结构包含关系 struct mtd_partition        partition_info[] --> struct s3c2410_nand_set ...

  8. Smart210学习记录----nand flash驱动

    [详解]如何编写Linux下Nand Flash驱动  :http://www.cnblogs.com/linux-rookie/articles/3016990.html 当读写文件请求到来的时候, ...

  9. 【驱动】linux系统下nand flash驱动程序框架

    linux操作系统下nand flash驱动框架 当我们需要在操作系统上读写普通文件的时候,总是需要一层层往下,最终到达硬件相关操作,当然底层设备大多数都是块设备 NAND FLASH就作为一个最底层 ...

随机推荐

  1. Android中滑屏实现----触摸滑屏以及Scroller类详解 .

    转:http://blog.csdn.net/qinjuning/article/details/7419207 知识点一:  关于scrollTo()和scrollBy()以及偏移坐标的设置/取值问 ...

  2. sudo apt-get update:Could not get lock /var/lib/apt/lists/lock解决办法

    原文: http://blog.chinaunix.net/uid-26932153-id-3193335.html 今天更新时候出现了点小问题,一开始更新到一半,我嫌速度慢,就取消掉了. 更新了so ...

  3. 2019 ICPC 南昌网络赛

    2019 ICPC 南昌网络赛 比赛时间:2019.9.8 比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest 总结 ...

  4. 一点响应式Web设计与实现思路

    摘要: 是否还在为你的应用程序适配PC端,移动端,平板而苦苦思索呢,是否在寻找如何一套代码适配多终端方式呢,是否希望快速上手实现你的跨终端应用程序呢,是的话,那就看过来吧,本文阐述响应式UI设计相关理 ...

  5. 如何去掉vue路由中的#

    通过脚手架vue-cli构建的项目,在项目启动后,URL地址上都会带有#,如:http://localhost:8080/#/father 原因:这是因为vue-router 默认hash模式, 使用 ...

  6. Worker Thread等到工作来,来了就工作

    Worker是“工人”的意思,worker thread pattern中,工人线程(worker thread)会一次抓一件工作来处理,当没有工作可做时,工人线程会停下来等待心得工作过来. Work ...

  7. shell 命令 查找命令find,grep

    1.find 查找文件 [ find -name 文件名 ] 在当前目录及子目录中找这个文件 [ find -iname 文件名 ] 在当前目录及子目录中找这个文件,不区分大小写 [ find -na ...

  8. shell 基本系统命令,关机重启,查看版本,查手册,日期,磁盘,历史命令

    1. 查看系统版本及内核版本 cat /etc/issue  查看系统版本 uname -r     查看内核版本 2. 关机重启命令 关机: shutdown -h now    立即关机 shut ...

  9. Linux 常用命令:解压缩篇

    前言 Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法. tar tar是linux中最常用的解压缩命令.tar命令可用于处理后缀名为tar,tar ...

  10. sikuli+eclipse对于安卓app自动化测试的应用(第一次写博客,有些语言还不太专业,望海涵)

    Sikuli是什么? 下面是来自于官网的介绍:Sikuli is a visual technology to automate and test graphical user interfaces ...