硬件平台:tq2440
开发环境:Ubuntu-3.11
u-boot版本:2014.10
本文允许转载,请注明出处:http://blog.csdn.net/fulinus
原本以为u-boot移植好了,引导linux内核启动不是问题吧。但是却折磨了我两天,一直在“Starting kernel...”这里卡住了。综合网上的说法出现这个问题有如下原因:
1)u-boot和linux内核主频不匹配;
2)u-boot和linux内核机器码不匹配;
3)bootarges参数数不对;
3)内核中没有添加串口相关的驱动;
实际情况是这些在我这里都是正确的。因为我用u-boot-2010.09引导linux内核启动是没有问题的,换成u-boot-2014.10就不行。。。。。。
什么信息也没有打印,除了:
Starting kernel...
这条信息是u-boot打印的,安装正常的启动,下面是会有内核打印的:
Uncompressing Linux... done, booting the kernel.
但是没有。我换了了很多种方式,反复组合测试,反复烧录,反复测试。。。。我简直就要疯了,什么情况?!
我就这么反复折腾,也不知道什么时候,我就用了go命令,出现了Uncompressing Linux... done, booting the kernel.信息,但是还是没有成功!j-link烧录又一次居然可以了正常引导启动了。
于是我再用:
tftp 30008000 zImage;go 30008000
不行,我突然想到go命令是直接设置pc地址的,不像bootm会传入参数给linux内核,于是我就讲内核中启动参数设置成:
console=ttyS0,115200 mem=64M init=/linuxrc rw loglevel=7
再运行,OK可以了。用go命令是可以的。
前面偶然又一次机会用go命令成功,是因为我再使用它之前用了:
tftp 30008000 linuxrom-s3c2440.bin;bootm 30008000
虽然没有成功引导,但是bootm已经解压了内核镜像,而且参数也传入了内核(在一个特殊的地址处),如果不掉电复位,用J-link烧录并运行u-boot,再使用go 30008000,就在前面bootm解压后的基础上成功运行了linux内核。因此,问题的症结在bootm命令有问题,我比较了u-boot-2010.04,u-boot-2014.10,和u-boot-2015.01版本的cmd_bootm.c文件,发现都有很大的改动,估计是这里有个没有被开发人员发现的bug吧,后面有机会我会在找出这个bug。