没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
基于 smdk2410 开发板 u-boot-1.2.0 对
nand flash 的支持
1. 预备知识
1.1. Nand Flash VS Nor Flash
性能比较:
flash 闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何 flash 器件的
写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。
NAND 器件执行擦除操作是十分简单的,而 NOR 则要求在进行擦除前先要将目标块内所有的位都写
为 0。
由于擦除 NOR 器件时是以 64~128KB 的块进行的,执行一个写入/擦除操作的时间为 5s,与此相
反,擦除 NAND 器件是以 8~32KB 的块进行的,执行相同的操作最多只需要 4ms。
执行擦除时块尺寸的不同进一步拉大了 NOR 和 NADN 之间的性能差距,统计表明,对于给定的一
套写入操作(尤其是更新小文件时更多的擦除操作必须在基于 NOR 的单元中进行。这样,当选择存储
解决方案时,必须权衡以下的各项因素。
● NOR 的读速度比 NAND 稍快一些。
● NAND 的写入速度比 NOR 快很多。
● NAND 的 4ms 擦除速度远比 NOR 的 5s 快。
● 大多数写入操作需要先进行擦除操作。
● NAND 的擦除单元更小,相应的擦除电路更少。
接口差别:
NOR flash 带有 SRAM 接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。
NAND 器件使用复杂的 I/O 口来串行地存取数据,各个产品或厂商的方法可能各不相同。8 个引
脚用来传送控制、地址和数据信息。
NAND 读和写操作采用 512 字节的块,这一点有点像硬盘管理此类操作,很自然地,基于 NAND 的
存储器就可以取代硬盘或其他块设备。
容量和成本
NAND flash 的单元尺寸几乎是 NOR 器件的一半,由于生产过程更为简单,NAND 结构可以在给定
的模具尺寸内提供更高的容量,也就相应地降低了价格。
NOR flash 占据了容量为 1~16MB 闪存市场的大部分,而 NAND flash 只是用在 8~128MB 的产
品当中,这也说明 NOR 主要应用在代码存储介质中,NAND 适合于数据存储,NAND 在 CompactFlash、
Secure Digital、PC Cards 和 MMC 存储卡市场上所占份额最大。
可靠性和耐用性:
采用 flahs 介质时一个需要重点考虑的问题是可靠性。对于需要扩展 MTBF 的系统来说,Flash 是
非常合适的存储方案。可以从寿命(耐用性)、位交换和坏块处理三个方面来比较 NOR 和 NAND 的可
靠性。
寿命(耐用性)
在NAND 闪存中每个块的最大擦写次数是一百万次,而 NOR 的擦写次数是十万次。NAND 存储
器除了具有 10 比 1 的块擦除周期优势,典型的 NAND 块尺寸要比 NOR 器件小 8 倍,每个 NAND 存储
器块在给定的时间内的删除次数要少一些。
位交换
所有 flash 器件都受位交换现象的困扰。在某些情况下(很少见,NAND 发生的次数要比 NOR 多),
一个比特位会发生反转或被报告反转了。
一位的变化可能不很明显,但是如果发生在一个关键文件上,这个小小的故障可能导致系统停机。
如果只是报告有问题,多读几次就可能解决了。
当然,如果这个位真的改变了,就必须采用错误探测/错误更正(EDC/ECC)算法。位反转的问题更多
见于 NAND 闪存,NAND 的供应商建议使用 NAND 闪存的时候,同时使用 EDC/ECC 算法。
这个问题对于用 NAND 存储多媒体信息时倒不是致命的。当然,如果用本地存储设备来存储操作
系统、配置文件或其他敏感信息时,必须使用 EDC/ECC 系统以确保可靠性。
坏块处理
NAND 器件中的坏块是随机分布的。以前也曾有过消除坏块的努力,但发现成品率太低,代价太高,
根本不划算。
NAND 器件需要对介质进行初始化扫描以发现坏块,并将坏块标记为不可用。在已制成的器件中,
如果通过可靠的方法不能进行这项处理,将导致高故障率。
易于使用
可以非常直接地使用基于 NOR 的闪存,可以像其他存储器那样连接,并可以在上面直接运行代
码。
由于需要 I/O 接口,NAND 要复杂得多。各种 NAND 器件的存取方法因厂家而异。
在使用 NAND 器件时,必须先写入驱动程序,才能继续执行其他操作。向 NAND 器件写入信息需
要相当的技巧,因为设计师绝不能向坏块写入,这就意味着在 NAND 器件上自始至终都必须进行虚拟
映射。
软件支持:
当讨论软件支持的时候,应该区别基本的读/写/擦操作和高一级的用于磁盘仿真和闪存管理算法
的软件,包括性能优化。
在 NOR 器件上运行代码不需要任何的软件支持,在 NAND 器件上进行同样操作时,通常需要驱动
程序,也就是内存技术驱动程序(MTD),NAND 和 NOR 器件在进行写入和擦除操作时都需要 MTD。
使用 NOR 器件时所需要的 MTD 要相对少一些,许多厂商都提供用于 NOR 器件的更高级软件,
这其中包括 M-System 的 TrueFFS 驱动,该驱动被 Wind River System、Microsoft、QNX Software System、
Symbian 和 Intel 等厂商所采用。
驱动还用于对 DiskOnChip 产品进行仿真和 NAND 闪存的管理,包括纠错、坏块处理和损耗平衡。
1.2. Nand Flash 在 u-boot 的读写实现
首先,我们来看一下三星 S3C2410 用户手册中对 nand flash 的描述。
手册中把 nand flash 的工作模式分为两种:自启动模式和一般的 nand flash 读写操作模式。在自启动
模式下,由于 nand flash 自身的特点不能够直接在芯片内部执行程序,因此在在 cpu 内核中内置了一
片 SRAM 配合 nand flash 实现自启动系统。系统加电,nand flash 存储空间的前 4kB 数据(也就是
u-boot 第一阶段)以硬件的方式被拷贝到 SRAM 中;然后 SRAM 中的 u-boot 代码开始执行,运行到
第二阶段把 nand flash 中 u-boot 的全部拷贝到 SDRAM 中继续执行,然后引导内核的启动和根文件
系统的挂载。
对于 nand flash 的基本读写操作模式,主要是关于 nand flash 的读写操作。我们可以知道,在
S3C2410 中 cpu 将 nand flash 看作一个外设,通过 nand flash 控制器控制 nand flash。对其的读写操作
都是通过向特定的寄存器中读写数据实现的。下面是在手册中切下来的两张图。
图表 1 nand flash 控制器的块状图
图表 2 nand flash 操作原理图
1.3. Nand flash 读写寄存器
NFCONF : nand flash 的配置寄存器
NFCMD : nand flash 命令寄存器,cpu 通过此寄存器向 nand flash 传递控制命令
NFADDR : nand flash 地址寄存器,cpu 通过此寄存器向 nand flash 传递地址
NFDATA : nand flash 数据寄存器,cpu 通过此寄存器向 nand flash 传递数据
NFSTAT : nand flash 状态寄存器,cpu 通过读取该寄存器获取 nand flash 当前状态
NFECC : nand flash ECC 寄存器,实现循环校验功能
Nand flash 读写模式下的管脚配置
D[7:0] : 数据/命令/地址 输入/输出端口(三线共享)
CLE : Command Latch Enable (output)
ALE : Address Latch Enable (output)
nFCE : NAND Flash Chip Enable (output)
nFRE : NAND Flash Read Enable (output)
nFWE : NAND Flash Write Enable (output)
R/nB : NAND Flash Ready/nBusy (input)
注:各寄存器的每个比特的具体含义不再赘述,参看 S3C2410 手册。
2. u-boot-1.2.0 对 Nand flash 的支持
2.1. Nand flash 启动
开发环境:
目标板硬件环境如下:CPU 为 ARM920T,SDRAM 为 K4S561632C,NAND 闪存为 64MB 的
K9F1208U0B。
主机软件环境为 Redhat9.0、 u-boot-1.2.0、cross-3.2(从下文知合适的版本真的很重要,第 3 节中使
用的是 ELDK-4.1)。
工作原理:
如果 S3C2410 被配置成从 NAND 闪存启动,上电后,S3C2410 的 NAND 闪存控制器会自动把
NAND 闪存中的前 4K 数据搬移到内部 RAM 中, 并把 0x00000000 设置为内部 RAM 的起始地址, CPU
从内部 RAM 的 0x00000000 位置开始启动。因此要把最核心的启动程序放在 NAND 闪存的前 4K 中。
由于 NAND 闪存控制器从 NAND 闪存中搬移到内部 RAM 的代码是有限的,所以, 在启动代码的
前 4K 里,必须完成 S3C2410 的核心配置,并把启动代码的剩余部分搬到 RAM 中运行。在 u-boot 中,
前 4K 完成的主要工作就是 u-boot 启动的第一个阶段(stage1)。
涉及文件:
Cpu/arm920t/start.S
Board/smdk2410/nand_read.c
Include/configs/smdk2410.h
具体启动程序移植:
(1)修改 cpu/arm920t/start.S 文件,因为 u-boot 的入口程序是/cpu/arm920t/start.S,故需在该程序中添加
Edited by Foxit Reader
Copyright(C) by Foxit Software Company,2005-2008
For Evaluation Only.
nand 闪存的复位程序,以及实现从 nand 闪存中把 u-boot 搬移到 RAM 中的功能程序。
在 ldr pc, _start_armboot 之前加入:
#ifdef CONFIG_S3C2410_NAND_BOOT
bl copy_myself @将代码从 nand flash 搬移到 RAM 中后,进入启动的第二阶
段
@ jump to ram
ldr r1, =on_the_ram
add pc, r1, #0
nop
nop
1: b 1b @ infinite loop
on_the_ram:
#endif
在_start_armboot: .word start_armboot 之后加入:
#ifdef CONFIG_S3C2410_NAND_BOOT
copy_myself:
mov r10, lr
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =0xf830 @ initial value
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]
bic r2, r2, #0x800 @ enable chip
str r2, [r1, #oNFCONF]
mov r2, #0xff @ RESET command
strb r2, [r1, #oNFCMD]
mov r3, #0 @ wait
1:add r3, r3, #0x1
cmp r3, #0xa
blt 1b
2:ldr r2, [r1, #oNFSTAT] @ wait ready
tst r2, #0x1
beq 2b
ldr r2, [r1, #oNFCONF]
orr r2, r2, #0x800 @ disable chip
str r2, [r1, #oNFCONF]
剩余26页未读,继续阅读
资源评论
camel_in_sand
- 粉丝: 1
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功