优龙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区写了东西)。