S5PV210的NandFlash:
关于Nand的基本知识:
1.NandFlash的型号和命名都是有意义的,K9F2G08,K9F表示是samsung系列的NandFlash,2G表示的是2Gbit = 256MByte,08表示的是8位的,也就是数据线有8根。
2.Nand有8bit数据位的,也有16bit位的,说明我们NandFlash是并行接口的,我们Nand 的数据线上传输的不一定都是有效数据,也有可能是命令、地址等
3.Nand中可以被访问的的最小单元(就是说对Nand进行一次读写至少要读写这么多,或者是这么多的整数倍),叫做Page(页),在K9F2G08芯片中,Page的大小是 2K + 64bytes,,,也就是说我们要读写K9F2G08,我们每次至少要读写(2K + 64)byte,或者 n * (2k + 64)byte,哪怕只读取其中的一个字节,也是同样要读这么多,这就是我们所说的块设备。(现在有些块设备为了方便,提供了一种random read模式,可以只读取1个字节)。
4.页往上还有个Block(块)的概念,1个块等于若干个页(譬如在K9F2G08中1个块等于64页),1block = (128K + 4K) Bytes
5.块block往上就是整个Nand芯片了,叫做device,一个Device是若干个Block,譬如K9F2F08一个Device有2048个block。所以整个Device大小为:2048×64×2K = 256M
2k是存储空间,64是数据校验和坏块管理相关的。实际上:1 Device = (2K+64)B x 64Pages x 2048 Blocks = 2112 Mbits = 264MBytes。
6.块设备分page、block有什么意义?首先要明白,块设备不能完全按字节访问而必须块访问是物理上的限制,而不是人为设置的障碍。其次,Page和Block各有各的意义,譬如Nand中:Page是读写Nand的最小单位;Block是擦除Nand的最小单位。(这些规则都是Nand的物理原理和限制要求的,不是谁想要这样的,所以对于我们做软件的来说,只能去想办法适应硬件,不是想着超越硬件)。
7.Nand芯片中主要包含2部分:Nand存储颗粒+Nand接口电路。存储颗粒就是纯粹的Nand原理的存储单元,类似于仓库;Nand接口电路是用来管理存储颗粒,并且给外界提供一个统一的Nand接口规格的访问接口的
8.Nand中有多个存储单元,每个单元都有自己的地址(地址是精确到字节的)。所以Nand是地址编排精确到字节,但是实际读写却只能精确到页(所以Nand的很多操作都要求给的地址是页对齐的,譬如2K、4K、512K等这样的地址,不能给3000B这样的地址)。Nand读写时地址传递是通过IO线发送的,因为地址有29位而IO只有8位,所以需要多个cycle才能发送完毕。一般的Nand都是4cycle或者5cycle发送地址(从这里把Nand分为了4cycle Nand和5cycle Nand)。
总结:Nand芯片内部有存储空间,并且有电路来管理这些存储空间,向外部提供统一的Nand接口的访问规则,然后外部的SoC可以使用Nand接口时序来读写这个Nand存储芯片。Nand接口是一种公用接口,是一种标准,理论上来说外部SoC可以直接模拟Nand接口来读写Nand芯片,但是实际上因为nand接口对时序要求非常严格,而且时序很复杂,所以一般的SoC都是通过专用的硬件的Nand控制器(这些控制器一般是作为SoC的内部外设来存在的)来操控Nand芯片的。


