当前位置: 代码迷 >> WinCE >> 优龙BIOS的一个新有关问题(很关键)
  详细解决方案

优龙BIOS的一个新有关问题(很关键)

热度:449   发布时间:2016-04-28 13:56:45.0
优龙BIOS的一个新问题(很关键)
又弄出新问题了,寻求高人指导(优龙2440开发板换flash后bootloader出现问题flash换成k9k8g08优龙得是k9s1208)
static int CheckBadBlk(U32 addr)
{
U8 dat;
addr &= ~0x3f;

NFChipEn();
WrNFCmd(READCMD1); //READCMD1=0X30
  WrNFAddr(addr);
  WrNFAddr(addr>>8);
  if(NandAddr) //这里NandAddr是=1
  WrNFAddr(addr>>16);
WaitNFBusy();
dat = RdNFDat(); //----不明白这里只读了一次究竟是读的什么数据(我得理解应该是校验位),手册上也找不到 (错误就发生在这里)
//优龙得板子RdNFDat()返回得全部是ff而我得板子返回值是不定得
WrNFCmd(READCMD0); //READCMD0=0
NFChipDs();

return (dat!=0xff);
}
//我认为上面这个函数没有问题要不然在2440init.s就通不过


我用优龙原来的开发板测试了,addr上读出来的数据和我的板子上读出来的一样,(从PC机用USB下载NK.bin到板子内存成功
,从板子内存把NK.bin写入flash成功)
CheckBadBlk()执行完后就开始从flash拷贝wince到内存,在CheckBadBlk时候出错就造成了不能把flash中的wince
读取到内存中执行,如果屏蔽坏块检测,就可以读取,但是运行wince后板子就不能启动了,bios也得重新烧写。
而且运行wince得时候wince下面一样报坏块(不是硬件坏了:不可能出现那么多坏块几千个)
怎么也找不到问题得具体原因,望大侠赐教!
WritePage()函数中写校验部分如下
(我自己推测是写校验得时候出错了,但是这个不太懂,没办法手册上没有这个说明)
  tmp[0] = mecc&0xff;
  tmp[1] = (mecc>>8)&0xff;
  tmp[2] = (mecc>>16)&0xff;
  tmp[3] = (mecc>>24)&0xff;
  tmp[5] = 0xff; //mark good block
if(fs_yaffs==1){
for(i=2048;i<2112;i++)
{
WrNFDat(buf[i]);
}
}
else{  
SEccUnlock();
WrNFDat(tmp[0]);
WrNFDat(tmp[1]);
WrNFDat(tmp[2]);
WrNFDat(tmp[3]);
SEccLock();
WrNFDat(tmp[4]);
WrNFDat(tmp[5]);
}
还有点不明白得就是我能从内存把nk.bin写到flash说明在写得时候flash是没有北标记成坏块得
而且写了过后读出来数据也是正确得。为什么再次检测得时候就报是坏块呢?强行读取就会导致bios挂掉更是奇怪
就是在仿真下强制读取也会挂bios(我想有可能是wince运行时候向flash得boot区写了东西)。

------解决方案--------------------
这个大页的flash校验自然和小页的不同了。
这个原理,应该和下面的这个函数原理是一致的。
DWORD FMD_GetBlockStatus(BLOCK_ID blockID): 该函数获得nandflash中某一个block的状态。参数为nandflash的block地址。由于nandflash中可能有坏块,所以针对nandflash,这个函数首先会检查当前块是否是坏块,这个一般通过读取当前block的第0个page和第1个page的带外数据。对于小page nandflash一般是读取第5个byte,对于大page nandflash一般读取第0个byte,如果不为0xff表示该块是坏块。当然,至于具体该读哪个byte,最好还是看一下所用nandflash的datasheet,确认一下,不同的厂家可能有所不同。如果发现该块是坏块,应该返回BLOCK_STATUS_BAD。如果不是坏块,需要读取这个块的起始扇区的扇区信息。如果读该扇区信息出错,应该返回BLOCK_STATUS_UNKNOWN,否则,判断独到的信息,返回相应结果。
------解决方案--------------------
nboot中,对nand的操作都写在汇编s中,可能是为了加快速度。

K9K8G08是2K Large Block的,而原来的K9S1208是512的small block的。
原来读一个block,就是读一个sector,而现在读了一个block,需要分4个sector来处理。

对于在2440上用2K block的,推荐两个链接,是已经验证成功的。

【原创】2K大页面NAND FLASH的WINCE5.0/4.2下的驱动源码

【原创】支持2K大页面NAND FLASH驱动的NBOOT改进源码