您的位置:首页 > 其它

machine ID 问题

2015-10-30 10:13 447 查看


Error: unrecognized/unsupported machine ID (r1 = 0x33f60264).


(2011-03-20
16:03:59)

标签:


unrecognized


unsupported


machine


id


内核id

分类: 私有






解决方法一


========================================================

Linux内核启动时出现:bad machine ID,原因大致是u-boot传递给内核的machine ID错误,可以手动在内核源代码中添加machine ID.

解决方法:

在u-boot命令行中输入bdinfo

查看板卡信息,我的输出如下:

[ ~ljh@GDLC ]# bdinfo

arch_number = 0x000000C1

env_t = 0x00000000

boot_params = 0x30000100

DRAM bank = 0x00000000

-> start = 0x30000000

-> size = 0x04000000

ethaddr = 08:00:3E:26:0A:5B

ip_addr = 10.1.8.245

baudrate = 115200 bps

修改内核的arch/arm/kernel/head.S,直接将s3c2410的参数赋给内核

# cd linux-2.6.19

# vi arch/arm/kernel/head.S +72

----------------------------------------------

70 __INIT

71 .type stext, %function

72 ENTRY(stext)

mov r0, #0

mov r1, #0xc1

ldr r2, =0x30000100

73 msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode

74 @ and irqs disabled

解决方法二
========================================================

启动u-boot后,用bootm命令来引导内核(执行bootm 0x30008000),但是执行后,卡住了,无法启动内核,现象如下:

Starting kernel ...
Uncompressing Linux.............................................................

Error: unrecognized/unsupported machine ID (r1 = 0x000000c1).

Available machine support:

ID (hex) NAME

000000** ****

从这里的提示信息可知,是u-boot的机器码和linux的不相同造成的,u-boot是0x000000c1(193),内核是0x000000**。大多数都是修改的linux内核的机器码,让它们一致即可。

先看u-boot的机器码和linux的机器码是在什么地方决定的。
1、 u-boot的机器码是在u-boot的board/fs2410/fs2410.c文件里决定的:

gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

参照查看u-boot的include/asm-arm/mach-types.h文件,有:

#define MACH_TYPE_SMDK2410 193
这就是我们上面看到r1 = 0x000000c1(193)的原因。

2、 而linux内核的机器码是由arch/arm/mach-s3c2410/mach-smdk2410.c下面的MACHINE_START(SMDK2410, "SMDK2440")中的第一个参数SMDK2410(关键字)决定的:

MACHINE_START(SMDK2410, "SMDK2410")

.phys_io = S3C2410_PA_UART,

.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

.boot_params = S3C2410_SDRAM_PA + 0x100,

.map_io = smdk2410_map_io,

.init_irq = s3c24xx_init_irq,

.init_machine = smdk2410_init,

.timer = &s3c24xx_timer,

MACHINE_END

参照查看内核目录下的arch/arm/tools/mach-types.h文件,有:

smdk2410 ARCH_SMDK2410 SMDK2410 193

只要保持两个文件(u-boot的board/fs2410/fs2410.c与linux内核的arch/arm/mach-s3c2410/mach-smdk2410.c)参照对象的码值一样就可以了!

解决方法三
========================================================

修改u-boot,填写ID;

# vi common/cmd_boot.c

----------------------------------------------

31 #if defined(CONFIG_I386)

32 DECLARE_GLOBAL_DATA_PTR;

33 #endif

====>

31 //#if defined(CONFIG_I386)

32 DECLARE_GLOBAL_DATA_PTR;

33 //#endif

...

60 #if !defined(CONFIG_NIOS)

if(argc==2)

rc = ((ulong (*)(int, char *[]))addr) (0, gd->bd->bi_arch_number);

else

61 rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);

62 #else

63

66 rc = ((ulong (*)(int, char *[]))(addr>>1)) (--argc, &argv[1]);

67 #endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: