今天用主线Linux内核移植到MINI6410,主线内核2.6.37.1基本已经支持了MINI6410的板子,因此移植到可以启动起来的阶段很简单,可是在移植的时候仍是出现了一个比较常见的问题:css
一、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 查看下面这个结构体:
- MACHINE_START( MINI6410 , "MINI6410" )
- /* Maintainer: Darius Augulis <augulis.darius@gmail.com> */
- . 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
这个宏的定义在arch/arm/include/asm/mach/arch.h
- /*
- * 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
只要这两个数对上就能够了。
二、串口驱动没有编译入内核
在弄MINI6410的时候我就犯了这个错误,由于尚未MINI6410的默认配置文件,全部这个要本身选上的。位置在Device Drivers->Character devices->Serial drivers中linux
三、内核启动参数设置错误 web
内核的启动参数的错误也能够形成一样的错误。函数
好比有一个配置是:ui
关键是在 console=ttySAC0,115200上,若是 ttySAC0弄错了,或者波特率不对就会出问题。.net
不一样的CPU的 console有可能不同,好比有的多是 ttyS0。code
ref: http://blog.csdn.net/challen537/article/details/6544878orm