Zynq 7000 系列之启动模式—NAND启动

news/2024/11/14 4:38:57/

NAND启动是一种使用NAND闪存进行设备启动的方式。NAND闪存是一种非易失性存储设备,广泛用于嵌入式系统、计算机和其他电子设备中。由于NAND闪存具有高速读写和较高的存储密度等特点,使得NAND启动成为了一种高效且常用的启动方式。

1 特点

NAND启动具有以下特点:

• 支持8位或16位NAND闪存设备
• 支持ONFI 1.0设备协议
• 坏块支持
• 1位硬件ECC支持

对于BootROM Header搜索功能,启动映像必须位于NAND闪存设备的前128MB地址空间内。

注意:BootROM以8位模式读取符合ONFI规范的参数信息,以确定设备宽度。如果设备是16位宽,那么BootROM将启用上部的八个I/O信号以形成16位数据总线。然而,在7z010双核和7z007s单核CLG225设备中,并不提供16位NAND接口。

8位和16位启动模式下的MIO引脚编程列于表6-11中。
在这里插入图片描述
从上述内容可以看出,NAND启动支持8位和16位NAND闪存设备,并且BootROM会根据设备的宽度来配置相应的数据总线。对于16位设备,BootROM会启用额外的I/O信号以支持16位数据总线。不过,并非所有设备都支持16位NAND接口。

2 优化NAND启动时间

为了优化NAND启动时间,可以采取以下措施:

提高时钟速率
通过增加NAND闪存的工作时钟频率,可以显著提高数据传输速度,进而减少启动时间。如果使用了更快的时钟,必须考虑使用更大的分频器,以确保系统的稳定性和可靠性。

优化I/O协议
通过优化NAND闪存的I/O协议,可以进一步提高数据传输效率和响应速度。这通常涉及调整相关的寄存器设置,以匹配NAND设备的特性和工作模式。

示例(下表)中的寄存器值可能并不适用于所有NAND设备或板卡布局。这些设置假设使用的是33 MHz的PS_CLK(处理器系统时钟)。
在这里插入图片描述

3 BootROM操作

BootROM针对三种闪存设备情况作出响应:

• 坏块处理:BootROM能够识别并跳过标记为坏的闪存块,从而确保读取和写入操作不会受到坏块的影响。

• ECC(错误检查和纠正):用于检测和纠正数据传输过程中可能出现的错误。通过应用ECC算法,BootROM能够识别并修复由于位干扰引起的数据错误,提高了数据的准确性和可靠性。

• 分区内存:BootROM能够将闪存分成多个逻辑分区,每个分区可以独立管理和使用。这种分区方式不仅优化了闪存空间的利用,还提高了数据访问的效率。同时,BootROM在分区时还会考虑坏块的存在,确保每个分区都能够避免使用坏块,从而进一步提高系统的稳定性和可靠性。

3.1 坏块管理

在坏块管理方面,BootROM采用了以下方法:

• 在NAND闪存设备的最后四个块中查找坏块表(BBT)。
• 支持主BBT(bad block table)和次BBT,并带有版本控制,以便安全地进行软件更新。
• 如果没有BBT,BootROM会扫描闪存并读取带外(out-of-band)信息,以确定坏块的位置。

BootROM只执行读取操作,不向闪存写入数据。

在读取NAND闪存时,BootROM会跳过在BBT或带外信息中标记为坏的块(如果BBT不存在)。例如,考虑一个闪存设备,其坏块位于块1和块3。在将映像编程到闪存设备时,必须跳过块1和块3。在读取时,BootROM会读取遇到的好块中的完整用户数据。

在这里插入图片描述
3.2 ECC(错误检查和纠正)管理

NAND控制器具备硬件级别的ECC管理能力,能够处理一定位数的错误。当NAND控制器检测到数据传输中的错误时,它会利用ECC算法进行错误纠正。这种能力使得系统能够在一定程度上容忍闪存中的错误,提高了数据的可靠性。

此外,对于支持片上ECC(on-die ECC)的NAND设备,BootROM能够识别并禁用控制器的ECC检查功能。这样做是为了让NAND设备自身负责ECC的管理,从而充分利用设备内部的ECC能力。片上ECC通常具有更高的纠正能力和效率,能够更好地保护数据的完整性。

总之,ECC管理在NAND闪存系统中是一个复杂而关键的过程。通过合理配置和使用ECC功能,可以确保数据的准确性和可靠性,提高系统的稳定性和性能。在实际应用中,需要根据具体的硬件和软件环境来选择合适的ECC管理策略,以达到最佳的效果。

3.3 内存分区

BootROM将NAND闪存视为一个连续的分区。从用户的角度来看,这主要影响Multiboot寄存器。写入Multiboot寄存器的值会根据目标地址前的坏块数量进行偏移。

考虑下面这个例子:
镜像包含两个Multiboot部分,镜像总大小为1MB,块大小为128KB,第二个Multiboot部分从512KB处开始,坏块位于128KB和256KB的偏移处。

在这个场景中,镜像应该被编程为一个分区,这导致第二个Multiboot部分的偏移总量为256KB(即两个块的大小)。当写入Multiboot寄存器时,它可以设置为512KB的偏移量,而BootROM会负责根据坏块的位置计算新的起始地址。

