uffs的crc校验有问题?

发布于 2020-09-10 22:05:35

在使用uffs的软件ECC和CRC校验的时候发现当出现有坏块的时候,再去读的时候会进行位纠错,调试发现,位已经纠错了,但是CRC校验不通过,跟踪发现代码,v1.3.6版本
uffs_flash.c的552行:

#ifdef CONFIG_ENABLE_PAGE_DATA_CRC
    if (!skip_ecc && !UFFS_FLASH_HAVE_ERR(ret)) {
        // Everything seems ok, do CRC check again.
           if (HEADER(buf)->crc == uffs_crc16sum(buf->data, size - sizeof(struct uffs_MiniHeaderSt)))
{
            ret = UFFS_FLASH_CRC_ERR;
                 //CRC相等是否应该没有CRC故障的吧,不应该返回这个故障的
            goto ext;
        }
    }

 #endif

上面的CRC比较如果相等应该是CRC没有问题才对的吧??

查看更多

关注者
0
被浏览
334
1 个回答
cxhxy12345
cxhxy12345 2021-05-01

你这个是版本有问题,最新的4.03版本这部分如下:

ifdef CONFIG_ENABLE_PAGE_DATA_CRC

if (!skip_ecc) {
    crc_ok = (HEADER(buf)->crc == uffs_crc16sum(buf->data, size - sizeof(struct uffs_MiniHeaderSt)) ? U_TRUE : U_FALSE);

    if (crc_ok)
        goto ext;    // CRC is matched, no need to do ECC correction.
    else {
        if (dev->attr->ecc_opt == UFFS_ECC_NONE || dev->attr->ecc_opt == UFFS_ECC_HW_AUTO) {
            // ECC is not enabled or ecc correction already done, error return immediately,
            // otherwise, we try CRC check again after ecc correction.
            ret = UFFS_FLASH_CRC_ERR;
            goto ext;
        }
    }
}

endif

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览