主题 : uboot从nandflash启动内核出现 Verifying Checksum ... Bad Data CRC的错误 复制链接 | 浏览器收藏 | 打印
资料简单,人亦简单
级别: 新手上路
UID: 33114
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2010-11-25
最后登录: 2011-03-18
楼主  发表于: 2011-02-23 10:22

 uboot从nandflash启动内核出现 Verifying Checksum ... Bad Data CRC的错误

移植uboot时,将内核通过tftp下载到内存可以正常启动.
可是当我尝试将内核烧写到nandflash时,就出现了Verifying Checksum ... Bad Data CRC的错误,我想应

该是没有读到内核或者只读到了部分内核.
我是参考 牛人"黄刚"的日志来做的,用的开发板完全和他的一样.我也试过完全按照他的博客日志来做,可

是还是起不来.很是苦恼,哪位GG知道的,恳请指点一下,不胜感激...

黄刚的日志:http://blogold.chinaunix.net/u3/101649/showart_2126764.html
有关信息如下:

====================================================================================
环境变量:[MY2440]#printenv
bootdelay=3
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
ethact=dm9000
filesize=1D2D34
fileaddr=30008000
gatewayip=192.168.1.1
netmask=255.255.255.0
ipaddr=192.168.1.105
serverip=192.168.1.2
stdin=serial
stdout=serial
stderr=serial
bootcmd=nand read 0x30008000 0x50000 0x00200000;bootm 0x30008000

Environment size: 294/65532 bytes

================================================================================
正常启动信息:[MY2440]#bootm 0x30008000
## Booting kernel from Legacy Image at 30008000 ...
   Image Name:   linux-2.6.30.4
   Created:      2011-02-22   1:47:22 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1912052 Bytes =  1.8 MB
   Load Address: 30008000
   Entry Point:  30008040
   Verifying Checksum ... OK
   XIP Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux.............................................................
............................................................. done, booting the
kernel.
Linux version 2.6.30.4 (root@stallion) (gcc version 4.4.3 (ctng-1.6.1) ) #4 Mon
Feb 21 09:47:01 CST 2011
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177
CPU: VIVT data cache, VIVT instruction cache
Machine: SMDK2440
Warning: bad configuration page, trying to continue
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)

====================================================================
再次将内核镜像拷贝到内存,擦除nandflash并将内核写到nandflash[MY2440]#tftp 0x30008000 uImage.img
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
operating at unknown: 0 mode
Using dm9000 device
TFTP from server 192.168.1.2; our IP address is 192.168.1.105
Filename 'uImage.img'.
Load address: 0x30008000
Loading: T T #T ################################################################

         #################################################################
         #
done
Bytes transferred = 1912116 (1d2d34 hex)
[MY2440]#nand erase 0x50000 0x200000

NAND erase: device 0 offset 0x50000, size 0x200000
Erasing at 0x2 -- 2408448% complete.ete.
OK
[MY2440]#nand write 0x30008000 0x50000 0x200000

NAND write: device 0 offset 0x50000, size 0x200000
Writing at 0x4000 --  2097152 bytes written: OK


=========================================================================
重新启动开发板时,信息为:U-Boot 2009.08 ( 2鏈?16 2011 - 17:32:06)

DRAM:  64 MB
Flash:  0 kB
NAND:  NAND_ECC_NONE selected by board driver. This is not recommended !!
64 MiB
In:    serial
Out:   serial
Err:   serial
Net:   dm9000
Hit any key to stop autoboot:  0

NAND read: device 0 offset 0x50000, size 0x200000
2097152 bytes read: OK
## Booting kernel from Legacy Image at 30008000 ...
   Image Name:   linux-2.6.30.4
   Created:      2011-02-22   1:47:22 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1912052 Bytes =  1.8 MB
   Load Address: 30008000
   Entry Point:  30008040
   Verifying Checksum ... Bad Data CRC
ERROR: can't get kernel image!
资料简单,人亦简单
级别: 新手上路
UID: 33114
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2010-11-25
最后登录: 2011-03-18
1楼  发表于: 2011-02-23 10:24
黄刚日志里有下面一些内容,让我很是不解

mkimage -n 'linux-2.6.30.4' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d

zImage uImage.img

为什么 mkimage的指定image的载入地址和内核入口地址一样?


③、Nand Flash的分区。我们查看内核在arch/arm/plat-s3c24xx/common-smdk.c中的分区情况如下:
         起始地址      结束地址

uboot : 0x00000000    0x00030000
param : 0x00030000    0x00040000 //注意这个环境变量的地址范围要与上一节补充内容中配置的

CONFIG_ENV_OFFSET一致
kernel: 0x00050000    0x00200000
root  : 0x00250000    0x03dac000

这个分区它是如何找到的?

=====================================
④、设置修改u-boot的启动参数,在u-boot命令行下输入:
//设置启动参数,意思是将nand中0x50000-0x00200000(和kernel分区一致)的内容读到内存0x31000000中

,然后用bootm命令来执行

set bootcmd 'nand read 0x31000000 0x50000 0x00200000;bootm 0x31000000'

saveenv  //保存设置

