再使用u_boot时敲pri命令,会打印环境变量,而且每次更改之后,sav,下次开机环境变量还会存在。
其实在使用# pri命令时发现最后一行有
bootargs=root=/dev/nfs nfsroot=192.168.1.10:/nfsroot ip=192.168.1.20 console=tt0
baudrate=115200
ethaddr=00:40:5c:26:0a:5b
bootdelay=3
bootcmd=tftp 50008000 arm.bin;nand erase 0 40000;nand write 50008000 0 40000
stdin=serial
stdout=serial
stderr=serial
filesize=2720
fileaddr=50008000
gatewayip=192.168.1.1
netmask=255.255.255.0
ipaddr=192.168.1.20
serverip=192.168.1.10
Environment size: 382/16380 bytes
最后一行,可知环境表两大小为16KB.又知u_boot在nand flash中到位置时0-0x40000(256KB),所以可以把环境变量存放在(0x36000 - 0x40000)位置上。代码如下
void env_init(void) { int i; int flag = 1; nand_read(0x50000000, 0x36000, 12*128);//读取nand 下次开机时看是否已经初始化过环境变量 flag = str_cmp((char *)0x50000000, "serial");//我的环境变量以数组存储的,第一个时stdout变量 //uart_printf("env init: %d\n", flag); if(!flag) { for(i = 0; i < 12; i++) { str_cpy(myenv[i].env_str, (char *)0x50000000 + i * 128);//如果已经初始化过,从nand 中读取到结构体数组中 sum_length += str_len(myenv[i].env_str); //计算环境变量到字节长 } env_time = chartod(myenv[3].env_str);//初始化bootdelay信息 } else//为初始化,打印初始化信息,并存入nand中 { for(i = 0; i < 12; i ++) { str_cpy(myenv[i].env_str, env_init_str[i]); sum_length += str_len(env_init_str[i]); } env_time = chartod(myenv[3].env_str); sav_env(); } }
void sav_env(void) { nand_erase(0x36000,0x40000); nand_write((unsigned long *)myenv,0x36000,12 * 128); uart_printf("Saving Environment to NAND...\ndone\n"); }这样每次开机中哦后就可以读取自己修改到变量信息啦。