linux下nand flash驱动工作原理,Linux下Nand Flash 驱动代码分析
随着越来越多的平台支持从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 驱动代码分析相关推荐
- linux下nand flash驱动工作原理,Linux驱动之Nand Flash四问,原理、工作方式都包含了...
Nand Flash 是一个存储芯片.本文引用地址:http://www.eepw.com.cn/article/201801/374606.htm 那么:这样的操作很理"读地址A的数据,把 ...
- linux下nand flash驱动工作原理,1.3.4. Nand flash驱动工作原理
1.3.4. Nand flash驱动工作原理 在介绍具体如何写Nand Flash驱动之前,我们先要了解,大概的整个系统,和Nand Flash相关的部分的驱动工作流程,这样,对于后面的驱动实现,才 ...
- Linux | PCIe Hotplug | 概念及工作原理的不完全总结
本文对 PCIe 热插拔的概念及工作原理进行不完全总结. 更新: 2022 / 12 / 31 Linux | PCIe Hotplug | 概念及工作原理的不完全总结 热插拔 组成部件 实现代码 通 ...
- Linux运维系列总结-Linux系统启动过程、WEB工作原理、DHCP工作原理、DNS解析原理、NFS网络文件系统、FTP文件传输协议、PXE+KICKSTART自动安装系统
Linux运维系列总结-Linux系统启动过程.WEB工作原理.DHCP工作原理.DNS解析原理.NFS网络文件系统.FTP文件传输协议.PXE+KICKSTART自动安装系统 1.Linux系统的启 ...
- MG995舵机工作原理及基于STM32的驱动源代码
MG995舵机工作原理及基于STM32的驱动源代码 一·MG995舵机工作原理 1.MG995舵机简介 产品型号 MG995 产品尺寸 40.7*19.7*42.9mm 产品重量 55g 工作扭矩 1 ...
- linux服务器基础知识及工作原理汇总
服务器基础 一.服务器的种类 1.按网络规模划分 按网络规模划分,服务器分为工作组级服务器.部门级服务器.企业级服务器 2.按架构划分 按照服务器的结构,可以分为CISC(复杂指令集)架构的服务器和R ...
- Linux系统LVM逻辑卷工作原理,必看~
一.传统的磁盘管理 其实在Linux操作系统中,磁盘管理机制和windows上的差不多,绝大多数都是使用MBR(Master Boot Recorder)都是通过先对一个硬盘进行分区,然后再将该分区进 ...
- 字符设备驱动基础篇3——字符设备驱动工作原理
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 参考资料:http://www.cnblogs.com/biaohc/p/6575074.html. 1.系统整体工作原理 (1)应用层-& ...
- “不懂 CPU 工作原理又如何,直接用代码模拟一个!”
近日,一位来自 BBC 的软件工程师 Daniel Harper 从浅入深,分享了以代码的方式来实现 CPU 所有功能的可行性,希望对大家了解计算机的内容原理有所帮助. 作者 | Daniel Har ...
最新文章
- jconsole jvisualvm远程监视websphere服务器JVM的配置案
- 离散对数(同余理论-BSGS算法)
- 简单约瑟夫环问题解法汇总(模拟/数论)
- call和apply和bind的区别
- 每日一题:leetcode724.寻找数组的中心索引
- 001 初学android开发,从搭建环境开始(jdk+eclipse+android sdk+windows7)
- google浏览器不能登录
- C 语言 结构类型 结构
- linux raw串口,linux下串口raw驱动(US100超声波)--Apple的学习笔记
- LINUX 循环脚本
- 关于BT.709标准
- android 优酷 api接口,腾讯优酷网站视频引用接口
- 笔记本电脑怎么找计算机硬盘,如何给笔记本电脑硬盘分区
- 企业教育中的人工智能市场现状研究分析预测报告-
- Gos —— 获取物理内存容量
- Git自学之路(二)- Git初始配置和基本使用
- python数据可视化案例2017年6省gdp_吴裕雄 数据挖掘与分析案例实战(5)——python数据可视化...
- 2018版苹果开发者设置内购(App内购买项目)、税务、银行问题,开通苹果支付
- ChinaSoft 论坛巡礼 | 软件工程教学案例交流与竞赛
- go实践二十 web开发--表单唯一token 表单验证 防止xss攻击 上传文件 cookie处理
热门文章
- 5.1.7 设备的分配和回收
- 多线程之 CreateThread与_beginthreadex本质区别
- SQL语言之用户(Oracle)
- Redis的Set操作
- 眼图在通信系统中有什么意义_解读CRM系统在企业中有什么作用
- 防屏蔽浏览器_彻底解决安卓手机通知管理难题,顺便还实现了聊天消息防撤回!...
- 最简单java设计模式:工厂方法模式
- 无法识别的配置节appsettings_人脸识别门禁考勤系统安装使用注意事项
- XML简介及基本语法
- Java 里的 abstract 和 final 关键字