Chinaunix首页 | 论坛 | 博客
  • 博客访问: 291161
  • 博文数量: 65
  • 博客积分: 1490
  • 博客等级: 上尉
  • 技术积分: 835
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-16 20:00
文章分类

全部博文(65)

文章存档

2015年(1)

2012年(3)

2010年(7)

2009年(54)

我的朋友

分类: LINUX

2009-04-14 14:28:11

 /*

*By Neil Chiao ()

*转载请注明出处:neilengineer.cublog.cn

*欢迎到“新星湾()”指导

*/

U-boot中有一个用来保存很多有用信息的全局结构体--gd_tglobal data缩写),其中包括了bd变量,可以说gd_t结构体包括了u-boot中所有重要全局变量。

对于ARM平台这个结构体的定义大致如下:

include/asm-arm/global_data.h

typedef    struct      global_data {

       bd_t        *bd;

       unsigned long  flags;

       unsigned long  baudrate;

       unsigned long  have_console; /* serial_init() was called */

       unsigned long  reloc_off;       /* Relocation Offset */

       unsigned long  env_addr;       /* Address  of Environment struct */

       unsigned long  env_valid;       /* Checksum of Environment valid? */

       unsigned long  fb_base;  /* base address of frame buffer */

       void        **jt;        /* jump table */

} gd_t;

 

U-boot中使用gd结构之前要用先用宏DECLARE_GLOBAL_DATA_PTR来声明。这个宏的定义如下:

include/asm-arm/global_data.h

#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")

 

从这个宏的定义可以看出,gd是一个保存在ARMr8寄存器中的gd_t结构体的指针。

 

对于我这里的Linux Kernel(经过修改的),可这样使用U-boot传递来的gd中的bd时用的是arm_bd:

 

arch/arm/kernel/setup.c文件中:

void __init setup_arch(char **cmdline_p)

{

……

       struct tag *tags = (struct tag *)&init_tags;

       struct machine_desc *mdesc;

       char *from = default_command_line;

       void *bd_offset = NULL;

……

       save_bd(bd_offset);

……

}

 

save_bd()

void __init save_bd(void* addr)

{

       memcpy((char *)__res,  (char *)addr,  sizeof(bd_t));

       arm_bd = (bd_t *)__res;

}

 
注意: 本文的U-boot和Linux kernel都是自行修改后的,所以可能在官方linux kernel中找不到这些代码。
阅读(1296) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~