## Booting kernel from Legacy Image at 32000000 ...
Image Name: Linux-2.6.13-utulinux2440
Created: 2007-11-04 7:12:20 UTC
Image Type: ARM Linux Kernel Image (gzip compressed)
Data Size: 1479835 Bytes = 1.4 MB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
Uncompressing Kernel Image ... OK
Starting kernel ...
不能确定是linux内核没有跑起来,还是已经跑起来了而没有串口打印信息,基本上有三种情况:1> U-boot中的参数(console)没有传到内核。2> U-boot的时钟设置不在405MHz,与Kernel的不一致。3> U-boot中的Machine ID设置的与Kernel不一致。逐个检查,其中第一项参数传递要求U-boot中有如下宏即可,该情况排除。 u-boot-2009.03/include/configs/mini2440.h#define CONFIG_SETUP_MEMORY_TAGS#define CONFIG_INITRD_TAG#define CONFIG_CMDLINE_TAG
第二项时钟设置查看U-boot中的配置,也没有问题。 u-boot-2009.03/board/xxx/mini2440/mini2440.c#if defined(CONFIG_S3C2440)/* Fout = 405MHz */#define M_MDIV 0x7f#define M_PDIV 0x2#define M_SDIV 0x1#endif
再查下 Machine ID 。 zwolf 提到方法,打开内核的Debug选项make menuconfigKernel hacking --->[*] Kernel debugging[*] Kernel low-level debugging functions[*] Kernel low-level debugging messages via S3C UART
编译运行得到如下提示:Starting kernel ... Uncompressing Linux................................................................................................................................... done, booting the kernel. Error: unrecognized/unsupported machine ID (r1 = 0x0000016a). Available machine support: ID (hex) NAME 000007cf FriendlyARM Mini2440 development board Please check your kernel config and/or bootloader.
用bdinfo命令查看u-boot端的ID : bdinfo [u-boot@MINI2440]# bdinfoarch_number = 0x0000016Aenv_t = 0x00000000boot_params = 0x30000100DRAM bank = 0x00000000-> start = 0x30000000-> size = 0x04000000ethaddr = 08:08:11:18:12:27ip_addr = 192.168.10.172baudrate = 115200 bps 基本上可以确定从U-boot得到的ID为 362 (0x0000016a), 而内核中的ID为 1999 (000007cf)。分别查找。内核中的 Machine ID 为: linux-2.6.29/include/asm-arm/mach-types.h #define MACH_TYPE_MINI2440 1999 U-boot中对应也有该定义: u-boot-2009.03/include/asm-arm/mach-types.h #define MACH_TYPE_MINI2440 1999 二者是一致的,再查找一下ID为362的Machine是 MACH_TYPE_S3C2440,看来是u-boot没有传递正确的ID。grep一下MACH_TYPE_S3C2440,在如下位置找到原因: u-boot-2009.03/board/xxx/mini2440/mini2440.c #if defined(CONFIG_S3C2440)/* arch number of S3C2440-Board */ gd->bd->bi_arch_number = MACH_TYPE_S3C2440 ;#endif 把这里的 MACH_TYPE_S3C2440 改为 MACH_TYPE_MINI2440 就OK了。另外如果不动U-boot端,在Linux端临时试验的话,可以在Linux启动代码中手动加入该参数,使其与mach-types.h中的值统一起来,方法参考 这个帖子 ,注意mov指令操作数的要求。 linux-2.6.29/arch/arm/kernel/head.S ENTRY(stext)/*---------add begin----------/ mov r0, #0 mov r1, #0xc1 ldr r2, =0x30000100/*---------add end-----------*/ msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode 以上三项,我都全部测试过,还不行,哎,非常的沮丧,后来才发现我犯了个低级错误,就是在使用mkimage时:mkimage -n 'linux-2.6.32.2' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.img
其实正确的应该是:
mkimage -n 'linux-2.6.32.2' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img
这个问题,折腾了我好久,哎,都怪基本概念都没搞清楚,吸取教训
mkimage -n 'linux-2.6.32.2' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.img