6410 wince6.0 8G Nandflash的烧写,从SD卡能启动并能进入OS,但是烧写EBoot出错。

时间:2022-12-29 19:24:32
大家好,最近在调试6410 wince6.0 8G Nandflash。现在的情况是从SD卡启动,能够烧写block0img.nb0,但是烧写Eboot.bin的时候出错:
[0]: Address=0x80030000  Length=0x5C6A4  Name="" Target=RAM
ROMHDR at Address 80030044h
Write Eboot image to BootMedia 
ImageLength = 378532 Byte 
Start Block = 3, End Block = 3, Block Count = 1
Bad Block 3 Skipped
Bad Block 4 Skipped
Bad Block 5 Skipped
Bad Block 6 Skipped
Bad Block 7 Skipped
Bad Block 8 Skipped
Bad Block 9 Skipped
Write RAW image to BootMedia Failed !!!
Too many Bad Block
ERROR: OEMLaunch: Failed to store image to Smart Media.
ERROR: OEMLaunch: Halting...
SpinForever...
出错后直接烧写NK.bin居然也能够进入系统。但是从Nandflash启动就不行,从NAND启动出现:
[NBL2] ++ShadowEboot()
[NBL2:ERR] ShadowEboot() Critical Error
[NBL2:ERR] Too many Bad Block
[NBL2:ERR] FIL_Read() : Uncorrectable ECC Error
[NBL2:ERR] VFL_Read() : Critical Error
[NBL2:ERR] Bad Block Skipped
。。。。然后就停在这里了。
但是我用4G的nandflash的话就能够正常的读写,我也比较过4G和8G的nandflash,读写都是4kPage的。请问大家这个问题该怎么样去解决呢。
if (dwBlock == (EBOOT_BLOCK+EBOOT_BLOCK_SIZE+EBOOT_BLOCK_RESERVED))
{
OALMSG(TRUE, (TEXT("Write RAW image to BootMedia Failed !!!\r\n")));
OALMSG(TRUE, (TEXT("Too many Bad Block\r\n")));
return(FALSE);
}   这个该怎么样去理解。还有为什么会一直停在ShadowEboot这个函数里。

14 个解决方案

#1


你的BSP是哪个版本,FLASH是什么型号的

#2


引用 1 楼 guetcw 的回复:
你的BSP是哪个版本,FLASH是什么型号的

0904版的,FLASH的型号是 K9HCG08U1M

#3


烧录EBOOT判断相应BLOCK为坏块。
1、检查一下相应BLOCK是否真的是坏块。
2、FIL代码中的FLASH ID可能不全,如果ID不全会导致FLASH型号的误判,比如说4K还是2K误判等,NAND的FLASH,不同后缀,如K9GAG08U0D和K9GAG08U0M,D514和D594,而FIL的FLASH型号代表中可能中存在其中一种,另一个不存在,这时候ID就会判断错误,把你的FIL代码多或者BLOCK0中的代码加些打印信息,把读到的FLASH ID打印出来,看看是否包含在列表中。

#4


引用 2 楼 eason1119 的回复:
引用 1 楼 guetcw 的回复:
你的BSP是哪个版本,FLASH是什么型号的

0904版的,FLASH的型号是 K9HCG08U1M


0904版的比较老了,有可能没有包含你的这个ID,打印出来对比一下吧

#5


看起来是烧写之前没有做flash的格式化,执行下f吧
另外,就是block0img.nb0,eboot.bin之间的size大小要确定好

#6


NAND Flash会分好多块,烧写的时候block0.nb0,Eboot.bin和NK.bin都会烧写在不同的块上。且它们互相之间留有空白块以防止覆盖和坏块。坏块没有或只有很少数时,不会有太大影响。

你这种情况很有可能是烧写Eboot的那段Flash区域中坏块数过多,导致Eboot无法烧写成功。因为在Eboot烧写过程中会主动去检查Flash对应区域的坏块,如果有过多的坏块,将会停止烧写并且进入一个Spinforever();的死循环函数。你该检查NAND Flash,然后换个新的试试。如果还这样,那就得修改Eboot烧写中读取NAND Flash信息的相应代码了。

我也一直在用WinCE做嵌入式开发,研究底层的bootloader。这些回答希望对你有所帮助。

#7


引用 6 楼 fuxueshu42 的回复:
NAND Flash会分好多块,烧写的时候block0.nb0,Eboot.bin和NK.bin都会烧写在不同的块上。且它们互相之间留有空白块以防止覆盖和坏块。坏块没有或只有很少数时,不会有太大影响。

你这种情况很有可能是烧写Eboot的那段Flash区域中坏块数过多,导致Eboot无法烧写成功。因为在Eboot烧写过程中会主动去检查Flash对应区域的坏块,如果有过多的坏块,将会停止烧写并……


谢谢fuxueshu42,你的回答很有帮助。 请问NANDFLASH如果很多坏块,是硬件上的问题吗,软件上面有没有办法解决掉呢?

#8


