Chinaunix首页 | 论坛 | 博客
  • 博客访问: 326348
  • 博文数量: 135
  • 博客积分: 867
  • 博客等级: 准尉
  • 技术积分: 865
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-15 14:50
文章分类

全部博文(135)

文章存档

2012年(135)

分类: LINUX

2012-09-18 09:22:55

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) |
给主人留下些什么吧!~~