6410 MLC 如何才能从nandflash启动

jhpotter   2010-2-4 16:30 楼主
各位老大,最近我刚开始研究6410的板子,手头上现有三星6410 PM 090416的BSP包,Nandflash型号是K9GAG08U0M 2G,用PM的包现在可以采用iRom方式从SD卡启动,但下载stepldr和Eboot不能从Nandflash启动,有谁知道都会有什么原因导致出现这个情况,我曾怀疑是烧写时校验码不对,但又不知道该怎么去判断,有几个问题请熟悉的人帮忙确认一下

1。PM包中whimory里用NAND_Steploader_Write()函数烧写stepldr,看到有烧写进去,但读出来的ECC校验布局好像不对,三星PM文档中MLC spare只有4Bit的校验方式的布局,8Bit ECC的校验格式应该是怎样的?
   4Bit每个Sector(512Kbyte)生成8byte ECC,8Bit是生成的有13Byte

2。MLC写stepldr/block0image需不需要分层写?
   BSP_IROMBOOT = 1 时用NAND_Steploader_Write写入没有分层,stepldr直接写了8个Sector
   BSP_IROMBOOT =   时用NAND_Write写入有分层,分别写入block0和block1中的头4个Sector

3。看到三星文档上有介绍在写spare时好像还需要对其自身写入内容进行自校验,还要采用24Byte方式,有没有必要?

回复评论 (20)

要设置NAND启动要将相关设置启动模式及设置NAND访问PAGE页大小、地址周期等几个管脚进行硬件上的拉高或者拉低,这样系统启动的时候才能正确地从NAND中读取到stepldr。
1、CPU启动时从NAND中读取的8K stepstone时似乎是没有进行ECC校验的,所以前8K内容如果出现ECC不对应该没有关系,除非写的时候就没写成功,或者写进去的数据是错的。
2、你的分层是指two plane programe吗?stepldr通常都不采用这种方式。
3、如果spare空间够大,从eboot开始的代码通常都会对spare区的数据也进行ECC校验,进一步保证数据的正确性。
点赞  2010-2-4 17:07
不知道启动模式设定是指那块,我对这些都不是很熟悉,是指OM[4:0]的设置么,根据K9GAG08U0M,1Page是4096+128,5-Cycle选的应该是0011X;
按照你说的读取8K stepstone时不需要校验,那是不是我写stepldr的地址不对,我是直接对block0的0地址开始写的;

点赞  2010-2-4 17:49
帮顶下,

MARK,学习下。
点赞  2010-2-4 17:50
OM[4..0]应该为00010,
1. 8bit ECC是每一个secotr生成13Byte没错。在128byte的Spare区的布局就是8个sector的校验码8×13,后面补0xFF
2. Block0不需要分层操作,直接写Block0的前面8个sector即可。
3. block0采用8bit ECC校验,没有对spare区进行校验。因为前面2个page是直接由CPU读取,不需要ECC校验。后面4bit ECC的代码,一般有对Spare区的校验,如文档所写的
点赞  2010-2-4 18:10
PM包里默认的就是写8*13个校验码,后面也是补足0xFF,写进去的ECC校验码我也确认过,OM[4:0]也设置过0x0010,但就是启不来,一点反应都没有.

NBL1和NBL2生成的Block0image.nb0,我也下载试过同样也没有反应, 按我的理解NBL1应该相当于stepldr放入page0和page1,NBL2从第6page开始写入,NBL2用什么方式校验8Bit么?PM包里默认block0image.nb0同样是用NAND_Steploader_Write写入,也就是8Bit,而且也没有分层,有没有问题?
点赞  2010-2-5 09:05
还有一点我比较奇怪,OM[4:0]设置成x111x,GPN[15:13]无论设置成什么,只要SD卡在就能起来,这个现象正常么
点赞  2010-2-5 09:11
LZ的GPC[5..7]为011,没问题吧。

NBL1的位置没错,NBL2的位置要看你NBL1中代码的设置了。
另外有加调试信息打印吗?NBL1是否有起来???

