/************************************************************************
* Default settings to be used when no valid environment is found
* 找不到有效环境时使用的默认设置
*/
#define XMK_STR(x) #x
#define MK_STR(x)XMK_STR(x)
#ifdefined(CONFIG_S3C6410)||defined(CONFIG_S3C6430)||defined(CONFIG_S5P6440)||defined(CONFIG_S5PC100)||defined(CONFIG_S5PC110)||defined(CONFIG_S5P6442)
uchar default_environment[CFG_ENV_SIZE]={//default_environment:默认环境变量
#else
uchar default_environment[]={
#endif
#ifdef CONFIG_BOOTARGS//CONFIG_BOOTARGS(启动参数)如果定义了"bootargs="CONFIG_BOOTARGS"\0"//字符串+\0
#endif
#ifdef CONFIG_BOOTCOMMAND//CONFIG_BOOTCOMMAND如果定义了"bootcmd="CONFIG_BOOTCOMMAND"\0"
//Cmd_nvedit.cU_BOOT_CMD(
printenv,CFG_MAXARGS,1, do_printenv,"printenv- print environment variables\n","\n - print values of all environment variables\n""printenv name ...\n"" - print value of environment variable 'name'\n");
//Cmd_nvedit.cif(argc ==1){/* Print all env variables 打印所有环境变量*///第一重for循环就是处理各个环境变量。所以有多少个环境变量则第一重就执行循环多少圈。for(i=0;env_get_char(i)!='\0'; i=nxt+1){for(nxt=i;env_get_char(nxt)!='\0';++nxt);//执行结束之后,i指向命令首地址,nxt指向命令结束地址//用下面的for循环打印出此命令for(k=i; k<nxt;++k)putc(env_get_char(k));putc('\n');//换行//如果在打印过程中按下ctrl+c,可以打断此过程//终止打印if(ctrlc()){puts("\n ** Abort\n");return1;}}//ENV_SIZE:整个环境变量的大小//CFG_ENV_SIZE:16KB//# define ENV_HEADER_SIZE (sizeof(uint32_t) + 1)//#define ENV_SIZE (CFG_ENV_SIZE - ENV_HEADER_SIZE) 4Bprintf("\nEnvironment size: %d/%ld bytes\n",//打印信息
i,(ulong)ENV_SIZE);return0;}//Env_common.c
uchar env_get_char(int index){
uchar c;/* if relocated to RAM */if(gd->flags &GD_FLG_RELOC)
c =env_get_char_memory(index);else
c =env_get_char_init(index);return(c);}
2.9.3、环境变量相关命令源码解析2
2.9.3.1、setenv
//uboot/common/cmd_nvedit.cU_BOOT_CMD(
setenv,CFG_MAXARGS,0, do_setenv,"setenv - set environment variables\n","name value ...\n"" - set environment variable 'name' to 'value ...'\n""setenv name\n"" - delete environment variable 'name'\n");
//uboot/common/cmd_nvedit.c
int do_setenv(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){if(argc <2){printf("Usage:\n%s\n", cmdtp->usage);return1;}//没有_:自己可以随便用的//一个_:系统自己用的//两个_:系统内部自己用的,不用改//三个_:不用看//_do_setenv:只被do_setenv()函数调用return_do_setenv(flag, argc, argv);}
/*
* search if variable with this name already exists
* 搜索同名变量是否已经存在
*///第1步:遍历DDR中环境变量的数组,找到原来就有的那个环境变量对应的地址。
oldval =-1;for(env=env_data;*env; env=nxt+1){for(nxt=env;*nxt;++nxt)//第一个字符串走完;if((oldval =envmatch((uchar *)name, env-env_data))>=0)//表示找到break;//退出循环}
//Board.c/************************************************************************
* Look up variable from environment,
* return address of storage for that variable,
* or NULL if not found
* 从环境中查找变量,返回该变量的存储地址,如果没有找到,则返回空值
*///getenv函数用来获取字符串格式的环境变量的地址
char *getenv(char *name){
int i, nxt;WATCHDOG_RESET();//空的//遍历default数组for(i=0;env_get_char(i)!='\0'; i=nxt+1){
int val;for(nxt=i;env_get_char(nxt)!='\0';++nxt){if(nxt >=CFG_ENV_SIZE){//有无越界return(NULL);}}if((val=envmatch((uchar *)name, i))<0)//寻找环境变量,小于0没找到continue;return((char *)env_get_addr(val));}return(NULL);}
2.9.5.2、getenv_r
//Board.c//char *name:环境变量的名字//char *buf:要获取环境变量的值将来写在这里//unsigned len:长度//读取环境变量成功:返回值大于0;//读取环境变量失败:返回值小于0;
int getenv_r(char *name, char *buf, unsigned len)//读取环境变量{
int i, nxt;for(i=0;env_get_char(i)!='\0'; i=nxt+1){
int val, n;for(nxt=i;env_get_char(nxt)!='\0';++nxt){if(nxt >=CFG_ENV_SIZE){return(-1);}}if((val=envmatch((uchar *)name, i))<0)continue;/* found; copy out *///发现,复制出来
n =0;while((len > n++)&&(*buf++=env_get_char(val++))!='\0');if(len == n)*buf ='\0';return(n);}return(-1);}