免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3901 | 回复: 3
打印 上一主题 下一主题

MTD 中cfi_intelext_write_buffers函数执行不成功 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-23 01:09 |只看该作者 |倒序浏览
我在调试2440的vivi时,之前使用的norflash是J28F256P33,执行cfi_intelext_write_buffers函数执行成功,后来更换了norflash J28f256P33BF执行cfi_intelext_write_buffer失败,但是执行cfi_intelext_write_word可以,请高手帮忙分析下原因。

论坛徽章:
0
2 [报告]
发表于 2011-07-23 11:09 |只看该作者
please add some log to debug it,the information is too short

论坛徽章:
0
3 [报告]
发表于 2011-07-25 22:11 |只看该作者
static int do_write_buffer(struct map_info *map, struct flchip *chip,
                           unsigned long adr, const u_char *buf, int len)
{
        struct cfi_private *cfi = map->fldrv_priv;
        cfi_word status, status_OK;
        unsigned long cmd_adr, timeo;
        int wbufsize, z;

        wbufsize = CFIDEV_INTERLEAVE << cfi->cfiq->MaxBufWriteSize;
        adr += chip->start;
        cmd_adr = adr & ~(wbufsize - 1);

        /* Let's determinc this according to the interleave only once */
        status_OK = CMD(0x80);

        timeo = cfi->cfiq->BufWriteTimeoutMax * 1000;

        ENABLE_VPP(map);
        cfi_write(map, CMD(0xe, cmd_adr);

        for (; {
                status = cfi_read(map, cmd_adr);
                if ((status & status_OK) == status_OK)
                        break;

                if (timeo < 0) {
                        /* Argh. Not ready for write to buffer */
                        cfi_write(map, CMD(0x70), cmd_adr);
                        DISABLE_VPP(map);
                        printk("Chip not ready for buffer write. Xstatus = 0x%llx, status = %llx\n", (__u64)status, (__u64)cfi_read(map, cmd_adr));
                        /* Odd. Clear status bits */
                        cfi_write(map, CMD(0x50), cmd_adr);
                        cfi_write(map, CMD(0x70), cmd_adr);
                        cfi_write(map, CMD(0xff), adr);
                        return -EIO;
                }
        }

        /* Write length of data to come */
        cfi_write(map, CMD(len/CFIDEV_BUSWIDTH-1), cmd_adr);

        /* Write data */
        for (z = 0; z < len; z += CFIDEV_BUSWIDTH) {
                if (cfi_buswidth_is_1()) {
                        map->write8(map, *((__u8*)buf)++, adr+z);
                } else if (cfi_buswidth_is_2()) {
                        map->write16(map, *((__u16*)buf)++, adr+z);
                } else if (cfi_buswidth_is_4()) {
                        map->write32(map, *((__u32*)buf)++, adr+z);
                } else if (cfi_buswidth_is_8()) {
                        map->write64(map, *((__u64*)buf)++, adr+z);
                } else {
                        DISABLE_VPP(map);
                        cfi_write(map, CMD(0xff), adr);
                        return -EINVAL;
                }
        }
        /* GO GO GO */
        cfi_write(map, CMD(0xd0), cmd_adr);

        timeo = cfi->cfiq->BufWriteTimeoutMax * 1000;

        for (; {
                status = cfi_read(map, cmd_adr);
                if ((status & status_OK) == status_OK)
                        break;

                if (timeo-- < 0) {
                        printk("Waiting for chip to be ready timed out in bufwrite\n";
                        cfi_write(map, CMD(0xff), adr);
                        return -EIO;
                }
        }

        /* Done and happy. */
        DISABLE_VPP(map);
        /* check for lock bit */
        if (status & CMD(0x02)) {
                /* clear status */
                cfi_write(map, CMD(0x50), cmd_adr);
                /* put back into read status register mode */
                cfi_write(map, CMD(0x70), adr);
                cfi_write(map, CMD(0xff), adr);
                return -EROFS;
        }

        cfi_write(map, CMD(0xff), adr);
        return 0;
}

论坛徽章:
0
4 [报告]
发表于 2011-07-25 22:17 |只看该作者
但 这个能写入
int do_write_oneword(struct map_info *map, struct flchip *chip,
                     unsigned long adr, cfi_word datum)
{
        struct cfi_private *cfi = map->fldrv_priv;
        cfi_word status = 0, status_OK;
        unsigned long timeo;

        adr += chip->start;

        /* Let's determine this according to the interleave only once */
        status_OK = CMD(0x80);

        /* 弊成 荤侩 沁澜 - 2002-06-25 nandy */
        timeo = cfi->cfiq->WordWriteTimeoutMax * 1000;

        ENABLE_VPP(map);
        cfi_write(map, CMD(0x40), adr);
        cfi_write(map, datum, adr);

        /* wait for it to be programmed */
        while (timeo > 0) {
                status = cfi_read(map, adr);
                if ((status & status_OK) == status_OK)
                        break;
                timeo--;
        }

        /* done */
        DISABLE_VPP(map);
        /* clear status */
        cfi_write(map, CMD(0x50), adr);

        /* report errors */
        if (timeo <= 0) {
                printk("\nFailed do_write_oneword() operation\n");
                printk("  Offset = 0x%08lx, datum = 0x%08lx, status = 0x%08lx\n",
                        adr, datum, status);
                cfi_write(map, CMD(0xff), adr);
                return -EIO;
        }

        cfi_write(map, CMD(0xff), adr);
        return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP