以前用的u-boot是1.1.5的,为了熟悉u-boot,及更好的认识at91sam9260,下载了一个最新版本u-boot1.3.4,然后又在atmel的官方网站上下了个补丁,编译顺利通过。
刚开始我就想使用u-boot1.3.4,由于保存环境变量时出现问题,就又退回使用1.1.5了。下载到板子上,设置好几个参数。
saveenv
ok,没问题。
又写入了几个变量,
saveenv
出现
FAILED!
没保存成功。
多试验了几次,发现把u-boot烧进板子之后,就第一次设置环境变量会成功,后面的都会失败。
怎么出现失败的呢?
写的时候有个提示,在0x60000检测到了坏块。
读u-boot的README,发现1.3.4增加了坏块检测功能。并且它有2个保存环境变量的区域。
存的地址如下:
/* bootstrap + u-boot + env + linux in nandflash */
#define CFG_ENV_IS_IN_NAND 1
#define CFG_ENV_OFFSET 0x60000
#define CFG_ENV_OFFSET_REDUND 0x80000
#define CFG_ENV_SIZE 0x20000 /* 1 sector = 128 kB */
然后看程序
int writeenv(size_t offset, u_char *buf)
{
size_t end = offset + CFG_ENV_RANGE;
size_t amount_saved = 0;
size_t blocksize;
u_char *char_ptr;
blocksize = nand_info[0].erasesize;
while (amount_saved < CFG_ENV_SIZE && offset < end) {
if (nand_block_isbad(&nand_info[0], offset)) {
offset += blocksize;
} else {
char_ptr = &buf[amount_saved];
if (nand_write(&nand_info[0], offset, &blocksize,
char_ptr))
return 1;
offset += blocksize;
amount_saved += blocksize;
}
}
if (amount_saved != CFG_ENV_SIZE)
{
return 1;
}
return 0;
}
见红色部分,由于我的坏区刚好在0x60000,所以u-boot1.3.4把这一块跳过去了,
offset 加上blocksize后就等于end了,也就跳出了循环, 然后就从蓝色部分跳出,写入失败!
我的u-boot是下载在0x20000,而且我给u-boot分配了2M的空间,资源应该足够了,既然0x60000有坏区,我就把他们的地址都加上0x20000,宏定义如下:
/* bootstrap + u-boot + env + linux in nandflash */
#define CFG_ENV_IS_IN_NAND 1
#define CFG_ENV_OFFSET 0x80000
#define CFG_ENV_OFFSET_REDUND 0xa0000
#define CFG_ENV_SIZE 0x20000 /* 1 sector = 128 kB */
改好之后,u-boot就可以正常保存变量了。
不知道这算不算u-boot1.3.4的一个BUG?或者说我的用法有问题?
这一块还得优化,万一坏块又出现在0x80000了,岂不又完了?今天没时间弄了,以后继续。 |