免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6410 | 回复: 3
打印 上一主题 下一主题

通过U-BOOT烧写内核和文件系统出错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-14 21:51 |只看该作者 |倒序浏览
小弟初来咋到,只有两分在帐,愿意倾囊相授只求一解,愿各位兄弟姐妹帮助一下小弟,小弟快崩溃了。
最近在使用一块OMAP-L137的开发板,在通过U-BOOT烧写内核和根文件系统的时候出现了问题,百思不得其解,问题是这样的:
通过NFS启动时内核打印NANDFLASH分区信息如下:
0x00000000  0x00020000   ''bootloader''   注:mtdblock0
0x00020000  0x00040000   ''pram''         注:mtdblock1
0x00040000  0x00240000   ''kernel''       注:mtdblock2
0x00240000  0x20000000   ''filesystem''   注:mtdblock3
   但是开发板的资料上给的烧写内核的地址是:0x100000 -0x300000,不知道这是为什么,内核有1.6M,这样的话肯定有一部分内核的内容会被写入最后一个分区''filesystem'',不知道它为什么这么做,不过这不重要,通过NFS一样能正常启动文件系统。另外他提供了一个烧写文件系统的方法,方法是通过NFS启动系统后,挂载 mtdblock3 ,将一个非压缩的完整文件系统直接复制入此分区内,然后设置启动参数为:
  root=/dev/metblock3 ,理论上来说,内核从mtdblock3的首地址读取到的内容应该属于内核的一部分,而并不是文件系统,这样系统应该不能正常启动,但是事实却是能正常启动,请教了一些高手也未能搞明白。这是第一个问题。
   第二个问题是这样的,我烧写内核的时候按照开发板资料提供的步骤,仅仅改动了烧写的地址,具体如下:
   nand erase 0x00040000 0x200000
   tftp 0xc0700000 uImage
   nand write 0xc0700000 0x00040000 0x200000
   然后设置启动参数为:
   bootcmd 'nand read 0xc0700000 0x40000 0x200000;bootm 0xc0700000'
   启动内核却显示:
   can't get kernel image 并提示 wrong format 格式不对之类的错误,不知道这是为什么。而且通过这个烧写步骤之后,U-BOOT就不能再正确启动了,貌似U-BOOT被覆盖,不知道是什么原因,不知道是不是因为坏块的原因。现在我想查看NANDFLASH中烧写的内容到底是怎么分配的,U-BOOT到底占用了多少空间,不知道有什么方法,我的 flash_info 不知道如何使用。
请高手务必指教一番,多谢多谢!

论坛徽章:
0
2 [报告]
发表于 2009-11-04 16:11 |只看该作者
先看看这个:
【解答】内核kernel以及根文件系统rootfs是如何映射到对应的nand flash的地址的
http://hi.baidu.com/serial_story ... 3fdd3fadafd546.html

然后不清楚的,再问吧。

论坛徽章:
0
3 [报告]
发表于 2009-11-04 22:44 |只看该作者

回复 #1 yejin1999 的帖子

很怀疑你的nand驱动或者硬件有问题,你可以利用u-boot下的nand  info或者其他nand命令检测一下nand,也可以把u-boot从nand读到ram中,通过仿真器把在ram中的u-boot传送到主机与uboot文件比较一下,看是否是一致。试着往kernel或者fs的区域写一些文件,然后读出来,看是否一致。排除这些问题之后再说别的。
一般来说nand必须保证其实的两个block是没有问题的,现在的arm一般都有内部rom code,如果从第一个block读不到bootloader的话会尝试第二个block,而你是往0x40000地址开始写数据,如果是128k的block的话,这应该是第三个block,不可能会存放u-boot的,也就是说不应该会覆盖bootloader,最多是覆盖了param。
总之,先通过读写nand来确定nand是否驱动或者硬件存在问题吧。祝好运。

论坛徽章:
0
4 [报告]
发表于 2009-11-06 12:46 |只看该作者
1."但是开发板的资料上给的烧写内核的地址是:0x100000 -0x300000,不知道这是为什么"
觉得很可能是,该资料和你当前的代码不匹配,其对应的内核的配置,很可能是类似于这样的:
XXX         XXX          ''bootloader''   注:mtdblock0
XXX         XXX          ''pram''         注:mtdblock1
0x00100000  0x00300000   ''kernel''       注:mtdblock2
XXX         XXX          ''filesystem''   注:mtdblock3

2.通过NFS启动,和nand Flash如何分区,里面内容如何存放,是没关系的。
因为都是从NFS读取kernel和挂载rootfs。

3.
“另外他提供了一个烧写文件系统的方法,方法是通过NFS启动系统后,挂载 mtdblock3 ,将一个非压缩的完整文件系统直接复制入

此分区内,然后设置启动参数为:root=/dev/metblock3 ,理论上来说,内核从mtdblock3的首地址读取到的内容应该属于内核的一部

分,而并不是文件系统,这样系统应该不能正常启动,但是事实却是能正常启动”

没有看懂你说的“内核从mtdblock3的首地址读取到的内容应该属于内核的一部分,而并不是文件系统,”
nand flash分区后,你把rootfs烧写到/dev/metblock3,然后kernel启动后去/dev/metblock3挂载rootfs,
根据分区找到对应的nand flash的位置,然后读取里面的内容,判断出文件系统类型,去和你之前参数中的
rootfstype制定的比较,是否匹配,都正常了,就可以挂载rootfs了,就可以继续启动了。
意思也就是,本来就该正常启动的啊。

就按照你上面的分区,/dev/metblock3对应的地址是0x00240000 - 0x20000000,
kernel会去到对应的0x00240000位置读取数据,判断rootfs类型和你参数是否匹配,匹配了,就可以启动了。

4.关于第二个问题,同意buaadallas,你最好先去通过nand write和nand read以及cmp,去判断nand的写,读,是否正确。
正常的话,你用nand write 写点东西进去,再用nand read读出来到另外一个地址,然后再用cmp比较两者数据是否一致。
都一致了,说明你的nand的读写功能是OK的。然后再找其他问题,比如uImage是否正确。
可以在nand read 0xc0700000 0x40000 0x200000之后,去md显示内存数据,看看是否你正常的uImage的数据。
数据都正常了,bootm 0xc0700000才可能正常。
如果怀疑是你说的坏块问题,尝试用nand scrub,彻底格式化一遍(当然,也把坏块标记干掉了。。。)
然后再试试。

5.“现在我想查看NANDFLASH中烧写的内容到底是怎么分配的,U-BOOT到底占用了多少空间”
貌似没啥好办法,只有自己编的uboot,自己烧写进去的,知道uboot放在你哪和具体多大。
关于nand flash里面的数据和内容如何放,就是你自己烧写,你自己清楚了。还是上面说的,先去验证你的nand 的读写功能都
正常了,再说吧。

6.“我的 flash_info 不知道如何使用。”
我没记错的话,貌似flash_info是针对Nor Flash的吧?你这个是nand flash,两者不是一回事。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP