搜索
bottom↓
回复: 19

求解,2440在NAND启动方式下如何读取NOR FLASH?

[复制链接]

出0入0汤圆

发表于 2009-5-15 20:55:09 | 显示全部楼层 |阅读模式
我知道,在NOR启动下与GCS0连接的NOR FLASH被映射到BANK0上了,但如果从NAND 方式下启动,BANK0上的是2440上的4K RAM空间,但这时候NOR FLASH的地址到哪里去了?应如何读取?

还有,NOR FLAH在2440上只能挂载一片吗?能不能挂载多片?

2440可以支持两片的NAND吗,能不能在外围加些与非门的等的芯片解决?

2440可以在NOR FLASH上直接执行代码,可以把程序下到NOR 中运行,我想这只是简单的自动“读”操作;但如果对NOR FLASH 进行“写”等操作,应该还需要发一系列命令串。通过H——JTAG下程序至NOR中所需要的脚本文件就包含命令串吧。不知有没有理解错~~

一时间问了很多问题,抱歉~~
求各位路过大大指点,不胜感谢。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-5-15 23:44:48 | 显示全部楼层
在NOR启动下与GCS0连接的NOR FLASH被映射到BANK0上了,但如果从NAND 方式下启动,BANK0上的是2440上的4K RAM空间,但这时候NOR FLASH的地址到哪里去了?应如何读取?

      我也在想,不过看了手册,好像可以这样理解,SRAM 占用前1k地址,剩下的是NOR的??不知是否可以这样理解,需要试验


还有,NOR FLAH在2440上只能挂载一片吗?能不能挂载多片?

2440可以支持两片的NAND吗,能不能在外围加些与非门的等的芯片解决?

     如果是位扩展 8bits+8bits = 16bits 应该可以
     但如果是容量扩展就不好搞了,但是可以这样外边接译码器,用gpio帮助译码CS,在写地址前先根据地址范围通过gpio译码CS,然后读写,这样可以吧:)

2440可以在NOR FLASH上直接执行代码,可以把程序下到NOR 中运行,我想这只是简单的自动“ 读”操作;但如果对NOR FLASH 进行“写”等操作,应该还需要发一系列命令串。通过H——JTAG下程序至NOR中所需要的脚本文件就包含命令串吧。不知有没有理解错~~
      
      看了下手册,写NOR是有步骤的肯定是要发点命令什么,但是命令应该是CPU里的什么东西执行的,要刷NOR里的全部程序肯定是通过JTAG来出送命令的,可能是通过DEBUG命令进行的吧,看看ARM920T的技术参考手册也许能找到点线索。我猜的啊:)

出0入0汤圆

发表于 2009-5-16 07:55:05 | 显示全部楼层
用gpio 来做nand 的片选可能会在开机时导致nand 暂短的无效。
当然如果是nor启动这个就不是问题。
nand 启动的话片选如果用cpld 之类还是有可能的,也就是上电片选的高低状态一定要确定。GPIO要等cpu都init后才能确定。

出0入0汤圆

发表于 2009-5-16 17:50:45 | 显示全部楼层
回2L

有道理,我想应该是有办法的,用cpld太不划算了

出0入0汤圆

 楼主| 发表于 2009-5-17 00:49:40 | 显示全部楼层
我觉得如果是NAND启动,那是不可能读到NOR的,也没有必要。若2440上同时有NOR和NAND,这可以选择从NOR启动,这时候也可以读NAND。NAND启动是针对2440上只有NAND芯片而设计的。。

这里说一下我对RO,RW,ZI段的理解,希望指点一下。

这里仅讨论NOR启动。

RO段是只读代码,数据段,是用来加载的。比喻初始代码就是只读RO段。
RW段是可 读写 的数据段,像C中静态变量就放在这个地方。
ZI段是RW中要初始化为0的部分(这里最不能理解,希望指点一个)

通常在ADS里
R0 BASE 应设置为NOR 的起始地址(也可以设在SDRAM内,但事先要初始化)
RW BASE 应设置为SDRAM 的起始地址
入口地址与R0 BASE 的地址相同


为什么要这样设?
试想一下,如果把RW设在NOR内,在NOR中读可以,但写就不行了,这需要命令串的支持,所以程序一旦运行到RW段就会出现错误!
但将R0 段设在SDRAM内是可以的,因为SDRAM可随意读写。

在初始化代码中 有一段代码将|Image$$RO$$Limit|后的代码复制到以|Image$$RW$$Base|为起始地址的区域(ADS内设为SDRAM的起始地址),
可见在ADS里设的R0 BASE和RW BASE是程序的运行地址,并不是加载地址。 但不管怎么设, 加载 时|Image$$RW$$Base|都是紧跟|Image$$RO$$Limit|, |Image$$ZI$$Base|紧跟|Image$$RW$$Limit|,被全部下到NOR中了,但程序运行时需要RW段是在SDRAM里找(在ADS的RW BASE的设置)。
所以说程序加载和程序运行是两回事。
加载时R0 段,RW 段,ZI 段都在NOR内;但运行时R0在NOR内,RW,ZI 在SDRAM 内。

不知是否这样理解?望指点。

出0入0汤圆

发表于 2009-5-17 07:38:44 | 显示全部楼层
[如果是NAND启动,那是不可能读到NOR的,也没有必要.]

肯定能读到Nor ,有没有必要看你设计的功能。

另不用CPLD 你用74 搭个简单逻辑也可以。

RO,RW,ZI 理解大致是对的,但有的讲_法比较偏激些了

[加载和程序运行是两回事]
你如何来定义这2件事?

[ 加载 时|Image$$RW$$Base|都是紧跟|Image$$RO$$Limit|, |Image$$ZI$$Base|紧跟|Image$$RW$$Limit|]
如果用分散加载文件定义根本就没有这样的限定

