织梦CMS - 轻松建站从此开始!

罗索

uboot无法识别部分命令的解决办法

落鹤生 发布于 2012-08-28 10:42 点击:次 
终于弄好uboot从NandFlash启动的部分了,烧进板子的NandFlash中,然后打开串口,上电。出现uboot的启动提示了,这个时 候输入saveenv,居然提示说unknow command (这个问题没有解决)
TAG:

终于弄好uboot从NandFlash启动的部分了,烧进板子的NandFlash中,然后打开串口,上电。出现uboot的启动提示了,这个时 候输入saveenv,居然提示说unknow command,顿时有五雷轰顶的感觉,无赖之中尝试了一下其他的命令,发现有些命令可以使用,有些还是提示unknow command。于是查看了一整天的源代码,除了把命令系统的代码搞清楚了以外,这个问题还是没有解决。

由于第一次玩uboot,所以抱着学习的态度就把命令都敲了一遍,心情也郁闷至极。可是在敲入“nand bad”的时候观察输出,发现0x00020000是坏块。掐指一算,MyGod!我的uboot大概是140多K,而查看u-boot.lds可以知道 这最后面就是存放命令段和数据段得地方,看来有可能是nand flash的坏块导致我的命令无法正确读取,顿时兴奋不已,赶紧修改链接文件,绕过这一段,看有没有效果。于是将u-boot.lds中 __u_boot_cmd_start的值修改为0x33fa3600,虽然这样修改还是会有部分内容在坏块内,但是我是想先验证这是否是问题产生的原 因。因为我把命令的地址挪动一下,如果是这里的问题,那产生的结果就有可能是以前能识别的命令,现在不能识别,而以前不能识别的命令,现在能识别了。编译 完成之后查看System.map,看到__u_boot_cmd_start的值由0x33fa334c变成了我所修改的值。然后烧进开发板再试,发现 测试结果跟以前完全一样,说明不是这里的问题。

于是回过头来看代码,从main_loop->run_command->find_cmd一路打消息打下来,发现此错误是无法匹配 “saveenv”字符串导致的,可是明明用U_BOOT_CMD这个宏设置了saveenv命令了啊。用代码打印saveenv命令的name字段,无 法得到“saveenv”这个字符串,可是能正常使用的命令都能得到正确的字符串。用UEdit打开u-boot.bin文件以及u-boot.lds可 以看到,“saveenv”这个字符串存放到了rodata段,而存放该字符串的地址刚好就是在坏块中。现在问题就弄清楚了,在输入命令之后,程序从 __u_boot_cmd_start取出存放命令名的地址,然后去该地址取出命令名,与当前输入的命令作比较,然后再调用相应的处理流程。但是存放命令 名字符串的那一部分是坏块,就不能正确进行命令名匹配了。所以只要不把rodata区挪动一下,让程序能正确读取就可以解决问题了。于是将u- boot.lds文件中的rodata区挪到00x33fa8000的地方就好了。

其实按我的理解,由于nand flash的block1都是坏的,所以从128k到256k的部分都不应该使用,像我上面那样改动地址也还是存在风险,有可能其他的数据所存储的区域是 坏的,那样也会产生问题。不过已经在程序里面设置uboot的大小为256k,要把128k~256k的地方全部空出来的话,比较麻烦。而且好像我的 block1只是有很小一段是坏的,改block的其他page都是好的。所以先这样改着吧。

我用的是飞凌的FL2440开发板,不知道别人的nand flash有多少坏块,好像超过10%就不能用了。但是我的貌似有几百个坏块,总共才2048个blocks,情何以堪啊。不过也真的是感谢飞凌卖的这么 “好”的板子,让我把相关部分的知识都好好学习了一遍,希望后面的学习不要再出类似的问题。毕竟我一个新手,什么都不会,真的是伤不起啊!

(xautfengzi)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201208/16236.html]
本文出处:CSDN博客 作者:xautfengzi 原文
顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容