Chinaunix首页 | 论坛 | 博客
  • 博客访问: 154048
  • 博文数量: 72
  • 博客积分: 3680
  • 博客等级: 中校
  • 技术积分: 1051
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-22 13:51
文章分类
文章存档

2010年(72)

我的朋友

分类: 嵌入式

2010-10-11 16:24:16

如果内部没有ROM

ROM没有专门的bootloarder, 应该是只能从nor flash启动。

 

三星的2410可以从NF启动程序,它会把第一块的前4KB复制到内部SRAM中然后从SRAM执行,也就是说,你需要编写一个长度小于4K的引导程序,作用是将主程序拷贝到SDRAM中运行(NF地址不是线性的,程序不能直接运行,必须拷贝到线性RAM).   NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来。

 

NAND Flash地址线和数据线在一起,需要用程序来控制,才能出数据。

通俗的说,就是光给地址不行,要先命令,再给地址,才能读到NAND的数据。

而且都是在一个总线完成的。

nboot是从NAND flashimage到内存并执行,eboot是从以太网(用tftp)下载image到内存并执行。将nboot.nb0烧到第0块,将eboot.nb0烧到第2块。启动时nbootflash读出eboot并执行之,如何就可以通过pbnk.bin下载到目标板上执行了,开发机和目标板可以用交叉线直接连接。

 

nbootnand flash bootloader的意思。S3C2410可以直接从nand flash 启动,但是不能超过4knboot是系统启动后最先执行的代码,它有两种,一种是跳转到eboot;一种是跳转到nk。主要的功能其实是在eboot里。 

随着消费类电子产品包括 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 处正式开始执行。

阅读(904) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~