朱有鹏老师linux核心大讲堂---ARM裸机第十一部分 NandFlash和iNand学习笔记
目录
1、NandFlash的接口 数据手册:K9F2G08/K9F4G08
2、NandFlash结构框图
3、Nandflash的结构
4、NandFlash常见操作以及流程分析
5、S5PV210的NandFlash控制器
6、Nand操作代码解析
7、iNand介绍
8、SD卡、inand操作
9、SD/iNand代码实战分析1
10、SD/iNand代码实战分析2
11、SD/iNand代码分析
1、NandFlash的接口 数据手册:K9F2G08/K9F4G08
S5PV210核心板NAND FLASH接口电路:
(1)型号的含义:就如K9F2G08,K9F:三星公司的型号,2g存储,08:8位数据线。
(2)数据线不一定只传送数据,还可能传送命令
2、NandFlash结构框图
组成部分:存储矩阵+控制电路,控制电路接口与我们的soc里的nand控制器连接。nand控制器负责产生nandflash芯片所需的读写时序,我们操作nandflash时只需要操作soc上nand控制器提供的寄存器即可,根据读写流程图进行编程来读、写、擦除操作。
(1)Nand中可以被单次访问的最小单元叫做页。(最小单元是至少一次要读取指定的位数(字节),或者这些固定位数的整数倍),这就是块设备
(2)页往上就是Block(块),一个块就等于若干个页,再往上就是整个Nand芯片了,叫device,一个device是若干个block。
(3)为什么要分页和块呢,因为块设备不能完全按字节访问,只能按块访问这是物理硬件限制的。页是Nand的最小读写单元,block是擦除Nand的最小单位。(这些都是硬件所决定的)
(4)nand中的多个存储单元,每个单元都有自己的地址(地址是精确到字节的)。所以是地址编排精确到字节,但是实际读写却只能精确到也(所以操作时需要页对齐,譬如2k、4k等这些地址对齐)。nand读写时地址传输通过IO线发送的,因为地址是30位,而IO地址只有8位,所以需要分次进行地址发送,如需要5个cycle才能发送完毕。
(5)总结:nand芯片内部有存储空间,这些空间是由电路来管理的,NAND向外部提供了一套统一的接口标准,然后我们的soc通过接口时序来访问Nand的存储空间,理论上我们可以通过外部soc直接时序访问,但实际上NAND提供的是一套标准公用的接口,SOC有专门的控制模块来读取nand,不需要我们再写读写时序。直接通过soc提供的模块来操作nand芯片即可。(这些控制器一般作为soc的内部外设来存在的)
3、Nandflash的结构
(1)大页Nand与小页Nand 等同于硬盘的扇区,扇区最早的磁盘中是512字节,后来也有些高级的硬盘扇区不是512字节而是1024字节、2048字节等。nand的页也有512字节,1024字节,2048,4096字节,一般说大字节是大页,小字节是小页Nand。
(2)一个块等于多少个page也是不定的,不同的nand也不同。一个Nand芯片有多少block也是不定的,不同的nand芯片不同。
总结:nand的组织架构就比较乱,接口时序也不同,不同厂家的nand接口不一样。一旦升级容量或者换芯片则硬件要从新做,软件也要从新移植。
(3)带内数据2k和带外数据64(ECC数据,存储坏块数据) ECC:eeror correction code,错误校验码)nandflash出错概率比较高所以需要ECC校验数据。
(4)坏块标志:nand芯片用一段时间后,可能某些会坏掉(这些块无法擦除,也无法读写了),类似硬盘的坏道。坏块是不可避免的,而且随着Nand的使用坏块会越来越多。当块块还不算多的时候这个Nand是可以用的,除非坏块太多不划算使用才更换新的。所以我们有了nand管理坏块的标志机制。nand的每一页的64字节的外带数据中,我们(一般是文件系统)定义一个固定位置(譬如定位24字节)来标志这个坏块是好的还是坏的。文件系统在发现这个坏块已经坏了没法用了时会将这个坏块标志位坏块,以后访问nand时直接跳过这个块即可。
(5)计算存储容量的时候没有加上64字节的。
(6)nand的地址有多位,分4/5周期通过IO引脚发送给nand芯片来对nand进行寻址。寻址的最小单位是字节,但读写的最小单元是页。
(7)nand的地址在写代码时要按照nand要求的时序和顺序依次写入。
(8)nand命令码:
(9)nand芯片内部的管理电路本身可以接收外部发送的命令,然后根据这些命令来读写nand内容与外部soc交互。在我们对nand进行读写操作的时候都是要命令、地址、数据的参与才能完成,而且必须要根据nand的芯片规定的流程来做。
4、NandFlash常见操作以及流程分析
(1)坏块检查
flash使用之前要先统一擦除(擦除单位是块)。flash类设备擦除后里面全是1,所以擦干净之后读出来的值是0xff。
(2)页写(program)操作 通过写命令,写地址,写数据,再写命令(分两个周期写命令)过程对页进行操作:
过程:soc通过nand控制器和nand芯片完成顺序对接,然后按照时序要求将一页数据发给nand芯片内部的电路。接口电路先接收到自己的缓冲区,然后再集中写入nand芯片的存储区域中。nand接口电路将一页数据从缓冲区中写入nand存储系统中需要一定的时间,这段时间nand芯片不能再响应soc发过来的其他命令。所以soc要等待nand接口电路忙完。等待方法是soc不断读取状态寄存器(这个状态寄存器有2种情况):一种是soc的nand控制器自带的,另一种是soc通过发命令得到命令响应得到的,然后通过检查这个状态寄存器的状态位就能知道nand接口电路刚才写的那一页数据写完了没,写好了没。
硬件式ECC,soc的nand控制器可以提供硬件式ECC(这个也比较普遍情况)。硬件ECC是在Nand的控制器中有个硬件模块专门做ECC操作。当我们操作Nand芯片的,只要按照soc的要求按时打开ECC生成开关,则当我们写入nand芯片的soc的Nand控制器的ecc模块自动生成ecc数据放在相应的寄存器中,然后我们只要将这生成的ecc数据写入nand芯片的外带数据区即可:在将来读取这块Nand芯片时同样要打开硬件ECC开关,然后开始读,在读的过程当中硬件ecc会自动计算读进来的一页数据的ecc值并将之放到相应的寄存器中。然后我们再读取外带数据区中原来我们写入时存入的ECC值,和我们刚才读的时候得到的ECC值进行校验。校验通过则说明读写正确,校验不通过则说明不正确(放弃数据或者尝试修复)。
(3)擦除(erase)操作
擦除时必须给块对齐的地址。如果给不了对齐的地址,结果是不可知的(有些nand芯片没关系,它内部会自动将其对齐而有些nand会返回地址错误)
(4)页读(read)操作
读跟写操作类似。
5、S5PV210的NandFlash控制器
作用:nandflash接口电路与s5pv210的nandflash控制器连接,soc模块集成了硬件统一的接口电路,使其屏蔽底层时序电路的实现,降低软件编程的复杂程度和工作量。我们也可以用软件的方式来实现时序逻辑来进行对Nandflash的读写,但是NandFlash的时序比较复杂,即使花精力去写好,也不一定会稳定。所以soc提供的统一的接口电路解决了一个问题,我们只要对其提供的寄存器进行读写操作就可以了。这个方法也是目前最广泛的一种技术,越来越来的期间都趋向使用这种方法,具体的实现过程交由电路去完成,我们只要关注自己的业务逻辑就可以了,编程越发的简单。
(2)结构框图
如图中:SFR特殊功能寄存器,编程主要操控这些寄存器去操作nandflash,ECC块生成等。
(3)s5ppv210的nand控制器的主要寄存器
NFCONF、NFCONT、NFCOMMD 发命令的、NFDATA、NFMECCD0 产生ECC的、NFMECCD1 、NFSECCD 带外数据区、NFSBLK
NFEBLK、NFSTAT :控制器自带的状态寄存器
6、Nand操作代码解析
(1)擦除函数
图中的A11即使第12位,代码是从1开始的,所以A12等于数据手册的A11
(2)页读取函数
(3)页写入函数
都是编程模块化操作,参照数据手册流程图,结合代码分析,一般大多数的存储类芯片操作流程都大同小异,重在理解数据手册流程图,soc提供的控制器所要操作的寄存器,对寄存器进行操作即可。
7、iNand介绍
iNand/eMMC/SDCard/MMCCard的关联
(1)最早出现的是MMC卡,卡片式结构,按照MMC协议设计。(相交于NandFlash芯片来说,MMC卡有2个优势:第一是卡片化,便于拆装;第二是统一了协议接口,兼容性好。)
(2)后来出现SD卡,兼容MMC协议。SD卡比较MMC有一些改进,譬如写保护,速率,容量等。
(3)SD卡遵循SD协议,有多个版本。多个版本之间向前兼容。
(4)iNand/eMMC在SD卡的基础上发展起来的,比较SD卡的区别就是将SD卡芯片化了(解决卡的接触不良问题,便于设备迷你化)。
(5)iNand和eMMC的关联:eMMC是协议,iNand是Sandisk公司符合eMMC协议的一种芯片系列名称。
iNand/eMMC的结构图及其与NandFlash的区别
(1)iNand内部也是由接口电路和存储系统构成,不同之处在与接口电路功能不同。
(2)iNand的接口电路挺复杂,功能很健全。譬如:
一:提供eMMC接口协议,和SOC的eMMC接口控制器通信对接。
二:提供块ECC校验相关的逻辑,也就是说iNand本身自己完成存储系统的ECC功能,soc使用iNand时自己不用写代码来进行ECC相关操作,大大简化了SOC的编程难度。
三:iNand芯片内部使用MLC Nand颗粒,所以性价比很高。
四:iNand接口电路还提供了cache机制,所以inand的操作速度很快。
iNand/eMMC的物理接口和SD卡物理接口的对比:
(1)对比inand和SD卡的接线,发现:这两个接线几乎是一样的,唯一的区别就是SD卡io线有4根,而iNand的IO线有8根。
(2)这告诉我们,我们在实际操作inand芯片时和操作SD卡时几乎是一样的(物理接线几乎一样,软件操作协议几乎一样)。
8、SD卡、inand操作
8.1 硬件接口:data,clk,cmd
(1)inand的IO线有8根,支持1,4,8线并行传输模式;cd卡io线有4根,支持1,4线并行传输模式。
(2)CMD线用来传输命令,CLK线用来传输时钟信号。
8.2 命令响应的操作模式
简单讲就是:发命令----等待回复(或者无回复,无回复也是一种回复)。命令和回复类型是sd卡协议规定好的。按照发送命令可以进行读写操作。不同的命令响应不同(返回的数据位数不同)。
8.3 SD/inand的体系结构图
8.4、sd/iNand的寄存器(重点是RCA寄存器)
9、SD/iNand代码实战分析1
9.1、命令码CMD和ACMD
命令码CMD主要用作与SD卡交互如读、写、改,均需要通过命令码进入到SD卡的某种状态下才能进行操作,也就是说任何操作均先发命令给SD卡告诉SD卡我将要做什么操作。ACMD是CMD码的扩展命令,CMD码不够用,而又不想新增关键字。解决方案是CMDX 加CMDY =ACMD,也就是说发送两个CDMx码组成一个ACMD码,一般CMDX码是CMD55.
9.2、卡类型识别SD or MMC
soc控制器本身不能识别我们是插的是什么样的卡,如:SD\MMC\eMMC卡,每种卡的协议是兼容的,但是卡本身的协议又有差别,发送相同的命令得到的回复是不一样的或者没有回复,我们是利用这个差别通过发送命令得到的回复来进一步判断是哪一种卡,进而针对这个卡类型(卡本身的协议)进行操作。
9.3、卡状态
发不同的命令会进入相应的状态,sd卡内部控制器就是一个状态机,通过命令进行状态的迁移。在不同的状态发送相同的命令回复是不同的,在本状态下也只能接受本状态下的命令,其他命令是没有回复的。
9.4、卡回复类型
我们发送的命令码,一般情况下都是有回复的,只有小个别没有回复,而每个命令码回复的信息位数可能是不相同的,是SD卡协议所规定好的,我们soc需要根据不同的回复类型进行读取解析。
10、SD/iNand代码实战分析2
10.1、linux内核风格的寄存器定义
(1)定义寄存器时一般通过定义一个基地址+和要访问这个寄存器相对于基地址的偏移量。
10.2、SD/iNand相关的GPIO初始化
10.3、SD/iNand相关的时钟系统设置
进行分频设置:
10.4、SD/iNand相关的时钟设置
(1)sd卡本身工作需要时钟,但是自己又没有时钟发生单元,依靠主机soc的控制器通过sd接口中的CLK线传一个时钟过来的sd卡内部使用。所以主机sd卡控制器先初始化好自己的时钟,然后将自己的时钟传给sd卡。
(2)因为此时刚开始和sd卡通信,主机不清楚sd卡属于哪个版本(不同版本使用的时钟不同,低版本的时钟不能工作在高时钟版本中),所以我们先设置一个较低的sd卡工作时钟400k,当sd卡工作起来后,再判断当前sd卡处于哪个版本,再根据版本再设置一个与其对应的时钟。
11、SD/iNand代码分析
11.1SD卡初始化过程图
11.2初始化代码映射
朱有鹏老师linux核心大讲堂---ARM裸机第十一部分 NandFlash和iNand学习笔记相关推荐
- jlink怎么调试linux程序_纯Linux下的 ARM裸机调试环境搭建(GDB + JLink)
一直想摆脱windows环境,在纯linux下进行arm裸机开发,但是由于一直不知道JLink如何在linux下运行和配置,一直无法进行下去. 以前都是windows+AXD调试.包括本人用的FL24 ...
- 鸟哥的Linux私房菜(基础篇)- 第十一章、认识与学习 BASH
第十一章.认识与学习 BASH 最近升级日期:2009/08/25 在 Linux 的环境下,如果你不懂 bash 是什么,那么其他的东西就不用学了!因为前面几章我们使用终端机下达命令的方式,就是透过 ...
- linux 备份文件时,目录下的个别文件不备份,【学习笔记】Linux TAR备份文件时排除指定文件...
天萃荷净 Oracle研究中心学习笔记:分享一篇关于Oracle数据库备份的笔记,该笔记记录使用linux tar备份数据库目录时指定排除不备份指定文件. 在升级或者打PSU的时候都需要对ORACLE ...
- 青岛大学_王卓老师【数据结构与算法】Week04_12_案例分析与实现2_学习笔记
本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频. 一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的<数据结构与算法>的学习视频. 如有侵权,请留言作删文处理. 课程视频 ...
- C语言学习——朱有鹏老师的课——天山老妖S的博文
文件来源于http://blog.51cto.com/9291927/category11.html (天山老妖S) 的博文 第一课 嵌入式linux C语言-位运算的使用 ARM是内存与IO统一编址 ...
- 朱有鹏-3.linux应用编程和网络编程-第3部分-3.3.获取系统信息
3.3.1.关于时间的概念 3.3.1.1.GMT时间 (1)GMT是格林尼治时间,也就是格林尼治地区的当地之间. (2)GMT时间的意义?[用格林尼治的当地时间作为全球国际时间],用以描述全球性的事 ...
- 看了朱有鹏老师嵌入式开发板刷机课程后总结
课程中刷机时用到的三种工具.SD卡,fastboot,dnw 首先是SD卡 SD卡主要应对的是iNand中uboot被破坏的情况,这种时候可以用电脑往SD卡中烧入uboot,然后插到开发板的SD2通道 ...
- 基于stm32mp157 linux开发板ARM裸机开发教程4:Cortex-A7 内核存储系统与流水线(连载中)
前言: 目前针对ARM Cortex-A7裸机开发文档及视频进行了二次升级持续更新中,使其内容更加丰富,讲解更加细致,全文所使用的开发平台均为华清远见FS-MP1A开发板(STM32MP157开发板) ...
- 基于stm32mp157 linux开发板ARM裸机开发教程3:Cortex-A7 架构与工作模式(连载中)
前言: 目前针对ARM Cortex-A7裸机开发文档及视频进行了二次升级持续更新中,使其内容更加丰富,讲解更加细致,全文所使用的开发平台均为华清远见FS-MP1A开发板(STM32MP157开发板) ...
最新文章
- silverlight 入门教程(六)
- 每日一皮:一个名字打败对手的经典案例...
- rocketmq发送顺序消息(四)
- npm安装包总是失败了的,请参考
- CompressAI:InterDigital开源基于学习的图像视频压缩研究库
- 组复制官方翻译六、Upgrading Group Replication
- ajax调用外域接口不进回调函数_网易实战分享云信IM SDK接口设计实践
- js调用后台,后台调用前台等方法总结
- optistruct入门推荐
- HIVE SQL 时间函数
- 详解springBoot集成activiti7,工作流实战案例(三)
- JavaSE重点之集合、IO、多线程
- 极客时间马哥教育-云原生训练营第一周作业-20221016
- Tkinter 学习笔记
- 三次埃尔米特插值一阶导数的求法
- 一个非IT人士修改网站的遍历之旅和心路历程
- Docker基本使用教程
- 好好学习,持续学习,才能持续赚钱
- java八进制转换器,Java将八进制转换为十进制
- Android基础——从存储介质打开文档