随着越来越多的平台支持从Nand Flash 中启动,掌握Nand Flash 的驱动编写有着重要的现实意义,由于内核已经完成了大部分的工作,实际工作中大部分工程师对Nand Flash 驱动只是简单的修改。

下面分析一下Nand Flash 的代码流程:

学习Nand Flash 之前,需要对块设备中下面2点有个认识:

1, gendisk: 描述块设备实体(一整个Nand Flash 芯片)的结构体,整个块设备的注册过程都是围绕gendisk 来开展的;

2, add_disk(): 将一个分区信息(如:/dev/mtdblock3)注册到内核列表中

下面分析具体的驱动:

1, s3c2410 nandflash 控制器初始化步骤

s3c2410_nand_init(&s3c2410_nand_driver)

->driver_register->bus_add_driver()->driver_attach->bus_for_each_dev(_driver_attach)->driver_probe_device()->dev->probe()  /*最后这个函数实质是 s3c2410_nand_probe() */

->s3c2410_nand_probe()

->s3c24xx_nand_probe()

->s3c2410_nand_inithw()   /* 初始化nandflash 控制器 */

->s3c2410_nand_init_chip()  /* 初始化s3c2410 nandflash 驱动最底层的访问控制函数 */

->chip->write_buf = s3c2410_nand_write_buf;

->chip->read_buf = s3c2410_nand_read_buf;

->chip->select_chip = s3c2410_nand_select_chip;

->chip->cmd_ctrl = s3c2410_nand_hwcontrol()

->nand_scan()

->s3c2410_nand_add_partition()

->add_mtd_device()

将nandflash 的一个分区注册成一个块设备,并通过IO请求来访问的步骤: /*块设备驱动程序的注册过程*/

module_init(init_mtdblock)

->init_mtdblock()

->register_mtd_blktrans(&mtdblock_tr)

->register_blkdev()  /* 注册为块设备 */

->blk_init_queue()   /* IO请求队列初始化 */

->kernel_thread(mtd_blktrans_thread) /* 块设备(nandflash)读写访问io请求处理线程 */

->tr->add_mtd()

mtdblock_add_mtd()

->add_mtd_blktrans_dev()

->alloc_disk()

->add_disk()   /* 初始化一个gendisk 结构体并注册成一个disk */

->blk_register_region()

->register_disk()

->blk_register_queue()

1, nandflash io 请求处理线程mtd_blktrans_thread()等在一个等待队列上

mtd_blktrans_thread()

->DECLARE_WAITQUEUE(wait,current);

->elv_next_request()  /* 检查有没有IO请求 */

->add_wait_queue(&tr->blkcore_priv->thread_wq)  /* 等在等待队列上 */

->set_current_state(TASK_INTERRUPTIBLE)

->schedule();   /* 让出cpu使用权 */

->    /* 等待,直到有IO请求到来被唤醒 */

->do_blktrans_request()

->blk_fs_request();

->   /* 检查访问的偏移量不能大于整个nandflash 的容量 */

->   /* 假设为读访问: */

->tr->readsect()

mtdblock_readsect()   /* mtd_block.c */

->do_cached_read()    /* mtd_block.c */

->mtd->read()

nand_read()   /* nand_base.c */

->nand_do_read_ops()

->nand_read_page_raw()

->s3c2410_nand_read_buf()  /* 通过s3c2410 nandflash控制器发命令读取nandflash 内容*/  //s3c2410.c

->  /* 假设为写访问 */

->tr->writesect()

mtdblock_writesect()

->end_request()

2, 当IO请求来时,唤醒线程 mtd_blktrans_thread()

mtd_blktrans_request()

->wake_up(&tr->blkcore_priv->thread_wq)

3, nandflash IO请求处理线程mtd_blktrans_thread()开始处理IO请求

->do_blktrans_request()

->/* 见上 */

从上面的代码流程可见,Nand Flash 驱动作为一个块设备的典型案例,为位于MTD的下层,其数据的读写通过mtd_blktrans_thread内核线程来处理IO请求。

来源:oschina

链接:https://my.oschina.net/u/51715/blog/57930

