uboot移植之uboot和kernel的参数传递
从uboot启动内核的形式theKernel (0, machid, bd->bi_boot_params)
可以看出uboot给内核传递了3个参数,第1个是0,第2个是机器码,第3个是参数列表在SDRAM的起始位置
刚好满足一下调用内核的条件
• R0=0。
• R1=机器类型ID;
• R2=启动参数标记列表在RAM 中起始基地址
①在 uboot/board/tekkamanninja/mini2440/mini2440.c的board_init函数中
指定机器码
gd->bd->bi_arch_number = MACH_TYPE_MINI2440
而MACH_TYPE_MINI2440定义在include/asm-arm/mach-types.h
#define MACH_TYPE_MINI2440 1999
需对应内核的linux/arch/arm/mach-s3c2440/mach-mini2440.c中一行代码
MACHINE_START(MINI2440, "MINI2440 test")
而MINI2440定义在linux/arch/arm/tools/mach-types
mini2440 MACH_MINI2440 MINI2440 1999
②在 uboot/board/tekkamanninja/mini2440/mini2440.c的board_init函数中
指定参数位置
gd->bd->bi_boot_params = 0x30000100;
对应内核的linux/arch/arm/mach-s3c2440/mach-mini2440.c中一行代码
.boot_params = S3C2410_SDRAM_PA + 0x100,
如果uboot没有给出gd->bd->bi_boot_params的值,则linux默认去这个地址寻址tag
如果uboot给出了gd->bd->bi_boot_params的值,则linux则按照uboot的给的这个地址去寻址tag
所以即使uboot中设置 gd->bd->bi_boot_params = 0x30000000或 0x30000200或 0x300000300(或许设置一个空闲的内存区就可以)
而内核的.boot_params = S3C2410_SDRAM_PA + 0x100,(就用不到了)
也能顺利启动内核,已试过
在试验中发现uboot中设置gd->bd->bi_boot_params=0或将gd->bd->bi_boot_params注释掉,都未能顺利启动内核。貌似在uboot必须为gd->bd->bi_boot_params指定一个值才行,而linux的.boot_params 始终都没有用到。
gd是一个全局结构体指针,用于uboot中各个文件中重要的参数传递,其成员见http://blog.csdn.net/songqqnew/article/details/6847699
看一下uboot在sdram 0x30000100处给内核传递了什么东东,见http://blog.csdn.net/songqqnew/article/details/6847609
参考嵌入式Linux应用开发完全手册ch15.1 p243
阅读(1507) | 评论(0) | 转发(0) |