uboot....Linux机器码传递

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


解决方法一

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

    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.clinux内核的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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值