首先要知道uboot的第二個階段是從libarm/board.c開始的,
void start_armboot (void),這個函式是檢查flash上的環境變數是否有效,下面的**中的init_sequence就是初始化列表
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
}
init_fnc_t *init_sequence = ;
env_init會找到很多,我用的板子nandflash,所以那些flash,nowhere,auto,onenand,nvram,都可以忽略
仔細看下面的**, env_is_embedded是把環境變數嵌入到**段,這個沒有配置,所以直接執行
gd->env_addr = (ulong)&default_environment[0];
gd->env_valid = 1;
int env_init(void)
if (gd->env_valid == 1)
env_ptr = tmp_env1;
else if (gd->env_valid == 2)
env_ptr = tmp_env2;
#else /* env_is_embedded */
gd->env_addr = (ulong)&default_environment[0];
gd->env_valid = 1;
#endif /* env_is_embedded */
return (0);
}
接著board.c往下走,來到
/* initialize environment */
env_relocate ();
void env_relocate (void)
else
gd->env_addr = (ulong)&(env_ptr->data);
#ifdef config_amigaoneg3se
disable_nvram();
#endif
}
這個函式首先會讀取flash的 環境變數,若讀取失敗或者讀到的大小不對會用預設的環境變數
先看看nand_read的定義
static inline int nand_read(nand_info_t *info, off_t ofs, size_t *len, u_char *buf)
int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
可以理解為從nand[0](第一塊nandflash)的偏移 cfg_env_offset讀資料, 返回值:total, (u_char*)env_ptr,
env_ptr是下面的結構體,包含三個東西,都是
typedef struct environment_s env_t;
#define cfg_env_offset 0x00100000//0x00080000
#define cfg_env_size 0x4000 /* 0x8000//total size of environment sector */
void env_relocate_spec (void)
用default env,就是填充env_ptr的data區域,並把flags置為0xff,計算crc放入env_ptr的crc區域,flags是什麼東東,下次更新????
void set_default_env(void)
memset(env_ptr, 0, sizeof(env_t));
memcpy(env_ptr->data, default_environment,
sizeof(default_environment));
#ifdef cfg_redundand_environment
env_ptr->flags = 0xff;
#endif
env_crc_update ();
gd->env_valid = 1;
}
下面的read是在**實現的呢?
首先記住mtd_info 和 nand_info_t是相等的
typedef struct mtd_info nand_info_t;
extern int nand_curr_device;
extern nand_info_t nand_info;
static inline int nand_read(nand_info_t *info, off_t ofs, size_t *len, u_char *buf)
到drivers/mtd/nand/找到nand_base.c
看到如下**:原來read就是nand_read
int nand_scan_tail(struct mtd_info *mtd)
/* fill in remaining mtd driver data */
mtd->type = mtd_nandflash;
mtd->flags = mtd_cap_nandflash;
mtd->ecctype = mtd_ecc_sw;
mtd->erase = nand_erase;
mtd->point = null;
mtd->unpoint = null;
mtd->read = nand_read;
mtd->write = nand_write;
mtd->read_oob = nand_read_oob;
mtd->write_oob = nand_write_oob;
mtd->sync = nand_sync;
mtd->lock = null;
mtd->unlock = null;
mtd->suspend = nand_suspend;
mtd->resume = nand_resume;
mtd->block_isbad = nand_block_isbad;
mtd->block_markbad = nand_block_markbad;
int nand_read(struct mtd_info *mtd, loff_t from, size_t len,
size_t *retlen, uint8_t *buf)
這個/drivers/mtd/nand/nand_base.c由核心的/drivers/mtd/nand/nand_base.c移植而來
nand_base中 s3c_nand_write_page_8bit等等 s3c_nand_xx 這個函式定義在 /cpu/s5pv210/nand.c中。要支援硬體ecc,必須保證uboot和linux核心的ecc校驗模式和演算法一致,這個nand.c就由核心的/drivers/mtd/nand/s3c_nand.c移植而來
uboot常用的環境變數
環境變數 相當於程式中的全域性變數,但是這裡不同的時在 uboot 雲翔的過程中,這個環境變數始終都是存在的。並且不會消失。環境變數 含義ipaddr 開發板本地的 ip位址 serverip 開發板通過 tftp 指令去tftp tftp 伺服器的 ip位址 gatewayip 開發板的本地閘道器...
Uboot中的環境變數
環境變數其實在uboot中就是一些全域性變數,用來修改uboot執行時的一些特徵,其外在表現為乙個個字串。環境變數的作用 能夠在不用重新編譯的前提下改變uboot執行時所表現出來的特徵,這樣當要調整uboot執行時特性就不用重新修改 編譯 執行uboot了。正常情況下環境變數應該同uboot ker...
設定環境變數
一.何謂環境變數 在所處的環境中,那些供系統或應用程式取用,而固定存在的一種特殊變數,稱之.環境變數可由系統預定或由您自行定義及修改,又稱為整體變數.也就是說 不管你身處何方,這些變數的值都跟著你的環境而存在.例如 path,shell,term等.顯示環境變數的方法如下 echo 變數名稱 如 e...