您的位置:首页 > 其它

关于写u_boot时环境变量存储问题解决办法

2013-12-08 18:32 381 查看
再使用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");
}




这样每次开机中哦后就可以读取自己修改到变量信息啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