ldrb指令什么意思(ldr指令是什么意思)

ldrb指令什么意思(ldr指令是什么意思)span id Label3 p nbsp nbsp nbsp nbsp nbsp nbsp nbsp MTD Memory Technology device 是用于访问 memory 设备 ROM Flash 的 Linux 子系统 p span

大家好,我是讯享网,很高兴认识大家。




讯享网

                <span id="Label3"><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MTD(Memory Technology device)是用于访问memory设备(ROM、Flash)的Linux子系统,在Linux中引入这一层的主要目的是为了更加简单的添加新的Memory存储设备,它提供一层抽象的接口。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img  alt="技术分享" title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="https://www.u72.net/d/file/p/2024/08/22/9f204788c9f90e2482384b81ed9d508a.png" width="907" height="669"> </p> <p>&nbsp;</p> <p>&nbsp;</p> <p>从上图可以看出,mtd原始设备层可以让底层Flash以字符设备呈现为应用层,表现形式为/dev/mtdN,也可以以块设备呈现给应用层,表现形式为/dev/mtdblockN。在应用层面上,对于字符形式的Flash设备,可以通过mtd-utils工具来控制。对于块设备形式的Flash设备,可以通过mount、umount命令来控制。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 1. 硬件驱动层</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 硬件驱动层负责在初始化时,驱动Flash硬件,Linux MTD设备的Nor Flash芯片驱动遵循CFI接口标准规范,其驱动程序位于drivers/mtd/chips目录下。Nand Flash驱动代码位于/drivers/mtd/nand/子目录下。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 2. MTD原始设备层</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该层的上面为MTD原始设备的通用代码,下面为各个特定Flash的接口代码。因为这一层要封装不同Flash的操作接口,向上提供统一接口,因此,应该是有一个通用的操作接口设备描述符,里面包含了常见的所有flash设备的操作数据和操作方法。在MTD中,使用mtd_info来描述。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mtd_info,描述MTD原始设备层,定义了大量关于mtd的数据和操作函数。每一个mtd_info都代表一个抽象的MTD设备分区,这些设备保存在一个设备数组mtd_table中。对于每一个虚拟的MTD设备,它应该包含一些分区相关的信息,这些信息用mtd_part来描述。</p> <div></div>&lt;style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;<p>&nbsp;&nbsp;&nbsp;&nbsp; 从内核代码的函数组织构造上来看,对于上述mtd_info和mtd_table的操作,肯定有相关函数。</p><p>&nbsp;&nbsp;&nbsp;&nbsp; add_mtd_device : 将特定mtd_info分区信息加入mtd_table中,</p><p>&nbsp;&nbsp;&nbsp;&nbsp; del_mtd_device&nbsp; :&nbsp; 将特定mtd_info分区信息从mtd_tabe中移除。</p><p>&nbsp;&nbsp;&nbsp;&nbsp; add_mtd_partitions:将特定mtd_info的特定分区信息加入mtd_table中,函数原型如下:</p>&lt;style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;<p>其中的parts和nbparts是由static struct mtd_partition XXXXXXXX[ ] 来决定,可以在kernel中硬编码,也可以通过bootloader传递给kernel来决定。一般只要给出每个分区的name,offset和size就足够了。</p><p>&nbsp;</p><p>一个MTD原始设备可以通过mtd_part分割成数个MTD原 始设备注册进mtd_table,</p><p>mtd_table中的每个MTD原始设备都可以被注册成一个MTD设备,</p><p>有两个函数可以完成这个工作,即 add_mtd_device函数和add_mtd_partitions函数。</p><p>其中add_mtd_device函数是把整个NAND FLASH注册进MTD Core,</p><p>而add_mtd_partitions函数则是把NAND FLASH的各个分区分别注册进MTD Core。</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp; 3. MTD设备层</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于MTD原始设备层,Linux系统定义出MTD的块设备(主设备号为31)和字符设备(主设备号为90)。其中,块设备通过一个描述mtd块设备的结构体mtdblk_dev,结合对于的mtdblks的指针数组,形成于mtd_table中的mtd_info的一一对应关系。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符设备和普通字符设备一样,通过注册一系列file_operation函数(lseek,open,close,write,read)。</p><p>&nbsp;&nbsp;&nbsp;&nbsp; 4. 设备节点</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在系统初始化时,通过udev或者mdev自动发现挂载设备,在dev目录下创建mtd字符设备节点(/dev/)和块设备节点</p><p>&nbsp;&nbsp;&nbsp;&nbsp; 5. 根文件系统和文件系统</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 内核启动之后,通过mount命令将flash中其他分区作为文件系统挂载上。</p><p> 从类型上来看,mtd核心部分初始化可以分为两个部分,字符设备的mtd层初始化和块设备的mtd层初始化。</p><p>&nbsp;</p><p>MTD对NAND芯片的读写主要分三部分:</p><p>A、struct mtd_info中的读写函数,如read,write_oob等,这是MTD原始设备层与FLASH硬件层之间的接口;<p>B、struct nand_ecc_ctrl中的读写函数,如read_page_raw,write_page等,主要用来做一些与ecc有关的操作;<p>C、struct nand_chip中的读写函数,如read_buf,cmdfunc等,与具体的NAND controller相关,就是这部分函数与硬件交互,通常需要我们自己来实现。(注:这里提到的read,write_oob,cmdfunc等,其实 都是些函数指针,所以这里所说的函数,是指这些函数指针所指向的函数,以后本文将不再另做说明。)<p>值得一提的是,struct nand_chip中的读写函数虽然与具体的NAND controller相关,但是MTD也为我们提供了default的读写函数,如果你的NAND controller比较通用(使用PIO模式),对NAND芯片的读写与MTD提供的这些函数一致,就不必自己实现这些函数了。<p>这三部分读写函数是相互配合着完成对NAND芯片的读写的。首 先,MTD上层需要读写NAND芯片时,会调用struct mtd_info中的读写函数,接着struct mtd_info中的读写函数就会调用struct nand_chip或struct nand_ecc_ctrl中的读写函数,最后,若调用的是struct nand_ecc_ctrl中的读写函数,那么它又会接着调用struct nand_chip中的读写函数。<p>以读NAND芯片为例,讲解一下这三部分读写函数的工作过程。<p>首先,MTD上层会调用struct mtd_info中的读page函数,即nand_read函数。<p>接着nand_read函数会调用struct nand_chip中cmdfunc函数,这个cmdfunc函数与具体的NAND controller相关,它的作用是使NAND controller向NAND 芯片发出读命令,NAND芯片收到命令后,就会做好准备等待NAND controller下一步的读取。<p>接着nand_read函数又会调用struct nand_ecc_ctrl中的read_page函数,而read_page函数又会调用struct nand_chip中read_buf函数,从而真正把NAND芯片中的数据读取到buffer中(所以这个read_buf的意思其实应该是read into buffer,另外,这个buffer是struct mtd_info中的nand_read函数传下来的)。<p>read_buf函数返回后,read_page函数就会对buffer中的数据做一些处理,比如校验ecc,以及若数据有错,就根据ecc对数据修正之类的,最后read_page函数返回到nand_read函数中。<p>对NAND芯片的其它操作,如写,擦除等,都与读操作类似。<p>参考链接:</p><p>http://blog.csdn.net/leibniz_zsu/article/details/4977650</p><p>http://blog.csdn.net/leibniz_zsu/article/details/4977842</p><p>http://blog.csdn.net/leibniz_zsu/article/details/4977842</p><p>MTD技术介绍</p></span>

讯享网
小讯
上一篇 2025-04-21 23:04
下一篇 2025-05-12 11:03

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/160500.html