這段時間調試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
可以直接修改這邊的代碼,增加自定義的類型。