今天用主线Linux内核移植到MINI6410,主线内核2.6.37.1基本已经支持了MINI6410的板子,所以移植到能够启动起来的阶段很简单,但是在移植的时候还是出现了一个比较常见的问题:
1.
MINI6410 # bootm 0x50008000
2.
## Booting kernel from Legacy Image at 50008000 ...
3.
Image Name: Linux-2.6.37.1
4.
Image Type: ARM Linux Kernel Image (uncompressed)
5.
Data Size: 3800644 Bytes = 3.6 MiB
6.
Load Address: 50008000
7.
Entry Point: 50008040
8.
Verifying Checksum ... OK
9.
XIP Kernel Image ... OK
10.
OK
11.
Starting kernel ...
12.
Uncompressing Linux... done, booting the kernel.
13.
停住不动了~~~~
这种问题比较常见,由于输出的信息有限,不是很好找原因,如果去代码中追踪的话也比较麻烦。在查找原因解决这个问题的时候,我找到了一些可能出现的原因,在这里总结一下:
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
查看下面这个结构体
:
1.
MACHINE_START(MINI6410, "MINI6410")
3.
.boot_params = S3C64XX_PA_SDRAM + 0x100,
4.
.init_irq = s3c6410_init_irq,
5.
.map_io = mini6410_map_io,
6.
.init_machine = mini6410_machine_init,
7.
.timer = &s3c24xx_timer,
8.
MACHINE_END
这个宏的定义在
arch/arm/include/asm/mach/arch.h
1.
/*
2.
* Set of macros to define architecture features. This is built into
3.
* a table by the linker.
4.
*/
5.
#
define
MACHINE_START(_type,_name) \
6.
static
const struct machine_desc __mach_desc_##_type \
7.
__used \
8.
__attribute__((__section__(".arch.info.init"))) = { \
9.
10.
.nr = MACH_TYPE_##_type,
\
11.
12.
.
name = _name,
13.
14.
#
define
MACHINE_END \
15.
};
这个宏定义扩展之后的
machine type
就成了
MACHINE_TYPE_MIN6410
。
MACHINE_TYPE_MIN6410
这个宏定义在
include/generated/mach-types.h
1.
#
define
MACH_TYPE_MINI6410 2520
machine type
在
u-boot
的配置在
board/samsung/mini6410/mini6410.c
1.
/*
2.
* Miscellaneous platform dependent initialisations
3.
*/
4.
5.
int
board_init(void)
6.
{
7.
s3c64xx_gpio * const gpio = s3c64xx_get_base_gpio();
8.
9.
.....
10.
11.
gd->bd->bi_arch_number = MACH_TYPE;
12.
gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
13.
14.
return 0;
15.
}
这个宏的定义在:
include/configs/mini6410.h
1.
/*
2.
* Architecture magic and machine type
3.
*/
4.
#
define
MACH_TYPE 2520
只要这两个数对上就可以了。
2
、串口驱动没有编译入内核
在弄
MINI6410
的时候我就犯了这个错误,因为还没有
MINI6410
的默认配置文件,所有这个要自己选上的。位置在
Device Drivers->Character devices->Serial drivers
中
1.
<*> Samsung SoC serial support
2.
[*] Support for console on Samsung SoC serial port
3.
<*> Samsung S3C6400/S3C6410/S5P6440/S5P6450/S5PC100 Serial port support
3
、内核启动参数设置错误
内核的启动参数的错误也可以造成同样的错误。
比如有一个配置是:
1.
noinitrd root=/dev/mtdblock4 rootfstype=jffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M
关键是在
console=ttySAC0,115200
上,如果
ttySAC0
弄错了,或者波特率不对就会出问题。
不同的
CPU
的
console
有可能不一样,比如有的可能是
ttyS0
。
http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=129729