这段时间调试linux内核,手里拿到的BSP包和uboot有好几个,用错了uboot和kernel后发现报错Error: unrecognized/unsupported machine ID,做一下简单分析。

     linux内核启动时候会读取uboot传来的参数,其中包括MACH_TYPE这个参数,如果uboot传给内核的值与内核定义的不一样,就会报错。解决方法有两个:1.修改uboot, 2.修改内核。

1.修改uboot

这个值在uboot的板级初始化函数内设置。查看Makefile或者boards.cfg查看板级配置文件所在的目录。一般在board/XXX下。

比如u-boot/board/timll/LSDboard/LSDboard.c

45 /*
 46  * Routine: board_init
 47  * Description: Early hardware init.
 48  */
 49 int board_init(void)
 50 {
 51     DECLARE_GLOBAL_DATA_PTR;
 52
 53     gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
 54     /* board id for Linux */
 55     gd->bd->bi_arch_number = MACH_TYPE_OMAP3_LSD;
 56     /* boot param addr */
 57     gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
 58
 59     return 0;
 60 }

第55行 gd->bd->bi_arch_number = MACH_TYPE_OMAP3_LSD;就是在设置ID号,修改这里的值和linux内核的相同就可以了。MACH_TYPE_OMAP3_LSD的定义在arch/arm/include/asm/mach-types.h。

2.修改内核

linux内核中MACH_TYPE_XXXX的宏定义在include/asm-arm/mach-types.h内,具体使用哪个,由配置文件决定。

 2535 #define MACH_TYPE_OMAP3_DEVKIT8500     2793
 2536 #define MACH_TYPE_OMAP3_LSD            2794
 2537 #define MACH_TYPE_OMAP3_SBC8510        2795
。。。

。。。

32791 #ifdef CONFIG_MACH_OMAP3_LSD
32792 # ifdef machine_arch_type
32793 #  undef machine_arch_type
32794 #  define machine_arch_type __machine_arch_type
32795 # else
32796 #  define machine_arch_type MACH_TYPE_OMAP3_LSD
32797 # endif
32798 # define machine_is_omap3_LSD() (machine_arch_type == MACH_TYPE_OMAP3_LSD)
32799 #else
32800 # define machine_is_omap3_LSD() (0)
32801 #endif
可以直接修改这边的代码,增加自定义的类型。

Logo

更多推荐