添加:
1.Nand的单元组织:block与page(大页Nand与小页Nand),Nand的页和以前讲过的块设备(尤其是硬盘)的扇区是类似的。扇区最早在磁盘中是512字节,后来也有些高级硬盘扇区不是512字节而是1024字节/2048字节/4096字节等。Nand也是一样,不同的Nand的页的大小是不同的,也有512字节/1024字节/2048字节/4096字节等。
一个block等于多少page也是不定的,不同的Nand也不同。一个Nand芯片有多少block也是不定的,不同的Nand芯片也不同。
总结:Nand的组织架构挺乱的,接口时序也不同,造成结构就是不同厂家的Nand芯片,或者是同一个厂家的不同系列型号存储容量的nand接口也不一样。所以nand有一个很大的问题就是一旦升级容量或者换芯片系列则硬件要重新做、软件要重新移植。
2.Nand的每个页由2部分组成,这2部分各自都有一定的存储空间。譬如K9F2G08中为2K+64字节。其中的2K字节属于带内数据,是我们真正的存储空间,将来存储在Nand中的有效数据就是存在这2K范围内的(我们平时计算nand的容量时也是只考虑这2KB);64字节的带外数据不能用来存储有效数据,是作为别的附加用途的(譬如用来存储ECC数据、用来存储坏块标志等····)
3.什么是ECC:(error correction code,错误校验码)。因为nand存储本身出错(位反转)概率高(Nand较Nor最大的缺点就是稳定性),所以当我们将有效信息存储到Nand中时都会同时按照一定算法计算一个ECC信息(譬如CRC16等校验算法),将ECC信息同时存储到Nand这个页的带外数据区。然后等将来读取数据时,对数据用同样的算法再计算一次ECC,并且和从带外数据区读出的ECC进行校验。如果校验通过则证明Nand的有效数据可信,如果校验不通过则证明这个数据已经被损坏(只能丢弃或者尝试修复)。
4.坏块标志:Nand芯片用一段时间后,可能某些块会坏掉(这些块无法擦除了,或者无法读写了),nand的坏块非常类似于硬盘的坏道。坏块是不可避免的,而且随着Nand的使用坏块会越来越多。当坏块还不算太多时这个Nand都是可以用的,除非坏块太多了不划算使用了才会换新的。所以我们为了管理Nand发明了一种坏块标志机制。Nand的每个页的64字节的带外数据中,我们(一般是文件系统)定义一个固定位置(譬如定位第24字节)来标记这个块是好的还是坏的。文件系统在发现这个块已经坏了没法用了时会将这个块标记为坏块,以后访问nand时直接跳过这个块即可。
5.NandFlash的常见操作及流程分析
Flash使用之前要先统一擦除(擦除的单位是块)。Flash类设备擦除后里面全是1,所以擦干净之后读出来的值是0xff。
检查坏块的思路就是:先块擦除,然后将整块读出来,依次检测各自节是否为0xff,如果是则表明不是坏块,如果不是则表明是坏块。
6.页写(program)操作
写之前确保这个页是被擦除干净的。如果不是擦除干净的(而是脏的、用过的)页,写进去的值就是错的,不是你想要的结果,写操作(write)在flash的操作中就叫编程(program)
写操作(write)在flash的操作中就叫编程(program)
SoC写Flash时通过命令线、IO线依次发送写命令、写页地址、写数据等进入NandFlash。
7.写的过程:
SOC通过Nand控制器和Nand芯片完成顺序对接,然后按照时序要求将一页数据发给Nand芯片内部的接口电路。接口电路先接收收据到自己的缓冲区,然后再集中写入Nand芯片的存储区域中。Nand接口电路将一页数据从缓冲区中写入Nand存储系统中需要一定的时间,这段时间Nand芯片不能再响应SOC发过来的其他命令,所以SoC要等待Nnad接口电路忙完。等待方法是SoC不断读取状态寄存器(这个状态寄存器有2种情况:一种是SoC的Nand控制器自带的,另一种是SoC通过发命令得到命令响应得到的),然后通过检查这个状态寄存器的状态位就能知道Nand接口电路刚才写的那一页数据写完了没、写好了没。直到SoC收到正确的状态寄存器响应才能认为刚才要写的那一页数据已经ok。(如果SoC收到的状态一直不对,可以考虑重写或者认为这一页所在的块已经是坏块,或者整个Nand芯片已经挂掉了)。
正常情况下到了第四步就已经完了。但是因为Nand的读写有不靠谱情况,因此我们为了安全会去做ECC校验。ECC校验有硬件式校验和软件式校验2种。软件式校验可以采用的策略有很多,其中之一(Nand芯片手册上推荐的方式是):将刚才写入的1页数据读出来,和写入的内容进行逐一对比。如果读出的和写入的完全一样,说明刚才的写入过程正确完成了;如果读出来的和写入的不完全一样那就说明刚才的写入有问题。
硬件式ECC:SoC的Nand控制器可以提供硬件式ECC(这个也是比较普遍的情况)。硬件式ECC就是在Nand的控制器中有个硬件模块专门做ECC操作。当我们操作Nand芯片时,只要按照SoC的要求按时打开ECC生成开关,则当我们写入Nand芯片时SoC的Nand控制器的ECC模块会自动生成ECC数据放在相应的寄存器中,然后我们只需要将这生成的ECC数据写入Nand芯片的带外数据区即可;在将来读取这块Nand芯片时,同样要打开硬件ECC开关,然后开始读,在读的过程当中硬件ECC会自动计算读进来的一页数据的ECC值并将之放到相应的寄存器中。然后我们再读取带外数据区中原来写入时存入的ECC值,和我们刚才读的时候得到的ECC值进行校验。校验通过则说明读写正确,校验不通过则说明不正确(放弃数据或者尝试修复)。
8.擦除(erase)操作
擦除时必须给块对齐的地址。如果给了不对齐的地址,结果是不可知的(有些Nand芯片没关系,它内部会自动将其对齐,而有些Nand会返回地址错误)。
9.页读、写(read、write)操作
读写时给的地址是要求是页对齐地址。如果给了不对齐的,也是有可能对有可能错。