通过这种方式,BootROM为用户提供了一个简化的接口,隐藏了底层NAND闪存中坏块的复杂性。用户不需要直接处理坏块,而是可以通过设置Multiboot寄存器来指示BootROM从哪里开始加载镜像的不同部分。BootROM会自动考虑坏块的存在,并计算出正确的起始地址。

4 I/O信号时序

BootROM在smc.SET_CYCLES寄存器中使用以下NAND时序值:

• t_rr = 2:准备就绪到就绪时间(Ready to Ready time),表示从NAND设备准备好接收命令到再次准备好接收下一个命令的时间间隔。

• t_ar = 2:地址设置时间(Address Setup time),表示从地址信号开始有效到命令信号开始有效的时间间隔。

• t_clr = 1:清除命令时间(Clear Command time),表示从命令信号变为无效到地址和数据信号开始或继续变化的时间间隔。

• t_wp = 3:写保护时间(Write Protect time),表示在写操作期间保护信号应保持有效的时间。

• t_rea = 2:读访问时间(Read Access time),表示从发出读命令到数据开始可用的时间间隔。

• t_wc = 5:写周期时间(Write Cycle time),表示完成一个写操作所需的时间,包括命令、地址和数据的传输。

• t_rc = 5:读周期时间(Read Cycle time),表示完成一个读操作所需的时间,包括命令、地址的传输和数据的读取。

这些时序值用于确保NAND闪存设备与BootROM之间的通信是正确和高效的。它们定义了各种操作所需的时间间隔,以确保数据在正确的时刻被发送和接收,从而避免数据冲突或丢失。通过正确设置这些时序值,可以优化NAND闪存的性能并减少潜在的错误。


http://www.ppmy.cn/news/1445100.html

相关文章

Java List 获取部分组成new list,获取两个list相同/不同的内容

获取List中的一项 List<String> _outingCntry list.stream().map(OSzItem::getGroup). collect(Collectors.toList()); 获取List中的多项 List<vo> list new ArrayList<>(); Map<String, String> map list.stream().collect( Collectors.toMap(v…

密文域可逆信息隐藏技术综述(上)

加密图像可逆信息隐藏是一种加密原始图像后&#xff0c;在密文图像中可逆地隐藏附加数据&#xff0c;并且在数据提取后&#xff0c;原始图像可以被无损重建的技术。RDH-EI的分类如图1所示。 按对图像的加密方法&#xff0c;现有RDH-EI算法可分为对称加密域和非对称(公钥)加密域…

OSPF基本配置

原理概述 OSPF 是一种应用非常广泛的基于链路状态的动态路由协议&#xff0c;它具有区域&#xff08; Area )化的层次结构&#xff0c;扩展性好&#xff0c;收敛速度快&#xff0c;适合部署在各种规模的网络上。 在 OSPF 中&#xff0c;每台路由器都必须有一个 Router-I…

.net报错异常及常用功能处理总结(持续更新)

.net报错异常及常用功能处理总结---持续更新 1. WebApi dynamic传参解析结果中ValueKind Object处理方法问题描述方案1&#xff1a;(推荐&#xff0c;改动很小)方案2&#xff1a; 2.C# .net多层循环嵌套结构数据对象如何写对象动态属性赋值问题描述JavaScript动态属性赋值.net…

CentOS 7 安装 Puppeteer Google Chrome

由于需要使用到了 Puppeteer 功能&#xff0c;安装了多次失败而告终。最终找到了一个可以安装成功的方式&#xff0c;特此记录下来。 安装 Puppeteer 需要注意 Node.js 版本&#xff0c;我使用的是 16.x cnpm i puppeteer安装 Google Chrome 这里需要注意的一下是&#xff0c;…

介绍一个在数据分析中常用的函数:data.iloc[]

平时处理数据集中&#xff0c;总是需要选中一些列的数据&#xff0c;去预测其他列的数据&#xff0c;所以data.iloc[]&#xff0c;在数据分析中显得尤为方便。 介绍一下data.iloc[] data.iloc[] 是 Python 中 pandas 库的一个非常有用的功能&#xff0c;它允许你通过行和列的…

windows上通过定时任务提交新增文件到SVN(bat双击可执行,但是通过定时任务后无法提交到svn)

这个要必须记录一下了&#xff0c;因为折腾了蛮久断断续续加起来花费的有一天多时间。因为这个跟上篇定时备份是一个事来的&#xff0c;备份完了不可能留在跟数据库相同的机器吧&#xff0c;这样的话也起不到备份的作用啊&#xff0c;所以就想着让它每天去定时备份&#xff0c;…

【算法每日一练】动态规划,图论(换根dp)会议 ,医院设置

目录 题目&#xff1a; 会议 思路&#xff1a; 题目&#xff1a;医院设置 思路&#xff1a; 题目&#xff1a; 会议 思路&#xff1a; 首先&#xff0c;阅读题目可以看出来&#xff0c;这道题目实际上就是求树的重心。 树的重心&#xff1a; 定义&#xff1a;找到一个点&a…