主题 : uboot中的env_init()函数问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 9254
精华: 0
发帖: 44
金钱: 450 两
威望: 225 点
综合积分: 88 分
注册时间: 2009-09-23
最后登录: 2009-12-12
楼主  发表于: 2009-10-24 16:48

 uboot中的env_init()函数问题

管理提醒: 本帖被 qq2440 从 Linux技术交流专区 移动到本区(2010-02-08)
版主,uboot在执行env_init()函数时,调用的是Env_flash.c文件中的,还是Env_nand.c文件中的呢?这个是由什么决定的呢?还有 CFG_ENV_ADDR,CFG_ENV_OFFSET这两个值是如何确定的呢? 我用sourceinsight看源码只找到#if defined(CFG_ENV_IS_IN_FLASH)
# ifndef  CFG_ENV_ADDR
#  define CFG_ENV_ADDR    (CFG_FLASH_BASE + CFG_ENV_OFFSET)
# endif
# ifndef  CFG_ENV_OFFSET
#  define CFG_ENV_OFFSET (CFG_ENV_ADDR - CFG_FLASH_BASE)
# endif
可是CFG_ENV_ADDR和CFG_ENV_OFFSET 是互相依赖的啊?怎么确定呢?请斑竹指点一下。。。。
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2009-10-24 22:49
版主,uboot在执行env_init()函数时,调用的是Env_flash.c文件中的,还是Env_nand.c文件中的呢?这个是由什么决定的呢?

这是env_flash.c中的代码:
复制代码
  1.   28
  2.   29 #include <common.h>
  3.   30
  4.   31 #if defined(CFG_ENV_IS_IN_FLASH) /* Environment is in Flash */

这是env_nand.c里的代码
复制代码
  1.   31
  2.   32 #include <common.h>
  3.   33
  4.   34 #if defined(CFG_ENV_IS_IN_NAND) /* Environment is in Nand Flash */

很明显,调用哪个C档里的env_init由预编译宏CFG_ENV_IS_IN_FLASH和CFG_ENV_IS_IN_NAND决定的。

还有 CFG_ENV_ADDR,CFG_ENV_OFFSET这两个值是如何确定的呢?

这两个宏都是用来定义uboot环境变量在NOR/NAND Flash中的位置的。其中CFG_ENV_ADDR用于环境变量存储于NOR Flash, CFG_ENV_OFFSET用于NOR或者NAND Flash。

我用sourceinsight看源码只找到#if defined(CFG_ENV_IS_IN_FLASH)
# ifndef  CFG_ENV_ADDR
#  define CFG_ENV_ADDR    (CFG_FLASH_BASE + CFG_ENV_OFFSET)
# endif
# ifndef  CFG_ENV_OFFSET
#  define CFG_ENV_OFFSET (CFG_ENV_ADDR - CFG_FLASH_BASE)
# endif
可是CFG_ENV_ADDR和CFG_ENV_OFFSET 是互相依赖的啊?怎么确定呢?

这会由预编译器正确处理,你不用担心。通常情况下,某一具体的硬件平台会定义CFG_ENV_ADDR和CFG_ENV_OFFSET其中之一。具体的例子可以搜索include/configs/目录下的<board name>.h文件
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 9254
精华: 0
发帖: 44
金钱: 450 两
威望: 225 点
综合积分: 88 分
注册时间: 2009-09-23
最后登录: 2009-12-12
2楼  发表于: 2009-10-26 09:10
谢谢斑竹,,对于预编译宏CFG_ENV_IS_IN_FLASH和CFG_ENV_IS_IN_NAND我还有些疑问,,CFG_ENV_IS_IN_FLASH是指环境变量存储在nor flash,
而CFG_ENV_IS_IN_NAND指环境变量存储在nand flash吗?
我看了移植到qq2440的uboot,它的qq2440.h中定义了:
defined CFG_ENV_IS_IN_FLASH    1,
#define CONFIG_AMD_LV800    1
#ifdef CONFIG_AMD_LV800
#define PHYS_FLASH_SIZE        0x00100000 /* 1MB */
#define CFG_MAX_FLASH_SECT    (19)    /* max number of sectors on one chip */
#define CFG_ENV_ADDR        (CFG_FLASH_BASE + 0x0F0000) /* addr of environment */
#endif
因为我的nor flash 与qq2440的开发板不一样,所以我打算把环境变量放在nand flash中,那么我在我的<board name>.h定义
defined CFG_ENV_IS_IN_NAND   1,根据你上面的说明,我还应该定义CFG_ENV_OFFSET的值,这么值该如何定义?需要考虑什么呢?
级别: 新手上路
UID: 10499
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
综合积分: 2 分
注册时间: 2009-11-06
最后登录: 2011-10-17
3楼  发表于: 2010-06-22 01:28
uboot2009.11中的env_nand.c文件中没有
  31

  32 #include <common.h>

  33

  34 #if defined(CFG_ENV_IS_IN_NAND) /* Environment is in Nand Flash */
那么如何判断uboot在执行env_init()函数时,env_init()调用自哪个文件呢?