为什么要将nand read 到地址0x31000000处?
================================================
⑤、把uImage.img用tftp下载到内存中,然后再固化到Nand Flash中,操作和执行图如下:
tftp 0x30000000 uImage.img  //将uImage.img下载到内存0x30000000处

nand erase 0x50000 0x200000 //擦除nand的0x50000-0x200000的内容

nand write 0x30000000 0x50000 0x200000 //将内存0x30000000处的内容写入到nand的0x50000处
为什么又将uImage.img下载到内存0x30000000处?

恳请明白的言语一声。。。
级别: 新手上路
UID: 38327
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2011-02-24
最后登录: 2012-05-16
2楼  发表于: 2011-02-24 14:12
楼主你好,这两天我也是刚好看到这里,我知道其中的一些,也是看网上资料说的。我的一些理解是:第一,为什么 mkimage的指定image的载入地址和内核入口地址一样?,其实我看有些资料说是不一样的,即是内核入口地址要比image的载入地址多0x40,至于为什么呢,大概是因为有个什么tar头部,具体可以百度一下。第二,为什么要将nand read 到地址0x31000000处?我的理解是这个0x31000000地址是内核在ram中的起始地址,其实我发现这个应该改为0x30008000才能正常地引导内核,具体我不知道是什么原因,可能是跟我设置的环境变量有关。第三,把uImage.img用tftp下载到内存中,然后再固化到Nand Flash中,其中我觉得它最终的目的是把内核下载到nand flash中,没有必要先把它下载到内存中,再从内存中转过来。而这里它是用了nand flash的命令,所以就这样做了,这可能跟nand flash命令有关吧,具体的我还没看。但是我想可能通过其他方式下载过来。这只是我的一些理解,不知道对不对,请大家多多指正。
级别: 新手上路
UID: 38327
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2011-02-24
最后登录: 2012-05-16
3楼  发表于: 2011-02-24 14:40
对了,顺便我想问个问题,就是在你的串口打印uboot板子信息的时候,为什么那个中文打不出来,也就是打印出了乱码,那个version的定义是在哪个文件下的呢?因为的的情况跟你的那个一样,到时是什么原因呢?
资料简单,人亦简单
级别: 新手上路
UID: 33114
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2010-11-25
最后登录: 2011-03-18
4楼  发表于: 2011-02-24 16:44

 回 3楼(路在何方) 的帖子

今天我尝试用supervivi将内核烧写到nandflash的 0x60000  后,通过uboot的nand read 指令读取到的uImage.img可以正常启动。而通过uboot的nand write不可以,这说明是nand write进nandflash中的内容有问题。   接着,我将用supervivi烧写的内核二进制文件和uboot烧写内核的二进制文件dump出来后,发现它们还是有区别的,这说明nand write有问题(god!! 问题总算找到了)!如果有“达人”有过这种情况发生过的,麻烦告诉小弟,谢谢!!

至于,你说的那个汉字问题,你可以在 uboot文件夹里搜索“version”这个关键字,我也忘记在什么文件里了,好像是lib_ARM或者board.c??(反正忘了)

还有,你说的多0x40那个事情。反正我试了,不加0x40内核起不来,不知道网上那些人是怎么起来的??
[ 此帖被nobody在2011-02-24 16:51重新编辑 ]
级别: 新手上路
UID: 38327
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2011-02-24
最后登录: 2012-05-16
5楼  发表于: 2011-02-24 21:37
你所说的“用supervivi将内核烧写到nandflash的 0x60000  后,通过uboot的nand read 指令读取到的uImage.img可以正常启动”,supervivi能烧写uImage.img吗?如果把其后缀名去掉或者改成bin格式的,那它的内容会不会变了呢?你所说的用nand read指令是指“nand read 0x31000000 0x80000 0x200000 ”这个指令吗?我刚刚试了一下,我通过nand wite 功能烧写进nand flash中,也是不能自启动,那是什么原因呢?是不是某个关于nand flash 的文件或者函数不正确了呢?
资料简单,人亦简单
级别: 新手上路
UID: 33114
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2010-11-25
最后登录: 2011-03-18
6楼  发表于: 2011-02-25 14:25

 回 5楼(路在何方) 的帖子

我是通过supervivi的“K”指令(也就是下载内核)进行下载的。也就说我给supervivi的“内核”并不是zImage而是uImage.img,这个“内核”supervivi是不能引导的,而uboot可以,你明白什么意思了吗?


我的nand read 完整指令是“nand read 0x30008000 0x60000 0x500000 ”,
因为友善之臂的分区是:
    supervivi :0x0~0x40000
        supervivi: 参数0x40000~60000
        内核:60000~500000。
按照你的nand read 指令,那你的内核在nandflash中的位置应该是0x80000~200000,这和和友善之臂的60000~500000是不一样的。因此,我用supervivi烧写进nandflash的时候,nand read 指令也进行了变化。

  可能你想知道nandflash的分区在什么地方写着的,呵呵。友善的分区表在内核的mach-mini2440.c文件中,具体位置好像在arch/arm.....(忘了[ s:2]) 。

有什么问题欢迎交流。邮箱:stallion5632@163.com