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

再使用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");
}



这样每次开机中哦后就可以读取自己修改到变量信息啦。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值