设为首页收藏本站

100ask

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 3367|回复: 12

烧写u-boot坏块问题

[复制链接]

该用户从未签到

12

主题

28

帖子

35

积分

新手上路

Rank: 1

积分
35
发表于 2008-10-28 16:52:00 | 显示全部楼层 |阅读模式
我在烧写u-boot的时候发现nandflash第5个block是坏的,对u-boot的启动有没有影响啊,我改的是从nandflash启动的代码。http://blog.chinaunix.net/u1/34474/showart.php?id=363269 我是按照他的方法移植的,用的也是博创2410-s的试验箱。编译成功了,但是下去串口一直没输出。
回复

使用道具 举报

该用户从未签到

56

主题

5258

帖子

7875

积分

超级版主

Rank: 8Rank: 8

积分
7875
QQ
发表于 2008-10-28 18:21:00 | 显示全部楼层

回复:烧写u-boot坏块问题

u-boot一般都有150K左右,第5个block的话就是在80K那里,肯定有影响的!
因为:
1. 写入时是分辨坏块的
2. u-boot启动时,nand_read_ll函数不区分坏坏
这肯定导致问题。
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

28

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2008-10-28 21:11:00 | 显示全部楼层

回复:烧写u-boot坏块问题

那我应该怎么改,是不是需要跳过前面5个block从第六个开始烧写?
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

229

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
QQ
发表于 2008-10-28 21:32:00 | 显示全部楼层

回复:烧写u-boot坏块问题

还是从第0块开始烧写。
如果你是用u-boot烧写的,你用 nand write.jffs2 命令烧写,这样可以跳过坏块。
同时,你要看看从NAND拷贝代码到SDRAM的那段代码,如果没有判断坏块则加上判断是一个坏块的话就跳过,直到是一个好块。
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

229

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
QQ
发表于 2008-10-28 21:36:00 | 显示全部楼层

回复:烧写u-boot坏块问题

通常来说,从NAND启动时,如果你没有用硬ECC时,应该对同一个页至少读2次,比较2次是否相同,如果不同则重复读2次比较的过程,这主要是由于NAND在读写有位翻转的现象。
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

28

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2008-10-28 22:17:00 | 显示全部楼层

回复: 烧写u-boot坏块问题

原帖由 henry.li 于 2008-10-28 21:36:00 发表
通常来说,从NAND启动时,如果你没有用硬ECC时,应该对同一个页至少读2次,比较2次是否相同,如果不同则重复读2次比较的过程,这主要是由于NAND在读写有位翻转的现象。


这位朋友要表达什么意思?我看不明白,能说详细点吗?非常感谢你回答我的问题。
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

229

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
QQ
发表于 2008-10-28 22:36:00 | 显示全部楼层

回复:烧写u-boot坏块问题

NAND flash不是像你想象那样,你写什么它就存什么,它存在不可忽略的位交换现象,就是可能在读写的时候有一位或几个位发生翻转,比如你写入的是0x00进去的,有可能存进去的是0x01或0x02之类,这就需要一种校验机制来保证数据可靠性。读取的时候也是,比如NAND里面保存数据是0x01,但是可能读出来的是0x03或0x00,所以和写一样也需要进行校验。

所以你现在看到NAND上面都是用了ECC的,不是软ECC就是硬ECC。但是从NAND上面启动的代码一般限制在4K内,做软ECC肯定是不行的(空间不够),如果硬件支持ECC,那当然好了,在4K的代码中支持硬ECC还是可以的。

如果你的代码没有软ECC,又没有硬ECC,那只好通过多读几次的方法来解决位交换的问题,因为2次在同一个地方出现位交换的几率就很小了。

其实NOR FLASH也是有位交换的问题,只是几率非常小,我们就忽略了,但是NAND的位交换比较严重,不可忽略。
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

28

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2008-10-28 23:15:00 | 显示全部楼层

回复: 烧写u-boot坏块问题

原帖由 henry.li 于 2008-10-28 22:36:00 发表
NAND flash不是像你想象那样,你写什么它就存什么,它存在不可忽略的位交换现象,就是可能在读写的时候有一位或几个位发生翻转,比如你写入的是0x00进去的,有可能存进去的是0x01或0x02之类,这就需要一种校验机制来保证数据可靠性。读取的时候也是,比如NAND里面保存数据是0x01,但是可能读出来的是0x03或0x00,所以和写一样也需要进行校验。

所以你现在看到NAND上面都是用了E


你说的这个问题我是知道的,但怎么去解决我碰到的问题啊,烧u-boot.bin的时候提示,第五个block是坏的,thisway说有肯定对启动有影响,但我不知道怎么改了。
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

229

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
QQ
发表于 2008-10-28 23:28:00 | 显示全部楼层

回复: 烧写u-boot坏块问题

原帖由 henry.li 于 2008-10-28 21:32:00 发表
还是从第0块开始烧写。
如果你是用u-boot烧写的,你用 nand write.jffs2 命令烧写,这样可以跳过坏块。
同时,你要看看从NAND拷贝代码到SDRAM的那段代码,如果没有判断坏块则加上判断是一个坏块的话就跳过,直到是一个好块。


解决方法是修改u-boot代码中从nand拷贝数据到内存的代码,就是在读取一页数据中加上坏块判断啊。
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

28

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2008-10-29 14:47:00 | 显示全部楼层

回复:烧写u-boot坏块问题

那个指能判断nandflash的某个block是坏的啊,用c语言怎么实现,
我把nand_read_ll函数中中从80k-96k那段地址,因为我的第5个block是坏的,把它写成什么都不做行不行啊?其他地址的地方和以前一样,我试了一下还是没反应!
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
wanmeiff97yunvcpic

小黑屋|手机版|Archiver|百问网    

GMT+8, 2017-11-22 20:29 , Processed in 0.116865 second(s), 35 queries .

Powered by Discuz! X3.1 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表