K9F2G08引脚的作用:

9.IO上发送地址、命令和数据:WE上上升沿的前提下,当 ALE 引脚为高电平时传输的是地址。相应地,当 CLE引脚为高电平时传输的是命令,当 ALE 和 CLE 都为低电平时,传输的是数据
10.有一个引脚用来判断 CPU 是否能够对 NAND FLASH 进行读写?这
个引脚是 R/nB,当这引脚为高电平时,表示 NAND FLASH 已就绪;当这个引脚
为低电平时表示 NAND FLASH 正忙。


K9F2G08 Nand的结构框图:

11.A0 - A11表示的是Y-Buffers(多少列), A12 - A28表示的是X-Buffers(多少行),Command Register 用于命令字,不同的 NAND FLASH 都有不同的命令寄
存器.大小为2112 Mbits=264Mbyte=256Mbyte是 + 8Mbyte,256Mbyte的存储空间 + OOB区,OOB是和坏块管理和ECC相关的,


K9F2G08的存储结构:

1Page = 2k + 64 bytes
1block = 64 x page = 128k + 4k bytes
1device = 64 x 2048 block = 2112Mbit = 264Mbytes
所以存储区是256Mbytes,8M的OOB
12.对于 NAND FLASH 的访问方法, 我们需要了解其命令字和操作方法。操作
NAND FLASH 的时候,先传输命令,接着传输地址,然后才读写数据,中间需
要根据 R/nB 引脚来判断 FLASH 的忙闲。对于 K9F2G08 而言,它的容
量为 256MB,需要一个 29 位的地址。发出命令后,后面紧跟着 5 个地址序列。
如往 NAND FLASH 写数据时,发出相应的写命令后,跟紧着发出 5 个地址序列,
后续的写操作就可以往这个地址里写数据了。


K9F2G08的命令设置:
Nand的命令码:外部SoC要想通过Nand控制器来访问Nand(实质就是通过Nand接口),就必须按照Nand接口给nand发送命令、地址、数据等信息来读写Nand。Nand芯片内部的管理电路本身可以接收外部发送的命令,然后根据这些命令来读写Nand内容与外部SoC交互。所以我们对nand进行的所有操作(擦除、读、写···)都要有命令、地址、数据的参与才能完成,而且必须按照Nand芯片规定的流程来做。
例如我们要read,第一个cycle发00h,第二个周期发30h
Reset这个设备,第一个cycle发ffh,
在 S5PV210 底层编程中,只需要往 NFCMMD 寄存器写入上述相应值,
NAND FLASH 控制器就会自动执行相应动作


K9F2G08的地址发送如下图:
Nand的地址时序,nand的地址有多位,分5周期通过IO引脚发送给Nand芯片来对Nand进行寻址
A0 - A11表示的是Y-Buffers(列地址), A12 - A28表示的是X-Buffers(行地址)
L 表示必须置为 0,超出上图的地址序列,设备将会忽略不处理
在 S5PV210 底层编程中,只需要分 5 步将地址值写入 NFADDR 寄存器,
NAND FLASH 控制器会自动地找到相应的地址值


