请求支援:关于saveenv的问题

bbjyczy 2010-09-27 02:48:31
我在调一块板子的boot。先用saveenv保存参数。提示如下

Saving Environment to Flash...
Protect off 01020000 ... 0102FFFF
Un-Protected 1 sectors
Erasing Flash... [XXXXX]
Error: Erase Failure!
Erased 1 sectors
Writing to Flash... ********#
Error: Program Failure!
done
Protected 1 sectors

保存参数失败了。貌似是flash坏了。

紧接着,我使用printenv来打印


bootdelay=3
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
netmask=255.255.255.0
gatewayip=10.10.52.1
serverip=192.168.2.121
ipaddr=192.168.2.120
getwayip=192.168.2.1

Environment size: 162/65532 bytes


我认为printenv打印出来的这些参数存放的flash地址和saveenv要操作的flash地址一致。那么flash就又没有坏。

那为什么saveenv不能保存参数呢。?

注解:我使用hharm2410-R6的板子。我用JTAG重新烧录了PPCBOOT。PPCBOOT.BIN是华恒光碟里的文件。



...全文
181 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bbjyczy 2010-09-28
真乃高人也。兄弟我数次得你帮助。确实是PPCBOOT.BIN的文件的问题。我换了一个版本就可以了。
回复
deep_pro 2010-09-27
uboot 是从ppcboot发展来的,不过没用过ppcboot,猜测行为是类似的
你的报错说擦除flash错误,flash坏掉的概率小于你软件错误的概率
仔细检查少些的镜像是否是以前成功的那个
回复
bbjyczy 2010-09-27
回复4楼,
1。通过三楼这么一说,我怀疑是FLASH坏了。
2。我的是PPCBOOT。不是UBOOT。当然可能差不多。帖代码啊?会不会很长啊。
3。我上个星期在同一块板子上做SAVEENV是通过的。后来想练一下手,就用TJAG重新烧写了PPCBOOT。结果就SAVEENV就不通过了。郁闷的很。

int saveenv(void)
{
int rc = 1;

printf ("Protect off %08lX ... %08lX\n",
(ulong)flash_addr, end_addr);

if (flash_sect_protect (0, (ulong)flash_addr, end_addr)) {
goto Done;
}

debug ("Protect off %08lX ... %08lX\n",
(ulong)flash_addr_new, end_addr_new);

if (flash_sect_protect (0, (ulong)flash_addr_new, end_addr_new)) {
goto Done;
}

puts ("Erasing Flash...");
debug (" %08lX ... %08lX ...",
(ulong)flash_addr_new, end_addr_new);

if (flash_sect_erase ((ulong)flash_addr_new, end_addr_new)) {
goto Done;
}

puts ("Writing to Flash... ");
debug (" %08lX ... %08lX ...",
(ulong)&(flash_addr_new->data),
sizeof(env_ptr->data)+(ulong)&(flash_addr_new->data));
if (flash_write(env_ptr->data,
(ulong)&(flash_addr_new->data),
sizeof(env_ptr->data)) ||

flash_write((char *)&(env_ptr->crc),
(ulong)&(flash_addr_new->crc),
sizeof(env_ptr->crc)) ||

flash_write((char *)&obsolete_flag,
(ulong)&(flash_addr->flags),
sizeof(flash_addr->flags)) ||

flash_write((char *)&active_flag,
(ulong)&(flash_addr_new->flags),
sizeof(flash_addr_new->flags)))
{
flash_perror (rc);
goto Done;
}
puts ("done\n");

{
env_t * etmp = flash_addr;
ulong ltmp = end_addr;

flash_addr = flash_addr_new;
flash_addr_new = etmp;

end_addr = end_addr_new;
end_addr_new = ltmp;
}

rc = 0;
Done:

/* try to re-protect */
(void) flash_sect_protect (1, (ulong)flash_addr, end_addr);
(void) flash_sect_protect (1, (ulong)flash_addr_new, end_addr_new);

return rc;
}


回复
deep_pro 2010-09-27
把你的uboot启动代码沾来
如果从来没保存过,如3L所说
会出现Waring: BAD CRC 之类的提示
回复
pottichu 2010-09-27
我晕。。

如果你重来没有保存过 环境变量的话, 环境变量是在代码里初始化的,
不是从 flash 上读出来的 。
回复
bbjyczy 2010-09-27
SDRAM里的数据还不是从flash里来的。
回复
pottichu 2010-09-27
重启以前, printenv 打印出来的是 内存中的数据。
回复
相关推荐
发帖
Linux_Kernel
创建于2007-08-27

4155

社区成员

Linux/Unix社区 内核源代码研究区
申请成为版主
帖子事件
创建了帖子
2010-09-27 02:48
社区公告
暂无公告