liweikui 发表于 2009-12-21 14:24:00
在<<移植linux 2.6.31到OK2440V3开发板(1)---bootm手动引导>>一文中,执行完第6步的操作后,启动u-boot后,用bootm命令来引导内核(执行bootm 0x30008000),但是执行后,卡住了,无法启动内核,现象如下:
Starting kernel ...
Uncompressing Linux.............................................................
Error: unrecognized/unsupported machine ID (r1 = 0x000000c1).
Available machine support:
ID (hex) NAME
000000a8 SMDK2440
从这里的提示信息可知,是u-boot的机器码和linux的不相同造成的,u-boot是0x000000c1(193),内核是0x0000016A(362)。网上大多数都是修改的linux内核的机器码,在arch/arm/tools/mach-types.h中,让它们一致,具体修改哪一方,我觉得要看情况而定。
我们先看u-boot的机器码和linux的机器码是在什么地方决定的(为了搞清这个问题,我找了一天时间,呵呵)。u-boot的机器码是在u-boot的board/samsung/ok2440v3/ok2440v3.c文件里决定的:
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
查看u-boot/include/asm-arm/mach-types.h文件,有:
#define MACH_TYPE_SMDK2410 193
#define MACH_TYPE_S3C2440 362
这就是我们上面看到r1 = 0x000000c1(193)的原因。
而linux的机器码是由arch/arm/mach-s3c2440/mach-smdk2440.c下面的MACHINE_START(S3C2440, "SMDK2440")中的第一个参数S3C2440(关键字)决定的:
MACHINE_START(S3C2440, "SMDK2440")
/* Maintainer: Ben Dooks <ben@fluff.org> */
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = smdk2440_map_io,
.init_machine = smdk2440_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END
查看内核目录下的arch/arm/tools/mach-types.h文件,有:
smdk2410 ARCH_SMDK2410
本文来自:我爱研发网(52RD.com) - R&D大本营
详细出处:http://www.52rd.com/Blog/Detail_RD.Blog_liweikui_22426.html