K9F2G08的页内组织结构:
这个图是我在别的文档上面看到的,对应的是K9F4G08这个芯片:

每一页大小由 2048B 的 Main 域 + 64B 的 Spare 域.
Main 域分为 4 个扇区,每个扇区的大小为 512B
Spare 域分为 4 个小扇区,每个小扇区的大小为 16B
每一页之所以分为更小的空间是为了提高查询效率, OOB 区在这里也称为
Spare 域,主要用来存放文件系统的信息、 ECC 校验信息、数据的格式等等

NandFlash基础知识-K9F2G08相关推荐

  1. NandFlash基础知识

    1.存储介质 存储介质按物理材料的不同可分为三大类:光学存储介质.半导体存储介质和磁性存储介质. 最早的SSD使用DRAM来作为存储介质 SSD一般采用NAND闪存芯片作为存储介质 2. Nand f ...

  2. Nand Flash基础知识与坏块管理机制的研究

    概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...

  3. linux挂载fc存储有超级坏块_Nand Flash基础知识与坏块管理机制的研究

    欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多 ...

  4. NandFlash驱动移植基础知识

    NandFlash驱动移植基础知识 文章借鉴博文:http://blog.csdn.net/leibniz_zsu/article/details/4977842 博文写的不错,谢谢分享 MTD 驱动 ...

  5. 重磅:服务器基础知识全解终极版(145页PPT)

    重磅:服务器基础知识全解终极版(145页PPT) 2020-12-26   阅 1  转 19 终极版来啦,本文内容共145页PPT干货,针对历史发布内容在CPU.内存.GPU.硬盘.网卡等9个章节做 ...

  6. 嵌入式Linux的OTA更新,基础知识和实现

    嵌入式Linux的OTA更新,基础知识和实现 OTA updates for Embedded Linux, Fundamentals and implementation 更新的需要 一旦嵌入式Li ...

  7. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  8. 嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...

    注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...

  9. 《计算机网络应用基础》模拟试卷(六),《计算机与网络应用基础知识1》模拟试卷...

    <计算机与网络应用基础知识1>模拟试卷 (4页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 <计算机与网络应用基础知识1& ...

最新文章

  1. 最新全球自由职业技能单日排行
  2. 数字进度条组件NumberProgressBar
  3. 软件测试报告重点审核点有哪些,软件测试-测试报告.doc
  4. 前后端分离项目后端向前端返回压缩包的方法实现java版
  5. linux密码忘记grub登陆,Linux忘记密码后使用grub重置密码
  6. 2020计算机语言排行 rust,RedMonk 2020 年 Q3 编程语言排行:Rust 首次进入前 20
  7. 如何清理和维护计算机,电脑的优化与维护操作教程
  8. Python3 捕捉异常
  9. JS 获取随机颜色值
  10. 2016-7-3 linux学习笔记
  11. 【Unity】12.2 导航网格寻路简单示例
  12. 中常用的数据结构_代码面试需要知道的8种数据结构(附面试题及答案链接)
  13. Idea的JShell Console
  14. 金九银十,23届秋招信息超全汇总表!各大名企优质岗位持续更新中···
  15. R语言之dpqr概率函数
  16. 19108期计算机开机号,排列三19108期藏机图诗汇总
  17. 云计算平台项目团队组织架构与缘起
  18. matlab基础----复数表示
  19. 男生停止长高的迹象是真的吗?
  20. fl2440——u-boot启动过程的简要分析

热门文章

  1. 2022氯化工艺考试题库及答案
  2. 分享6款好用并免费的远程管理工具
  3. uniapp教室实验室会议室预约app源码
  4. [GIS] 火星坐标GCJ-02的实质 | 高德地图的实际坐标系
  5. 稳压二极管与TVS管
  6. ffmpeg mkv 转 MP4
  7. max31865模块 PT100测温 PT1000测温 接线说明要点说明 使用说明 程序 单片机
  8. Blender软件使用Maps Models Importer插件导入Google地图3d模型(非常简单)
  9. FCES2019 panel5:北大、南大、浙大的人工智能课程是如何建设的?
  10. 房贷计算器(包含商业贷款和公积金贷款) 两种思路