nand flash boot

 

http://www.52rd.com/Blog/Detail_RD.Blog_foxice_10404.html

http://www.foxice.net/techinfo_nandboot1.asp

 

foxice 发表于 2007-8-27 15:29:00

1

随着消费类电子产品包括 PDA , MP3 、智能手机等手持设备的市场需求逐步扩大,产品间的竞争也愈发激烈,降低产品的设计成本,提升产品的市场竞争力成为嵌入式系统开发者所面临的重大挑战。 NAND FLASH 和 NORFLASH 作为两种主要的非易失性存储器,被应用于各种嵌入式系统。其中 NAND FLASH 主要优点在于存储密度高、容量大,有更占优势的存储性价比。但是 NANDFLASH 由于其独特的页式读写方式,并不适合程序的直接执行。因此,从 NAND FLASH 启动需要片上存储器作为代码执行的中转区。本文所讨论的一种系统启动方式,是在缺少片上存储器支持的情况下,实现系统直接从 NAND FLASH 启动。论文中充分考虑了如何实现软、硬件之间的协同工作,以完成 SOC 系统的设计。

2 NAND FLASH 控制器的结构

本文所讨论的 NAND FLASH 控制器是针对一款基于 ARM7TDMI 的 SoC 芯片,该控制器在芯片中的位置如图 1 所示,作为 AMBA 总线上的一个从设备集成于 AHB 上。主要模块包括总线接口模块、 FIFO 缓冲模块、 ECC 编码模块以及逻辑控制模块。

总线接口模块主要的功能是转换 AMBA 总线上的控制和数据信号:将总线上的数据送入 FIFO 或将数据从 FIFO 读出到总线上,将总线上的控制信号转换时序后送到控制模块。

NAND 控制器包含一个宽度为 32 b ,深度为 4 的缓冲 FIFO ,用于解决高速总线与低速设备之间数据传输速度的匹配问题。为提高总线的传输效率,以及控制器设计的便利性, NAND FLASH 在总线上的数据传输采用 DMA 的方式来完成。譬如在读取 FLASH 一页数据时,数据持续写入控制器 FIFO , FIFO 满时发出 DMA 传输的请求,同时暂停 FLASH 的数据读取,控制信号 nRE 拉高,直至 DMA 响应请求即 FIFO 不满时, FLASH 的数据传输重新开始。当选择应用的 FLASH 位宽为 8 ,页大小为 (512+16)B 时,控制器需要发出 (32+1) 次 4 拍字宽度的 DMA 传输请求来完成数据和校验信息的读取。

控制模块的上作主要是将总线接口转换的控制信号,按照 NAND FLASH 的接口协议.将片选、地址、命令、读写使能按照所配置的时序要求,发送到 NAND FLASH 中,并且控制数据的传输个数,以及 DMA 请求、数据传输完成中断、数据错误中断等系统信号。

NAND FLASH 可靠性相对较差,存储器芯片中有坏块的存在,会导致存储数据出错。 ECC 校验模块针对 NAND FLASH 的可靠性问题,提供了一种查错、纠错的机制。 ECC 校验码在数据读人时,由硬件计算完成后写入到 FLASH 的校验位中,当此页数据读出时,校验码再次生成与存储器校验位中的数据进行比较,若相同则没有损坏位,若不同,则给出出错中断,软件通过检查比较结果,判 断出错位的位置进行纠错处理。纠错功能仅针对单 bit 位的出错,当一个以上位同时在一页中出现时, ECC 校验不能给出出错位正确的位置。

3 NAND FLASH 工作的软件流程

按照上节对控制器结构以及传输机理的分析, NANDFLASH 的使用需要在 FLASH 控制器模块以及 DMA 控制器模块的协同下完成,工作的软件流程如图 2 所示。

软 件驱动的主要工作是配置 DMA 模块以及 FLASH 控制模块,当传输完成,检测到中断后,软件查询状态寄存器,其中的状态位来自 FLASH 。当一次操作完成后,控制器自动向 FLASH 发出查询状态的命令 0x70 ,读出的状态字保存在控制器的状态寄存器中。

4 NAND FLASH 系统启动的传统模式

目前支持从 NAND FLASH 启动的 SoC 芯片中,一般都内嵌有片内存储器。各个处理器厂商对这块片上存储器定义的容量大小有所不同,但是启动模式都是比较一致的。 NAND FLASH 按页顺序读取的方式,意味着对当前的存储地址访问后就无法马上再次访问,需在当前页访问完成后,重新对此页访问时,才可对先前的地址单元再次访问,这就导 致了一些程序语句无法执行,譬如跳转、循环等语句的使用。因此 NAND FLASH 仅作为启动代码的存储区,而真正执行的存储器区域是内嵌的片上存储器或者片外的 SDRAM 。

以上文中描述的控制器为例,按照这种启动模式,程序搬运以及执行的过程如下:

 


