uboot 環境變數設定研究

2021-07-04 04:39:23 字數 3689 閱讀 6291

首先要知道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...