uboot移植之uboot和kernel的参数传递

来源:互联网 发布:js超出两行显示省略号 编辑:程序博客网 时间:2024/05/21 07:13
从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
转自:http://blog.csdn.net/songqqnew/article/details/6847392
0 0