u-boot-1.1.6之nor flash移植错误

    首先nor flash的移植已经成功了,这回尝试采用cfi接口。

    定义了几个宏之后可以正确识别flash的容量和型号了,但是发现用saveenv命令时提示写超时,这回纠结了,看写nor_flash的代码,看不太明白,云里雾里的,唉!接着用移植好的代码替换出错的代码一步步排查错误,将有关擦除和写的代码都替换了,这回不报错了,但是环境变量还是没有保存,这就奇怪了。最后我灵机一动,忽然想起了在调试过程中用debug调试时有的debug会导致不停的打印写的信息,这回我在头文件中将所有debug关掉,环境变量可以保存了,接着我将代码恢复到“写超时”的版本,也没有问题了,我觉得就是debug破坏了写的时序造成的,debug虽好,用时需谨慎啊!


造成写超时的原因:

Erase timeout 16384 ms, write timeout 1 ms, buffer write timeout 1 ms, buffer size 1

这是利用cfi接口查出的数据,但是我看mx29lv160db的手册并不是这个值啊,典型值是11微秒,最大才360微秒。不管了,反正这个值远大于手册上的。就先按这个算吧!

代码如下:

static int flash_status_check (flash_info_t * info, flash_sect_t sector,
                   ulong tout, char *prompt)
{
    ulong start;
//其中CFG_HZ按照smdk2410.h中的设置为1562500,也就是定时时间为1秒
#if CFG_HZ != 1000
    tout *= CFG_HZ/1000;
#endif
    /* Wait for command completion */
    start = get_timer (0);
    while (flash_is_busy (info, sector)) {
        if (get_timer (start) > tout) {//判断等待命令完成期间是否超时,tout的值为1562,相当于定时器4时间大约为1ms
            printf ("Flash %s timeout at address %lx data %lx\n",
                prompt, info->start[sector],
                flash_read_long (info, sector, 0));
            flash_write_cmd (info, sector, 0, info->cmd_reset);
            return ERR_TIMOUT;
        }
        udelay (1);        /* also triggers watchdog */
    }
    return ERR_OK;
}

    现在重点来了,在flash_is_busy函数中有:debug ("flash_is_busy: %d\n", retval);

    当串口的波特率为115200时,1ms最多传输11.52byte的字符,取整为11byte,而debug中输出的字符有16个,输出时间肯定大于1ms,即调用flash_is_busy函数返回后,get_timer (start)的必定大于tout导致超时。这就可以解释为什么将debug开关关掉程序就正常的原因了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值