再使用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");
}
这样每次开机中哦后就可以读取自己修改到变量信息啦。