你可以先调一下NBL1看看:
1. 烧写进入Nand以后,再读出来看看,Block0的page0和Page1中这8k数据是否跟烧入的一样?

2. 上电后用AXD之类Jtag工具看看RAM地址为0-2000的代码(CPU自动加载的地方)是否跟Block0image.nb0前面两个page一样??如果一样,说明已经有加载进去了。并且是nand启动。

点赞  2010-2-5 09:17
我在stepldr中加了亮灯,出现了另外的问题

1。加载stepldr.nb0,startup.s之一执行到bl main之后就没有反应了

2。加载stepldr.bin或NBL1.nb0直接就挂了
点赞  2010-2-5 14:04
你的stepldr.nb0有效代码有没有超过8K?
点赞  2010-2-5 14:47
NAND_Steploader_Write()一次只能写一个page,楼主确认有烧全吗?
点赞  2010-2-5 16:31
谢谢提醒,我本来奇怪为什么我的stepldr.nbx生成到stepldr.nb3,我试着将stepldr.bib中COMPRESSION = ON,可以运行到main(),看到"Launch Eboot...";目前又卡到找不到eboot,有什么原因么,我的LOAD_ADDRESS_PHYSICAL=IMAGE_EBOOT_PA_START,按正常应该没有问题才对,还有几个问题需请教一下

1.我看文档上写6410好像支持stepstone 8K,为什么我设置 ROMSIZE = 00002000时启动一点反应也没有;控制stepldr的生成大小主要是那部分控制?我的stepldr.bib如下
    STEPLDR     00000000    00002000    RAMIMAGE        ; Image    : 8 KB (in Stepping Stone)
    RAM         500F0000    0000C000    RAM             ; RAM      : 48 KB
    STACK       500FC000    00004000    RESERVED        ; Stack    : 16 KB (sharing with Eboot)
    ROMSTART = 00000000
    ROMWIDTH = 32
    ROMSIZE = 00001000

2.我只能下载eboot.bin,而且并未看到在eboot中加的亮灯,下载地址80030000,偏移为0,用的仍然是PM包里EBOOT.WHIMORY生成的eboot文件;

3.我的NBL1仍然没有看到什么反应,有没有什么建议?
点赞  2010-2-7 20:12
学习学习,呵呵。
点赞  2010-2-8 05:52
引用: 引用 11 楼 jyoshou 的回复:
COMPRESSION =ON,可以运行到main(),看到"Launch Eboot...";

可以看到這句話,說明NBL2已經結束了。開始跳轉到EBOOT,如果Eboot沒有起來,是不是你在NAND中讀取Eboot的位置錯誤??

引用: 引用 11 楼 jyoshou 的回复:
为什么我设置 ROMSIZE = 00002000时启动一点反应也没有;控制stepldr的生成大小主要是那部分控制?

ROMSIZE没错,你设置以后可以看一下NBL1.nb0文件,文件大小有改变,NB0文件才是最原始的image文件。

点赞  2010-2-8 15:59
烧写EBOOT.NB0到NAND中我试过可以,BIN却不行,

有空帮我回答一下这个问题:http://topic.eeworld.net/u/20100209/20/44df0fe6-863f-4972-b3c5-b838d59fa4f3.html?52048
如何烧写0block做nand的引导启动,是否需要ecc校验方式来烧写,还是直接烧?
点赞  2010-2-10 07:38
我这几天也在搞NAND启动,可以加我qq281453291 一起研究。
点赞  2010-2-10 19:17
帮顶下,

MARK,学习下。
点赞  2010-2-13 09:40
可能是因为stepldr是拿FMD版本改的,读eboot时的地址顺序不对,拿NBL1生成文件下载进去后出现进入不了main函数,NBL1生成3个文件.nb1--.nb3超过8k,nbl1.bib中COMPRESSION = ON,求教怎样才能把它压缩到8k
点赞  2010-2-21 14:49
学习一下,没弄过。

mark
点赞  2010-2-21 15:07
只是玩玩SLC的NAND FLASH.
点赞  2010-2-22 10:04
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复