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

wdw1600 2008-12-11 11:20:48
又弄出新问题了,寻求高人指导(优龙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区写了东西)。
...全文
322 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangzi76520963 2012-01-14
  • 打赏
  • 举报
回复
wdw :
我在移植大页面的NANDFLASH K9F2G08的时候也遇到了和你相同的现象 启动时出现坏块 终端能显示 也能烧写FLASH 就是启动时出现坏块啊 知道是写FLASH 函数的ECC有问题 但不知道如何修改 请帮忙指点下啊
michaell2008 2010-04-02
  • 打赏
  • 举报
回复
我也正在调这部分
cpdl2003 2010-01-04
  • 打赏
  • 举报
回复
OK
wdw1600 2008-12-15
  • 打赏
  • 举报
回复
问题已经解决,就是和googleman大侠说得有关系,不过不是checkbadblk函数得问题是写得时候出问题得
wdw1600 2008-12-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shuiyan 的回复:]
nboot中,对nand的操作都写在汇编s中,可能是为了加快速度。

[size=12px]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改进源码


[/Quote]
分几个sector来处理是CPU得nand控制器自己控制得吧,把地址送给CPU后CPU就根据命令自动读写一个页面得信息,至于是读几个sector应该是CPU得事情,对于2440来说就是GPG13,14,15三个脚决定了得。

googleman大侠说那个函数我看了
DWORD FMD_GetBlockStatus(BLOCK_ID blockID)
{
SECTOR_ADDR Sector = (blockID * NAND_PAGE_CNT);
SectorInfo SI;
DWORD dwResult = 0;

if (IsBlockBad(blockID)) //这个信息是我需要得IsBlockBad()这个函数得传地址方式更让我一头雾水,下面贴出
return BLOCK_STATUS_BAD;

if (!FMD_ReadSector(Sector, NULL, &SI, 1))
return BLOCK_STATUS_UNKNOWN;

if (!(SI.bOEMReserved & OEM_BLOCK_READONLY))
dwResult |= BLOCK_STATUS_READONLY;

if (!(SI.bOEMReserved & OEM_BLOCK_RESERVED))
dwResult |= BLOCK_STATUS_RESERVED;

return(dwResult);
}
这里贴出:
static BOOL IsBlockBad1G08(BLOCK_ID blockID)//这个函数就是检查坏块得函数吧

{
BYTE Data;
SECTOR_ADDR blockPage = (blockID * NAND_PAGE_CNT);
// if(blockID<0x12)
// return TRUE;
BOOL bLastMode = SetKMode(TRUE);

NF_nFCE_L();

NF_CLEAR_RB();

NF_CMD(0x00); // Read command
NF_ADDR((2048+0)&0xff); // 2060 = 0x080c这里得传地址就迷茫了怎么和读写一样,不过我改成这样也不行
NF_ADDR(((2048+0)>>8)&0xff);
NF_ADDR((blockPage)&0xff); // A[19:12]
NF_ADDR((blockPage>>8)&0xff); // A[27:20]
#if (K9F2G08_SUPPORT||K9F4G08_SUPPORT||K9F8G08_SUPPORT)
if((g_pNandFlashChip->FlashID!=0xECF1)&&(g_pNandFlashChip->FlashID!=0xECA1))
NF_ADDR((blockPage>>16)&0xff);

#endif
NF_CLEAR_RB();
NF_CMD(0x30); // 2'nd command
NF_DETECT_RB();


Data=NF_RDDATA();//我上面得checkbadblk就是这个Data值有问题

NF_nFCE_H(); // Deassert the flash chip.
if(0xff != Data) //这里就判断检查得这个块是不是坏块
{
SetKMode (bLastMode);
#ifdef BOOT_LOADER
EdbgOutputDebugString("IsBlockBad(%X): TRUE\r\n",blockID);
#else
RETAILMSG(1,(TEXT("IsBlockBad(%X): TRUE\r\n"),blockID));
#endif
return(TRUE);
}


手册上是这样写得:

All device locations are erased(FFh) except locations where the initial invalid block(s) information is written prior to shipping. The initial
invalid block(s) status is defined by the 1st byte in the spare area.(标记得第一个字节,和googleman大侠说得一样)
Samsung makes sure that either the 1st or 2nd page of every
initial invalid block has non-FFh data at the column address of 2048. Since the initial invalid block information is also erasable in
most cases, it is impossible to recover the information once it has been erased. Therefore, the system must be able to recognize the
initial invalid block(s) based on the original initial invalid block information and create the initial invalid block table via the following
suggested flow chart(Figure 3). Any intentional erasure of the original initial invalid block information is prohibited.

我checkbadblk函数照手册上改是改成下面这样得:
static int CheckBadBlk(U32 addr)
{
U8 dat;
addr &= ~0x3f;

NFChipEn();
WrNFCmd(READCMD1); //READCMD1=0X30
WrNFAddr(0);标记第一个字节,1208是传得5,标记第6个字节(我把1208得5去掉就出一样得错误)
WrNFAddr(addr);
WrNFAddr(addr>>8);
if(NandAddr) //这里NandAddr是=1
WrNFAddr(addr>>16);
WaitNFBusy();
dat = RdNFDat();

我按两种改了都不行:而且是擦除后就检查都是报坏块。我把init.s里得checkbadblk屏蔽掉结果一样可以启动。。。
请大侠们再帮忙看看。
[/size]
wap21 2008-12-14
  • 打赏
  • 举报
回复
友情up
wdw1600 2008-12-14
  • 打赏
  • 举报
回复
不好意思这两天回去弄户口没有上网,优龙BIOS我用得还是SJF2440烧写得。公司里一个人把SJF修改了可以支持8G08得
gooogleman 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 swaiwwb 的回复:]
请教楼主,k9k8g08是用什么软件烧写的?貌似sjf2440.exe不支持k9k8g08吧?
[/Quote]

JTAG /JLINK+ADS
swaiwwb 2008-12-13
  • 打赏
  • 举报
回复
请教楼主,k9k8g08是用什么软件烧写的?貌似sjf2440.exe不支持k9k8g08吧?
shuiyan 2008-12-11
  • 打赏
  • 举报
回复
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改进源码

gooogleman 2008-12-11
  • 打赏
  • 举报
回复
这个大页的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,否则,判断独到的信息,返回相应结果。
wangxin_801115 2008-12-11
  • 打赏
  • 举报
回复
学习先
beijingbeerman 2008-12-11
  • 打赏
  • 举报
回复
保存

19,498

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