6410 MLC 如何才能从nandflash启动
各位老大,最近我刚开始研究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方式,有没有必要?
要设置NAND启动要将相关设置启动模式及设置NAND访问PAGE页大小、地址周期等几个管脚进行硬件上的拉高或者拉低,这样系统启动的时候才能正确地从NAND中读取到stepldr。
1、CPU启动时从NAND中读取的8K stepstone时似乎是没有进行ECC校验的,所以前8K内容如果出现ECC不对应该没有关系,除非写的时候就没写成功,或者写进去的数据是错的。
2、你的分层是指two plane programe吗?stepldr通常都不采用这种方式。
3、如果spare空间够大,从eboot开始的代码通常都会对spare区的数据也进行ECC校验,进一步保证数据的正确性。
不知道启动模式设定是指那块,我对这些都不是很熟悉,是指OM[4:0]的设置么,根据K9GAG08U0M,1Page是4096+128,5-Cycle选的应该是0011X;
按照你说的读取8K stepstone时不需要校验,那是不是我写stepldr的地址不对,我是直接对block0的0地址开始写的;
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区的校验,如文档所写的
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,而且也没有分层,有没有问题?
还有一点我比较奇怪,OM[4:0]设置成x111x,GPN[15:13]无论设置成什么,只要SD卡在就能起来,这个现象正常么
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启动。
我在stepldr中加了亮灯,出现了另外的问题
1。加载stepldr.nb0,startup.s之一执行到bl main之后就没有反应了
2。加载stepldr.bin或NBL1.nb0直接就挂了
你的stepldr.nb0有效代码有没有超过8K?
NAND_Steploader_Write()一次只能写一个page,楼主确认有烧全吗?
谢谢提醒,我本来奇怪为什么我的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仍然没有看到什么反应,有没有什么建议?
引用: 引用 11 楼 jyoshou 的回复:
COMPRESSION =ON,可以运行到main(),看到"Launch Eboot...";
可以看到這句話,說明NBL2已經結束了。開始跳轉到EBOOT,如果Eboot沒有起來,是不是你在NAND中讀取Eboot的位置錯誤??
引用: 引用 11 楼 jyoshou 的回复:
为什么我设置 ROMSIZE = 00002000时启动一点反应也没有;控制stepldr的生成大小主要是那部分控制?
ROMSIZE没错,你设置以后可以看一下NBL1.nb0文件,文件大小有改变,NB0文件才是最原始的image文件。
烧写EBOOT.NB0到NAND中我试过可以,BIN却不行,
有空帮我回答一下这个问题:http://topic.eeworld.net/u/20100209/20/44df0fe6-863f-4972-b3c5-b838d59fa4f3.html?52048
如何烧写0block做nand的引导启动,是否需要ecc校验方式来烧写,还是直接烧?
我这几天也在搞NAND启动,可以加我qq281453291 一起研究。
可能是因为stepldr是拿FMD版本改的,读eboot时的地址顺序不对,拿NBL1生成文件下载进去后出现进入不了main函数,NBL1生成3个文件.nb1--.nb3超过8k,nbl1.bib中COMPRESSION = ON,求教怎样才能把它压缩到8k