[程序运行时需要RW段是在SDRAM里]
也可以在片内SRAM里,看你自己如何设计你的程序了

[加载时R0 段,RW 段,ZI 段都在NOR内;但运行时R0在NOR内,RW,ZI 在SDRAM 内]
加载时 可以认为还没有这些段的概念,运行时RO 也不见得是在Nor中。我们产品就是Nor启动 但ro就是设置在sdram地址中的。

出0入0汤圆

 楼主| 发表于 2009-5-17 13:40:04 | 显示全部楼层
谢谢LS的回答,使我对这些透彻了不少。

[加载和程序运行是两回事]
你如何来定义这2件事?

我先前理解是程序是先加载,再运行。加载时的RO地址与运行时RO 地址相同,但RW,ZI地址不同于运行时的RW,ZI地址(RW BASE内的设定)。

加载时 可以认为还没有这些段的概念
那么RW,ZI段是运行时再开辟的?

书上说:加载地址就是文件存储器中的存储地址,执行地址就是文件在运行时的地址。对于结构比简单的系统中,这两种地址是同一地址。
看了你的回答后,我猛然想到其实CPU一上电就自动执行程序了,那所谓“加载”是“运行”的一个环节(应该是这样理解吧),但有时为了提高运行速度,将在ROM里的程序移到比较高速的RAM中再运行,这时就造成了“加载”地址不同于“运行”地址。

但2440的初始化文件里并没有对RO段进行搬运,我想这会使程序执行变慢。但对RO段的搬运将比较复杂,这是我看大大们的回答知道的。
但对RW段,ZI段的搬运是必须进行的(只要程序是下到ROM内),RW,ZI的存储载体必须为可“读写”。

分散加载文件 现在我还有仔细看,如果是ADS的话应该使SCATTER描述文件吧。

出0入0汤圆

发表于 2009-5-17 14:26:44 | 显示全部楼层
对cpu 来讲没有 加载和程序运行 就是直接执行PC所指向的指令
也就没有啥RO RW

你讲的这些都是对C语言可能比较重要的run 环境。

CPU只存在上电后在那执行第一个指令的问题。

出0入0汤圆

 楼主| 发表于 2009-5-18 01:51:54 | 显示全部楼层
原来这样。谢谢!!

搞清楚这些段是什么含义后,我以前那个串口无法在超级终端上输出的问题也解决了。
原来问题就是我把唯一一个全局变量放到ROM内,导到串口无法使用。

出0入0汤圆

发表于 2009-5-18 06:34:14 | 显示全部楼层
如果你写在汇编中 添寄存器来实现串口出字符。
无论你ro rw 如何的错误,他都能出正确的结果。

但一定要把这汇编代码在link时定义到最前面

这样就算你 指定ro 0x30000000
这样的bin 烧到nand 都能出字符。

出0入0汤圆

 楼主| 发表于 2009-5-19 02:16:14 | 显示全部楼层
现在你说的情况我都不是很理解,看来我还没到那个地步~~

你说   如果你写在汇编中 添寄存器来实现串口出字符。
是指将变量放在寄存器中?

出0入0汤圆

发表于 2009-5-19 06:55:09 | 显示全部楼层
在汇编中
先init uart的寄存器
再把要发送字符填入uart的寄存器

出0入0汤圆

发表于 2009-5-21 19:48:39 | 显示全部楼层
如果用NAND启动,并且NOR存贮器在第0个BANK的时候,则读取不到NOR存贮器内容。今天测试出来的。
费了我两天时间,终于知道怎样让程序直接进入SDRAM中仿真调试了,为后面的工作打下基础。我不想总是来写程序进FLASH里面,速度和寿命都受影响!不过以后要做个引导程序将调试成功的代码写到SDRAM里面了,

出0入0汤圆

 楼主| 发表于 2009-5-23 02:27:54 | 显示全部楼层
我现在在写NAND 启动代码,结合SCATTER文件,如果写好了将代码发出来。。

出0入0汤圆

发表于 2009-5-23 04:23:10 | 显示全部楼层
我也在写,昨天才开始,刚调了一下,有点问题,不搞了,洗洗睡了 :)

出0入0汤圆

发表于 2009-9-17 11:01:29 | 显示全部楼层
“加载”和“运行”也困扰了我好长一段时间,现在也还不是非常了解,和大家一起学习学习

出0入0汤圆

发表于 2010-2-12 15:11:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-25 22:10:38 | 显示全部楼层
无意间百度出来了。。。说说nor和nand启动

把nor放在bank0那从nand启动肯定是读不到nor的。根据官方的数据手册,从nand启动必须要设置OM[1:0]=00,而bank0的数据宽度也是由OM[1:0]来决定,但是他只有两个模式01和10对应16-bit和32-bit。换句话说,假如设定了从nand启动,那nor的数据宽度就不合要求了这样是不可能访问nor成功的。

出0入0汤圆

发表于 2012-7-24 17:00:59 | 显示全部楼层
前辈你们好,我现在刚接触S3C2440,也在想这个问题。我的想法是:在Nand启动方式下Nor是不可以使用的,因为在Nand方式下内部RAM被映射到了0开始的位置也就是原来bank0的128M空间只有4KB的空间被使用了,剩下的空间不能被使用了,这在三星的数据手册第 194页的图5.1上面是有表现的。现在不明白的是如果是Nor启动的话,Nor仅是flash只读不可以写的,程序在里面运行的话变量是放在什么地方的呢,刚启动的时候SDRAM可能还没有初始化是不能够使用的,这是时候的数据是否应该放在内部RAM中呢,那么他的地址被映射到哪里呢,是从0x40000000开始吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 10:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表