linux-2.6.22.6内核nand flash框架分析

news2024/11/17 21:31:05

内核启动时会在串口打印nand flash的相关信息,通过该信息可定位到内核自带的nand flash相关驱动代码。

例如串口打印S3C24XX NAND Driver,搜索该字符串可找到/home/book/work/linux/linux-2.6.22.6/drivers/mtd/nand/s3c2410.c这个文件,这个就是nand flash驱动代码文件。

从该文件的s3c2410_nand_init函数分析,通过总线设备驱动模型可知道最终会调用到s3c2412_nand_probe函数,s3c2412_nand_probe的函数调用层次结构如下:


```c
s3c2410_nand_inithw
s3c2410_nand_init_chip
nand_scan //在drivers/mtd/nand/s3c2410.c通用文件里
	nand_scan_ident
		nand_set_defaults
		nand_get_flash_type
			chip->select_chip(mtd, 0);
			chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
			*maf_id = chip->read_byte(mtd);
			dev_id = chip->read_byte(mtd);	
			//读出设备id后,后定义好的设备信息数组比较
			for (i = 0; nand_flash_ids[i].name !=NULL;i++{
					if (dev_id == nand_flash_ids[i].id) {
						type =  &nand_flash_ids[i];
						break;
					}
				}
	nand_scan_tail
		mtd->erase = nand_erase;
		mtd->read = nand_read;
        mtd->write = nand_write;
s3c2410_nand_add_partition
	add_mtd_partitions
		add_mtd_device 
			//mtd_notifiers被register_mtd_user设置,
			//register_mtd_user被mtd_blkdevs.c和mtdchar.c调用
			list_for_each(this, &mtd_notifiers) { 
			struct mtd_notifier *not =  list_entry(this,struct  mtd_notifier, list);
			       //这里最终会调用到notifier和blktrans_notifier里的mtd_notify_add和blktrans_notify_add方法,分别对应字符设备和块设备
					not->add(mtd); 
					}
			//先看mtd_notify_add,字符设备很简单,如果有设备注册,就会创建两个以mtd开头的设备文件
			mtd_notify_add
				class_device_create
				class_device_create
			//再看blktrans_notify_add
			blktrans_notify_add
			    //blktrans_majors被register_mtd_blktrans设置,register_mtd_blktrans被mtdblock.c和 mtd_blkdevs.c调用
				list_for_each(this, &blktrans_majors) {
				struct mtd_blktrans_ops *tr = list_entry(this, struct mtd_blktrans_ops, list);
	            //这里最终会调用mtdblock.c的mtdblock_add_mtd
				tr->add_mtd(tr, mtd);
		    }
			//分析mtdblock_add_mtd
		mtdblock_add_mtd
			add_mtd_blktrans_dev
				alloc_disk  //这里才是块设备驱动开发正在流程,分配gendisk,设置gendisk,添加gendisk
				add_disk

在这里插入图片描述
总结:块设备和字符设备这两类存储类驱动最终都会用到nand_scan_tail里面构造的mtd_info信息,最终的的读写函数都会定位到mtd_info的具体函数,不过块设备更复杂,分层更多,它主要分为硬件层、nand协议层和块设备层,硬件层知道怎样发命令,需要构造nand_chip结构体,协议层知道要发什么来操作。主要构造mtd_info结构体,块设备层使用mtd_info信息,并用电梯调度算法进行优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

The Company Requires Superficial StudyPHP 了解PHP ①

作者 : SYFStrive 博客首页 : HomePage 📜: The Company Requires PHP MYSQL 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以…

webassembly性能优化

添加调试内容 性能查看 1.点击chrome的性能 2.点击录制按钮 3.开始启动性能分析之后,进行操作 4.操作完成后,点击停止。 5.ctrlf调出搜索,查看相关函数 6.从上到下查看具体耗时的操作。 其中上层包含下层时间。

购物车业务

一、分析购物车vo (1)添加成功页 public class CartItemVo implements Serializable {/*** 商品id*/private Long skuId;/*** 是否选中*/private Boolean check true;/*** 商品标题*/private String title;/*** 商品图片*/private String image;/***…

Redis6之哨兵模式

哨兵:是用于监控Redis集群中主节点状态的工具,是Redis高可用解决方案,哨兵可以监视一个或者多个redis 主节点,以及这些主节点的所有从节点。 某个主节点服务宕机后,会把这个主节点下的某个从节点升级为主节点来替代已宕…

软件测试技能,JMeter压力测试教程,监听器之灵活的文件写入(十六)

一、前言 JMeter使用Simple Data Writer插件具有非常简单的测试结果编写功能。文件格式仅限于XML和CSV,字段顺序已预定义。因此,你可能会发现Simple Data Writer不足以完成您的任务 Flexible File Writer插件允许以灵活的格式编写测试结果,…

HarmonyOS 4.0开发者Beta招募,快来报名尝鲜

作为一枚资深玩机党,相比同质化日趋严重的硬件配置,我对各大手机厂商的系统软件更感兴趣。把玩了几年iPhone、三星及国产安卓手机,沉浸体验了iOS、Android几番更新迭代,暮然回首——还是咱们“土生土长”的HarmonyOS更贴合我个人的…

如何使用Claude(超详细教程)

如何使用Claude(超详细教程) 1. 目前claude只支持在slack中使用 点击进入claude官网然后点击添加到Slack中 2. 跳转到Slack创建工作区 点击创建新的工作区(以前使用过Slack可用以前的工作区) 输入邮箱,建议谷歌邮箱登录(其他邮…

ValSuite报告可以帮助改善您的验证过程的6种方式

热验证工艺是一项复杂而微妙的工作,但它是确保制药和生物技术产品的安全性和有效性的重要组成部分。同时,管理整个验证过程中产生的数据可能很费时,而且容易出错——这就是ValSuite的意义。 这款直观的验证软件简化了数据分析和报告&#xf…

Visual C++中*号位置和功能详细解说

我是荔园微风,作为一名在IT界整整25年的老兵,今天来聊聊Visual C中*号的位置。 我知道在程序员队伍中有一群特别细心、谨慎的可爱的人,他们经常为一些在别人看来小的不能再小的问题所困惑。比如说,*号的位置,让很多人…

SpringBoot集成MinIO

简介 对象存储服务OSS(Object Storage Service)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。今天我这里主要讲解SpringBoo…

工业物联网解决方案:水轮机PLC数据采集远程监控系统

水轮机是一种能将水的动能转化为旋转机械能的动力设备,是水电站的重要工业设备。随着工业自动化技术与PLC设备的推广应用,水轮机可以通过PLC实现自动化控制,进而通过搭建PLC数据采集远程监控系统,实现水轮机的实时在线监控&#x…

产品再次跳票 法拉第未来的融资价值却渐渐浮现?

从“生态化反”到“极智科技顶奢”,贾跃亭讲故事的出众能力,总是能为旗下企业和产品赚足市场眼球。 但仅有宏大的前景描绘,似乎难以触动理性的资本市场,其创立的新能源车企法拉第未来(NASDAQ:FFIE&#xf…

在IDEA中将自定义的配置文件设置到SpringBoot工程中

可以帮助我们生成自定义配置的元数据信息&#xff0c;让配置文件和Java代码之间的对应参数可以自动定位&#xff0c;方便开发。 <!-- 生成自定义配置的元数据信息 --><dependency><groupId>org.springframework.boot</groupId><artifactId>sprin…

Hiera:一个没有Bells-and-Whistles的分层视觉转换器

文章目录 Hiera: A Hierarchical Vision Transformer without the Bells-and-Whistles摘要本文方法实验结果 Hiera: A Hierarchical Vision Transformer without the Bells-and-Whistles 摘要 现代层次视觉转换器在追求监督分类性能的过程中增加了一些特定于视觉的组件。虽然…

PS修改日期(简单两步)

PS修改日期&#xff08;简单两步&#xff09; Q&#xff1a;将图中的日期修改为6月10日 选择画笔工具&#xff0c;把要修改的日期涂抹掉 设置前景色&#xff0c;使用吸管吸附要涂抹的颜色&#xff0c;然后点击确定 使用设置好颜色的画笔&#xff0c;在要修改的日期上涂抹 …

接口自动化测试实操【设置断言思路】

1 断言设置思路 这里总结了我在项目中常用的5种断言方式&#xff0c;基本可能满足90%以上的断言场景&#xff0c;具体参见如下脑图&#xff1a; 在这里插入图片描述 下面分别解释一下图中的五种思路&#xff1a; 1&#xff09; 响应码 对于http类接口&#xff0c;有时开发人…

期末复习【计算机网络】

期末复习【计算机网络】 前言推荐期末复习如何快速阅读电子书重点第1章 概述1.6 计算机网络的性能1.6.2 计算机网络的性能指标√ 1.7 计算机网络体系结构1.7.3 具有五层协议的体系结构√ 第2章 物理层2.3 物理层下面的传输媒体 *2.4 信道复用技术2.4.1 频分复用、时分复用和统计…

天津大学天津市认知计算与应用重点实验室视听觉认知计算团队12篇论文被语音处理顶会Interspeech 2023接收

天津大学天津市认知计算与应用重点实验室视听觉认知计算团队12篇论文被语音技术顶会Interspeech 2023接收&#xff0c;涵盖意图识别、口语理解、声学特征、语音识别、语音分离、情感识别等研究方向&#xff0c;论文简介如下。 01. Rethinking the visual cues in audio-visual…

Harbor 间通过API实现镜像复制

背景&#xff1a; 通过harbor搭建私有镜像仓库时&#xff0c;往往会设计出 研发镜像仓库--》测试镜像仓库--》产品镜像仓库&#xff0c;甚至更多。那个多镜像间的复制将成了一个必须解决的问题。当然可以通过harbor自带的界面操作即可实现需求&#xff0c;也可以通过harbor提供…

详解20个常见的模拟电路

桥式整流电路 二极管的单向导电性&#xff1a;二极管的PN结加正向电压&#xff0c;处于导通状态&#xff1b;加反向电压&#xff0c;处于截止状态。其伏安特性曲线&#xff0c;如下图。 理想开关模型和恒压降模型&#xff1a;理想模型指的是在二极管正向偏置时&#xff0c;其管…