系 统上电前,外部硬线 NAND BOOT 开关选择从 NAND FLASH 启动。芯片设计时,默认 DMA 占有系统总线, DMA 按照配置寄存器的默认值工作,其源地址指向 NAND FLASH ,目标地址指向片上 SRAM , NANDFLASH 控制器在 NAND BOOT 选中的情况下,默认向 NAND FLASH 的首页发出读命令。即上电后, DMA 控制器以及 NAND FLASH 控制器默认的把 FLASH 存储器中的第一页搬到了片上 SRAM 中。一直到 DMA 的工作完成前, ARM 核无法占用总线。此时零地址映射在片上 SRAM , DMA 完成搬运后, ARM 开始执行程序。此段代码完成的工作包括对 SDRAM 控制器的初始化,从 NAND FLASH 搬运核心代码至 SDRAM ,配置地址重映射寄存器至零地址处,最后将 PC 指向零地址的 SDRAM 。在 SDRAM 执行的代码开始真正启动系统。

5 NAND FLASH 系统启动的新方法

一 般情况下,片上存储器在作为启动代码转移阶石的同时,往往在启动后也有其特殊的作用。可以作为特殊的程序区,譬如在进行 MP3 解码过程中,核心解码函数作为频繁调用的程序,可以安排在片上 SRAM 中,以提高读取速度,提升系统性能。在 SoC 芯片开发过程中,在整体架构以及模块功能的变化之后,这块内嵌的 SRAM 失去了原来的作用,而仅作为 NAND FLASH 启动时的代码跳板,对于整个芯片而言,付出的代价比较大。于是提出了在没有片上存储器的架构下,从 NAND FLASH 启动的一种新模式。

在 上述一般模式启动过程中,片上 SRAM 所起到的作用,就是执行 NAND FLASH 中第一页的代码,将真正的启动代码引入到 SDRAM ,最后将 PC 指针指向 SDRAM 。在失去片上 SRAM 的支持后,可以在控制器的 FIFO 中去执行此段代码,这需要在硬件以及软件代码中作出适当的改变。 (1) 首先需要改变的是地址映射的机制,系统上电后, ARM 即从零地址开始执行指令,零地址映射到 NAND FLASH 的 FIFO 入口地址,地址的译码过程由 AMBA 总线模块完成。在外部硬线 NAND BOOT 拉高的条件下, AMBA 从设备地址译码模块在启动过程中,将零地址的设备选择权给到缓冲 FIFO 。在第一页的指令执行完毕后, PC 指针也指向 SDRAM 。

(2) 其次是 NAND FLASH 控制器在启动过程中,对数据的读取方式。鉴于 NAND FLASH 大批量数据读写的特性,往往采用 DMA 方式对数据进行操作。启动过程中,由 ARM core 直接向 FIFO 读取数据,在 FIFO 读空的情况下,将从没备 READY 信号拉低,等待 NAND 中的数据读出。并且在此读取过程中, DMA 的请求被屏蔽。

(3) NAND FLASH 型号类型众多,从每页容量大小、数据宽度、地址级数以及各型号芯片不同的时序参数,决定了一个控制器接口的兼容性要求相当的高。为了兼容从不同的 NAND FLASH 启动,设置了 4 根硬线作为选择。 NAND BOOT 选择是否从 NAND FLASH 启动; PAGESIZE 选择每页大小,支持 512 B / page , 2 kB / page ; IOWIDE 选择数据端口的宽度,支持 8 位、 16 位; AD-DRESSCYCLE 选择发送地址级数,支持 3 级、 4 级、 5 级地址。时序参数的配置值可以采用默认的宽松值,在读取首页信息之后,将配置值根据当前的时钟频率以及芯片类型,选择舍适的时序值以达到最佳的性能。 (4) 存储器首页的代码是在缓冲 FIFO 中执行的, FIFO 的入口地址是一个高 24 位的选通地址,因此当系统启动时,零地址开始增加,对 FIFO 中读出的指令而言,低 8 位地址的变化是无关的, FIFO 始终被选通。指令的输出是默认的顺序输出。这就要求首页的代码中不可以出现循环、跳转等语句,并且要求在 128 条指令内完成需要的操作。

6 启动代码和流程的分析

上述的汇编程序即是存放在 NAND FLASH 首页的启动代码,启动的流程如下:

(1) 配置 DMA 控制器的 4 个寄存器,通道使能后,等待 FLASH 发出的搬运请求;

(2) 配置 NAND FLASH 控制器的 3 个寄存器,选择适合的地址、时序参数与所用的 FLASH 芯片吻合;

(3) 分别在 r8 ~ r11 中放入程序需要的备用值;

(4) 将需要在 SDRAM 中运行的 4 条指令搬入 SDRAM 0x30000000 处;

(5) 执行 Nop 指令, Nop 指令用于填充一页 NANDFLASH 中的剩余空间;

(6) 执行在页末的指令,将 PC 指针指向 SDRAM 的 0x30000000 处;

(7) 执行 SDRAM 中的指令,首先启动 NANDFLASH 的数据传输,将程序搬往 SDRAM 的 0x30001000 处。其次执行一个循环语句,等待第一页的程序搬完,之后将 PC 指针指向 0x30001000 处,启动程序从 0x30001000 处正式开始执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值