今天用主線Linux內核移植到MINI6410,主線內核2.6.37.1基本已經支持了MINI6410的板子,所以移植到能夠啟動起來的階段很簡單,但是在移植的時候還是出現了一個比較常見的問題:
1、machine type 不匹配
在內核自解壓完成以後內核會首先會進入 bl __lookup_machine_type函數(在arch/arm/kernel/head.S中),檢查machine_type是否匹配,如果不匹配會跳入__error_a函數(在arch/arm/kernel/head-common.S中),導致啟動失敗。
例如arch/arm/mach-s3c64xx/mach-mini6410.c 查看下面這個結構體:這個宏的定義在arch/arm/include/asm/mach/arch.h
- MACHINE_START(MINI6410, "MINI6410")
- /* Maintainer: Darius Augulis <[email protected]> */
- .boot_params = S3C64XX_PA_SDRAM + 0x100,
- .init_irq = s3c6410_init_irq,
- .map_io = mini6410_map_io,
- .init_machine = mini6410_machine_init,
- .timer = &s3c24xx_timer,
- MACHINE_END
- /*
- * Set of macros to define architecture features. This is built into
- * a table by the linker.
- */
- #define MACHINE_START(_type,_name) \
- static const struct machine_desc __mach_desc_##_type \
- __used \
- __attribute__((__section__(".arch.info.init"))) = { \
- .nr = MACH_TYPE_##_type, \
- .name = _name,
- #define MACHINE_END \
- };
這個宏定義擴展之後的machine type 就成了 MACHINE_TYPE_MIN6410。 MACHINE_TYPE_MIN6410這個宏定義在include/generated/mach-types.h
machine type在u-boot的配置在board/samsung/mini6410/mini6410.c
這個宏的定義在:include/configs/mini6410.h
只要這兩個數對上就可以了。
2、串口驅動沒有編譯入內核
在弄MINI6410的時候我就犯了這個錯誤,因為還沒有MINI6410的默認配置文件,所有這個要自己選上的。位置在Device Drivers->Character devices->Serial drivers中
3、內核啟動參數設置錯誤
內核的啟動參數的錯誤也可以造成同樣的錯誤,但是這種錯誤可能有幾種:
(1)控制台串口配置字符串不匹配
比如有一個配置是:
關鍵是在console=ttySAC0,115200上,如果ttySAC0弄錯了,或者波特率不對就會出問題。
不同的CPU的console有可能不一樣,比如:
有的可能是ttyS0,
三星的CPU一般是ttySAC0,
早期TI ARM 處理器的一般是ttyS2,
後來TI Omap系列的高版本內核變成了ttyO2。把“S”變成了“ O”,代表Omap。自戀阿~~~~
(2)內存大小配置錯誤 如果在“mem=64M”這個參數上配置出現了問題,比如配置過大了,也會出現同樣的現象。 請注意你的系統內存和這個值的匹配關系。