回复eason1119:
1.如果NAND Flash上的坏块数目过多的话,这本身就是硬件问题,看你如果能正常烧写block0.nb0和NK.bin的话,说明NAND Flash的坏块还不足以坏到影响整个系统的烧写和运行。只是烧写EBOOT.bin对应的NAND Flash有较多的坏块。这样可以通过修改bootloader中相应的代码来通过软件方法解决这个问题。思想就是通过修改bootloader代码来使烧写的EBOOT.bin和NK.bin从NAND Flash目前的块的位置向后移动。打个比方:比如你之前EBOOT.bin烧写在NAND Flash的第3块上,而NK.bin烧写在第9~49块上;你可以通过修改代码将EBOOT.bin烧写到第9块,然后NK.bin就烧写到第15~55块上。
2.如果你不但EBOOT.bin不能烧写,而且就连block0.nb0和NK.bin也无法正常烧写到NAND Flash上去的话,那说明NAND Flash上的坏块太多了,只能更换硬件了。软件无能为力。

希望我的回答可以让你很好理解并对你有所帮助。

#9


因为EBOOT都没有烧写进去,所以停在shadoweboot那是肯定的。局部出现坏块的可能原因是,软件上没有擦除nandflash,还有就是硬件确实有不少坏块。可以试试fuxueshu42说的 把eboot.bin,NK.bin的烧写位置往后挪。

#10


通过实验应该是烧写EBOOT.bin对应的NAND Flash有较多的坏块,我通过修改bootloader代码来使烧写的EBOOT.bin和NK.bin从NAND Flash目前的块的位置向后移动,我把烧写到第10块,NK.bin往后面移。但是我发现更改了bootloader中的 loader.h文件以后,烧写的时候从打印信息看到 Eboot还是烧到的 block3 Start Block = 3, End Block = 3, Block Count = 1,我跟踪信息发现 EBOOT_BLOCK在
loader.h文件里面已经改成10了,但是在烧写的时候还是烧写在block3这块,请问这个是怎么回事呢,是不是 EBoot.bin只能烧在第3块,还是还有别的地方需要设置。谢谢

#11


回复eason1119:因为默认情况下EBOOT.bin就是烧写在Flash的第三块的,需要修改代码,你说的地方只是其一,还有其它相关联的地方也需要修改。有一个宏BLOCK_TO_SECTOR();是指示烧写到NAND Flash上的哪一块的。你可以从这里看起,然后修改相应的地方。

#12


请教楼主跟各位大侠: s3c6410通过uboot或是eboot怎么实现从SD卡自动地更新wince内核镜像? 多谢

#13


引用 12 楼 suzhbruce 的回复:
请教楼主跟各位大侠: s3c6410通过uboot或是eboot怎么实现从SD卡自动地更新wince内核镜像? 多谢


其实UBOOT只是初始化一些先决条件,SD卡的UBOOT初始化一些诸如看门狗时钟、内存和中断等,并引导SD卡的EBOOT加载到内存运行(注意:这里说的是SD卡的UBOOT和EBOOT,而不是烧写到板子上的Flash里面的UBOOT和EBOOT)。其实更新WinCE内核镜像就是通过SD卡的EBOOT实现的,只要你把新的内核镜像拷贝到SD卡中,就可以将这个新的内核更新到s3c6410的开发板的Flash上。SD卡自动更新是因为之前用了IROM_Fusing_Tool.exe来将SD卡的UBOOT和EBOOT烧写到SD卡上,所以SD卡才有了这个功能(更新板子上的UBOOT、EBOOT和内核镜像NK)。

希望我的回答可以让你明白。

#14


block0.nb0 加载eboot的在nandflash里位置在  NBL2的main函数里设置  

#1


你的BSP是哪个版本,FLASH是什么型号的

#2


引用 1 楼 guetcw 的回复:
你的BSP是哪个版本,FLASH是什么型号的

0904版的,FLASH的型号是 K9HCG08U1M

#3


烧录EBOOT判断相应BLOCK为坏块。
1、检查一下相应BLOCK是否真的是坏块。
2、FIL代码中的FLASH ID可能不全,如果ID不全会导致FLASH型号的误判,比如说4K还是2K误判等,NAND的FLASH,不同后缀,如K9GAG08U0D和K9GAG08U0M,D514和D594,而FIL的FLASH型号代表中可能中存在其中一种,另一个不存在,这时候ID就会判断错误,把你的FIL代码多或者BLOCK0中的代码加些打印信息,把读到的FLASH ID打印出来,看看是否包含在列表中。

#4


引用 2 楼 eason1119 的回复:
引用 1 楼 guetcw 的回复:
你的BSP是哪个版本,FLASH是什么型号的

0904版的,FLASH的型号是 K9HCG08U1M


0904版的比较老了,有可能没有包含你的这个ID,打印出来对比一下吧

#5


看起来是烧写之前没有做flash的格式化,执行下f吧
另外,就是block0img.nb0,eboot.bin之间的size大小要确定好

#6


NAND Flash会分好多块,烧写的时候block0.nb0,Eboot.bin和NK.bin都会烧写在不同的块上。且它们互相之间留有空白块以防止覆盖和坏块。坏块没有或只有很少数时,不会有太大影响。