linux下nand flash驱动工作原理,Linux下Nand Flash 驱动代码分析相关推荐

  1. linux下nand flash驱动工作原理,Linux驱动之Nand Flash四问,原理、工作方式都包含了...

    Nand Flash 是一个存储芯片.本文引用地址:http://www.eepw.com.cn/article/201801/374606.htm 那么:这样的操作很理"读地址A的数据,把 ...

  2. linux下nand flash驱动工作原理,1.3.4. Nand flash驱动工作原理

    1.3.4. Nand flash驱动工作原理 在介绍具体如何写Nand Flash驱动之前,我们先要了解,大概的整个系统,和Nand Flash相关的部分的驱动工作流程,这样,对于后面的驱动实现,才 ...

  3. Linux | PCIe Hotplug | 概念及工作原理的不完全总结

    本文对 PCIe 热插拔的概念及工作原理进行不完全总结. 更新: 2022 / 12 / 31 Linux | PCIe Hotplug | 概念及工作原理的不完全总结 热插拔 组成部件 实现代码 通 ...

  4. Linux运维系列总结-Linux系统启动过程、WEB工作原理、DHCP工作原理、DNS解析原理、NFS网络文件系统、FTP文件传输协议、PXE+KICKSTART自动安装系统

    Linux运维系列总结-Linux系统启动过程.WEB工作原理.DHCP工作原理.DNS解析原理.NFS网络文件系统.FTP文件传输协议.PXE+KICKSTART自动安装系统 1.Linux系统的启 ...

  5. MG995舵机工作原理及基于STM32的驱动源代码

    MG995舵机工作原理及基于STM32的驱动源代码 一·MG995舵机工作原理 1.MG995舵机简介 产品型号 MG995 产品尺寸 40.7*19.7*42.9mm 产品重量 55g 工作扭矩 1 ...

  6. linux服务器基础知识及工作原理汇总

    服务器基础 一.服务器的种类 1.按网络规模划分 按网络规模划分,服务器分为工作组级服务器.部门级服务器.企业级服务器 2.按架构划分 按照服务器的结构,可以分为CISC(复杂指令集)架构的服务器和R ...

  7. Linux系统LVM逻辑卷工作原理,必看~

    一.传统的磁盘管理 其实在Linux操作系统中,磁盘管理机制和windows上的差不多,绝大多数都是使用MBR(Master Boot Recorder)都是通过先对一个硬盘进行分区,然后再将该分区进 ...

  8. 字符设备驱动基础篇3——字符设备驱动工作原理

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 参考资料:http://www.cnblogs.com/biaohc/p/6575074.html. 1.系统整体工作原理 (1)应用层-& ...

  9. “不懂 CPU 工作原理又如何,直接用代码模拟一个!”

    近日,一位来自 BBC 的软件工程师 Daniel Harper 从浅入深,分享了以代码的方式来实现 CPU 所有功能的可行性,希望对大家了解计算机的内容原理有所帮助. 作者 | Daniel Har ...

最新文章

  1. jconsole jvisualvm远程监视websphere服务器JVM的配置案
  2. 离散对数(同余理论-BSGS算法)
  3. 简单约瑟夫环问题解法汇总(模拟/数论)
  4. call和apply和bind的区别
  5. 每日一题:leetcode724.寻找数组的中心索引
  6. 001 初学android开发,从搭建环境开始(jdk+eclipse+android sdk+windows7)
  7. google浏览器不能登录
  8. C 语言 结构类型 结构
  9. linux raw串口,linux下串口raw驱动(US100超声波)--Apple的学习笔记
  10. LINUX 循环脚本
  11. 关于BT.709标准
  12. android 优酷 api接口,腾讯优酷网站视频引用接口
  13. 笔记本电脑怎么找计算机硬盘,如何给笔记本电脑硬盘分区
  14. 企业教育中的人工智能市场现状研究分析预测报告-
  15. Gos —— 获取物理内存容量
  16. Git自学之路(二)- Git初始配置和基本使用
  17. python数据可视化案例2017年6省gdp_吴裕雄 数据挖掘与分析案例实战(5)——python数据可视化...
  18. 2018版苹果开发者设置内购(App内购买项目)、税务、银行问题,开通苹果支付
  19. ChinaSoft 论坛巡礼 | 软件工程教学案例交流与竞赛
  20. go实践二十 web开发--表单唯一token 表单验证 防止xss攻击 上传文件 cookie处理

热门文章

  1. 5.1.7 设备的分配和回收
  2. 多线程之 CreateThread与_beginthreadex本质区别
  3. SQL语言之用户(Oracle)
  4. Redis的Set操作
  5. 眼图在通信系统中有什么意义_解读CRM系统在企业中有什么作用
  6. 防屏蔽浏览器_彻底解决安卓手机通知管理难题,顺便还实现了聊天消息防撤回!...
  7. 最简单java设计模式:工厂方法模式
  8. 无法识别的配置节appsettings_人脸识别门禁考勤系统安装使用注意事项
  9. XML简介及基本语法
  10. Java 里的 abstract 和 final 关键字