Linux内核的启动参数可以由内核默认设定,也可以通过u-boot传递。相对来说,u-boot传递的灵活性更强,只须设置bootargs环境变量即可;而内核的默认设置改变,则需要重新编译内核。
把u-boot移植到s3c2410的板,多次是复制修改smdk2410的配置。然而,smdk2410的默认配置没有启用启动参数传递,引导内核使用的是内核默认的启动参数。即使设置:
setenv bootargs root=/dev/mtdblock2 init=/bin/bash console=ttySAC0,115200
内核仍然使用其默认参数,该启动参数并没有传递。
原因分析如下:
先看看lib_arm/Armlinux.c中:
......... #if defined (CONFIG_SETUP_MEMORY_TAGS) || \ defined (CONFIG_CMDLINE_TAG) || \ defined (CONFIG_INITRD_TAG) || \ defined (CONFIG_SERIAL_TAG) || \ defined (CONFIG_REVISION_TAG) || \ defined (CONFIG_LCD) || \ defined (CONFIG_VFD) static void setup_start_tag (bd_t *bd) { params = (struct tag *) bd->bi_boot_params; …………
|
该段程序先判断是否定义了CONFIG_CMDLINE_TAG等,才决定是否给内核传递参数。而board/smdk2410/smdk2410.h中并没有定义CONFIG_CMDLINE_TAG,问题就出现在这里。
因此,这里参照smdk2440.h的配置,在smdk2410.h(开发板名字.h)中添加以下3条定义(蓝色部分):
#define CONFIG_SYS_CLK_FREQ 12000000 /* SMDK2400 has 12 MHz input clock */ #undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */ #define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */ #define CONFIG_SETUP_MEMORY_TAGS 1 #define CONFIG_INITRD_TAG 1
|
重新编译就OK了。
(PS:只添加“#define CONFIG_CMDLINE_TAG 1”行不行?经过测试是不行的,系统启动到booting the kernel.就没有显示了。猜想是启动参数不完整造成,没有深入分析。)
阅读(2814) | 评论(1) | 转发(0) |