你这种情况很有可能是烧写Eboot的那段Flash区域中坏块数过多,导致Eboot无法烧写成功。因为在Eboot烧写过程中会主动去检查Flash对应区域的坏块,如果有过多的坏块,将会停止烧写并且进入一个Spinforever();的死循环函数。你该检查NAND Flash,然后换个新的试试。如果还这样,那就得修改Eboot烧写中读取NAND Flash信息的相应代码了。

我也一直在用WinCE做嵌入式开发,研究底层的bootloader。这些回答希望对你有所帮助。

#7


引用 6 楼 fuxueshu42 的回复:
NAND Flash会分好多块,烧写的时候block0.nb0,Eboot.bin和NK.bin都会烧写在不同的块上。且它们互相之间留有空白块以防止覆盖和坏块。坏块没有或只有很少数时,不会有太大影响。

你这种情况很有可能是烧写Eboot的那段Flash区域中坏块数过多,导致Eboot无法烧写成功。因为在Eboot烧写过程中会主动去检查Flash对应区域的坏块,如果有过多的坏块,将会停止烧写并……


谢谢fuxueshu42,你的回答很有帮助。 请问NANDFLASH如果很多坏块,是硬件上的问题吗,软件上面有没有办法解决掉呢?

#8


回复eason1119:
1.如果NAND Flash上的坏块数目过多的话,这本身就是硬件问题,看你如果能正常烧写block0.nb0和NK.bin的话,说明NAND Flash的坏块还不足以坏到影响整个系统的烧写和运行。只是烧写EBOOT.bin对应的NAND Flash有较多的坏块。这样可以通过修改bootloader中相应的代码来通过软件方法解决这个问题。思想就是通过修改bootloader代码来使烧写的EBOOT.bin和NK.bin从NAND Flash目前的块的位置向后移动。打个比方:比如你之前EBOOT.bin烧写在NAND Flash的第3块上,而NK.bin烧写在第9~49块上;你可以通过修改代码将EBOOT.bin烧写到第9块,然后NK.bin就烧写到第15~55块上。
2.如果你不但EBOOT.bin不能烧写,而且就连block0.nb0和NK.bin也无法正常烧写到NAND Flash上去的话,那说明NAND Flash上的坏块太多了,只能更换硬件了。软件无能为力。

希望我的回答可以让你很好理解并对你有所帮助。

#9


因为EBOOT都没有烧写进去,所以停在shadoweboot那是肯定的。局部出现坏块的可能原因是,软件上没有擦除nandflash,还有就是硬件确实有不少坏块。可以试试fuxueshu42说的 把eboot.bin,NK.bin的烧写位置往后挪。

#10


通过实验应该是烧写EBOOT.bin对应的NAND Flash有较多的坏块,我通过修改bootloader代码来使烧写的EBOOT.bin和NK.bin从NAND Flash目前的块的位置向后移动,我把烧写到第10块,NK.bin往后面移。但是我发现更改了bootloader中的 loader.h文件以后,烧写的时候从打印信息看到 Eboot还是烧到的 block3 Start Block = 3, End Block = 3, Block Count = 1,我跟踪信息发现 EBOOT_BLOCK在
loader.h文件里面已经改成10了,但是在烧写的时候还是烧写在block3这块,请问这个是怎么回事呢,是不是 EBoot.bin只能烧在第3块,还是还有别的地方需要设置。谢谢

#11


回复eason1119:因为默认情况下EBOOT.bin就是烧写在Flash的第三块的,需要修改代码,你说的地方只是其一,还有其它相关联的地方也需要修改。有一个宏BLOCK_TO_SECTOR();是指示烧写到NAND Flash上的哪一块的。你可以从这里看起,然后修改相应的地方。

#12


请教楼主跟各位大侠: s3c6410通过uboot或是eboot怎么实现从SD卡自动地更新wince内核镜像? 多谢

#13


引用 12 楼 suzhbruce 的回复:
请教楼主跟各位大侠: s3c6410通过uboot或是eboot怎么实现从SD卡自动地更新wince内核镜像? 多谢


其实UBOOT只是初始化一些先决条件,SD卡的UBOOT初始化一些诸如看门狗时钟、内存和中断等,并引导SD卡的EBOOT加载到内存运行(注意:这里说的是SD卡的UBOOT和EBOOT,而不是烧写到板子上的Flash里面的UBOOT和EBOOT)。其实更新WinCE内核镜像就是通过SD卡的EBOOT实现的,只要你把新的内核镜像拷贝到SD卡中,就可以将这个新的内核更新到s3c6410的开发板的Flash上。SD卡自动更新是因为之前用了IROM_Fusing_Tool.exe来将SD卡的UBOOT和EBOOT烧写到SD卡上,所以SD卡才有了这个功能(更新板子上的UBOOT、EBOOT和内核镜像NK)。

希望我的回答可以让你明白。

#14


block0.nb0 加载eboot的在nandflash里位置在  NBL2的main函数里设置