Q2. 如今又有新问题了,还是saveenv的问题。
saveenv后,出现以下内容
erasing nand....
waring: erase size 0x00020000 smaller than a erase block 0x00040000
erase 0x00040000 instead
NAND 1Gib 3.3V 8bit: MTD erase failure:-22
writing to NAND......FAILED!
我追踪了一下saveenv()的代码,在/common/env_nand.c中
#else /* ! CONFIG_ENV_OFFSET_REDUND */
int saveenv(void)
{
int ret = 0;
nand_erase_options_t nand_erase_options;
nand_erase_options.length = CONFIG_ENV_RANGE;
nand_erase_options.quiet = 0;
nand_erase_options.jffs2 = 0;
nand_erase_options.scrub = 0;
nand_erase_options.offset = CONFIG_ENV_OFFSET;
if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE)
return 1;
puts ("Erasing Nand...\n");
if (nand_erase_opts(&nand_info[0], &nand_erase_options))
return 1;
puts ("Writing to Nand... ");
if (writeenv(CONFIG_ENV_OFFSET, (u_char *) env_ptr)) {
puts("FAILED!\n");
return 1;
}
puts ("done\n");
return ret;
}
saveenv()调用了nand_erase_opts(),产生我错误的原因就在下面这几段中。
if (erase_length < meminfo->erasesize) {
printf("Warning: Erase size 0x%08lx smaller than one " \
"erase block 0x%08x\n",erase_length, meminfo->erasesize);
printf(" Erasing 0x%08x instead\n", meminfo->erasesize);
erase_length = meminfo->erasesize;
mtd_info数据结构中定义的擦除大小是nandflash的一个页(半页或是1/4页)
u_int32_t erasesize;
/* Minimal writable flash unit size. In case of NOR flash it is 1 (even
* though individual bits can be cleared), in case of NAND flash it is
* one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR
* it is of ECC block size, etc. It is illegal to have writesize = 0.
* Any driver registering a struct mtd_info must ensure a writesize of
* 1 or larger.
*/
CONFIG_ENV_SIZE 0x20000 这个明显要比NAND Flash的页要大啊!
为什么会出现问题呢?


Q1.(已解决)我把u-boot烧到nand flash 0x0--0x60000
mkimage做的zImage.img烧到0x80000--0x500000
使用nand read 0x30008000 0x80000 0x500000;bootm可以启动内核
但是用saveenv bootcmd nand read 0x30008000 0x80000 0x500000;bootm显示
Wrong Image Format for bootm command
ERROR:can't get kernel image!
重启之后打印变量bootcmd 也没有改变

[ 此帖被turbowing在2010-08-02 19:43重新编辑 ]