This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] PROCESSOR-SDK-AM437X:NAND 坏块管理和 ECC 使用

Guru**** 2583335 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage

器件型号:PROCESSOR-SDK-AM437X

您好!

我们向客户提供的设备存在一些问题。  一些客户已退回器件并投诉器件出现故障。

我们的器件设置为 AM437处理器。 处理器从外部原始 NAND 闪存引导。 该板是定制板 、与 TI AM437评估板非常相似。 我们的应用基于 TI RTOS 内核 SDK。 此外、我们使用 TI PDK Starterware SBL、还在生产线上使用 Starterware 刷写实用程序来刷写外部 NAND。  

进一步的测试表明、我们在 NAND 闪存中有位翻转。 我不明白为什么 NAND 中存在位翻转。 在我看来、由于采用 ECC、引导加载程序应该在读取应用程序映像的 NAND 页面时纠正这些1位错误。 我不知道为什么这对我们不起作用。 我知道位翻转的不同原因以及坏块和位错误的含义。  

如前所述、我们使用 TI PDK verion 1.0.9 Starterware 中的引导加载程序。 我们还使用 TI 闪存和引导实用程序在生产线上(也是同一 PDK 版本)刷写 NAND。 我们希望坏的块管理和 ECC 机制将由该软件组件"开箱即用"工作。 是这样吗? 但似乎没有使用 ECC 校正。

您能否详细解释一下错误的块管理和 ECC 机制如何在 SBL 和刷写实用程序 TI Starterware 组件内工作?

此外、我对闪存实用程序有点困惑。 在对 nandwriter 源代码进行代码检查后、我假设 NAND 供应商坏块信息不会由源代码评估、并且使用的页面将最初被擦除、这会导致 不可逆转地删除 NAND 供应商坏块信息。 此行为与 NAND 供应商关于初始坏块处理的建议不符。 因此、我们无法保证也使用 NAND 供应商标记为坏块的块。 我的假设是否正确、闪存实用程序的这种行为是否适用? 如果是、原因是什么?  此外、我不确定 TI 闪存实用程序是否是一种用于量产系列的工具。 您能否确认编程线路中的用法是否也适用? 还是在生产线上使用其他刷写实用程序更好?

您是否知道 ECC 校正为何对我们不起作用?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您是否了解 AM437x 勘误表的建议15

    这可能是您发现的问题的根本原因。 我将在内部与其他专家联系以进行确认、并尽快回复您。

    此致、

    _________

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jianzhong、

    感谢您的回复。

    我 已经检查了我们的硬件、我们正在使用芯片修订版本1.2。  我假设勘误建议15仅影响芯片修订版本1.1。

    在本例中、ROM 引导加载程序从 NAND 中加载 SBL。 SBL 负责加载主应用程序、但失败。 SBL 在读取 NAND 页面时不会校正位翻转。 我想这会导致我们的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    很高兴知道您的器件版本1.2没有建议15问题。 让我对 SBL 进行一些研究、但可能需要几天时间。 我下周初会回来。

    谢谢、此致、

    _________

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    当我在内部进行研究时、也许您可以查看一些内容:

    1.为 AM437x EVM 编写了引导加载程序和刷写实用程序。 您是否在 该 EVM 上对系统进行过任何测试? NAND 启动是否正常?

    2.您能否 运行一些 NAND 诊断以确保 NAND 操作与 ECC 配合使用(与 ROM 无关)?

    3.查看 AM437x TRM第5.2.6.4章"与非存储器"、确保您的系统设计符合此处给出的要求。

    4.您使用的 PDK 版本非常旧。 最新的是 处理器 SDK 6.3中的1.0.17。您能否升级并查看它是否有任何影响?

    谢谢、

    _________

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您的快速回复。

    我们尚未在 EVM 上测试引导加载程序、因为我们没有 EVM 板。 但是、只要 NAND 上没有发生位翻转、NAND 引导就能很好地工作。 如果我们在生产线上对器件(包括外部 NAND)进行了编程、则器件 必须通过生产结束测试、该测试需要成功的引导过程。 因此、我声称 NAND 启动在我们的电路板上通常运行良好。 这意味着我们的客户退回的所有器件、在我们交付时都运行良好。 由于 NAND 上的单个位翻转、这些问题在客户应用程序中的运行时间之后出现。 我对器件重新编程、故障消失、器件再次启动。  

    2.我将在接下来的几天内尝试进行一些诊断、并就此提供反馈。 首先、我必须检查如何仿真 NAND 上的位翻转。

    我想我们的设计符合要求。 至少我没有发现相反的情况。 我们使用 Micron  MT28EW512ABA1LPC-0SIT NAND 闪存器件。 该器件兼容 ONFI 、应满足时序要求。

    我们使用 的是 PRU ICSS Profinet 软件包版本1.0.2。 这些软件包版本使用 SDK-RTOS 04_02_09 (包括 PDK 1.0.9)。 过去、如果我们 分别切换 SDK 和 PDK、则应用程序会出现问题。 此外 、如果我们升级 软件中负责 Profinet 网络连接的任何组件、PROFINET 认证可能会出现问题。 但我已经比较了两个 PDK 版本 SBL 的源文件。 因为我们没有任何差异 可以解释我们的问题。 此外、组件的发行说明也不指示此问题的任何内容。

    Starterware SBL 是否假设 ECC 处理 是由外部 NAND 器件在内部完成的? 如果我理解正确、ROM 引导程序会使用 SYSBOOT 选项来确定这一点。 SBL 如何处理此问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="484066" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3674501 #3674501]Starterware SBL 是否假设 ECC 处理 是由外部 NAND 器件在内部完成的? 如果我理解正确、ROM 引导程序会使用 SYSBOOT 选项来确定这一点。 SBL 如何处理此问题?[/报价]

    我将对此进行检查。

    [引用 userid="484066" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3674501 #3674501"]我们使用的是 Micron  MT28EW512ABA1LPC-0SIT NAND 闪存器件。

    您能否提供此器件数据表的链接?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    来自 TRM 的一些其他信息:

    您能否检查是否已清除 SYSBOOT[6]以通过 ROM 启用 ECC?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我犯了一个错误。 NAND 是 Micron MT29F1G08ABADAM4。

    以下是 Micron 器件页面的链接:

    MT29F1G08ABADAH4 (micron.com)

    我没有用于下载数据表的帐户、但我有一个脱机副本。 如何向您提供脱机副本?

    此外、我知道器件 状态已过时。 对于我们的产品、我们已将此 NAND 替换为其他供应商器件。 但我们有许多器件交付给客户、其中 Micron NAND 是的一部分。

    您是对的、这是我们设计中的一个问题。 SYSBOOT[6]不会被清除。 它有一个上拉电阻器、如果容纳 SBL 的 NAND 的第一个块损坏、这可能会给我们的器件带来其他问题。

    但是、如果我正确理解了手册、这只会影响 ROM 引导加载程序、SYSBOOT 选项仅在 ROM 引导加载程序代码中使用。 对吧?

    还是该选项也会影响 SBL 行为?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的链接。 我简要介绍了数据表、它实际上具有内部 ECC。 但无论如何、如果 NAND 不执行 ECC、则应启用 ROM ECC、即清除 SYSBOOT[6]。  

    [引用 userid="484066" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3675792 #367792"]

    但是、如果我正确理解了手册、这只会影响 ROM 引导加载程序、SYSBOOT 选项仅在 ROM 引导加载程序代码中使用。 对吧?

    [/报价]

    没错。 SBL 不受 SYSBOOT 影响。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我有几个问题需要澄清:

    您用于将 SBL 闪存到 NAND 中的确切闪存写入器是什么? 在进行刷写时、您选择了哪种 ECC 算法?

    2.您是否使用了此文件夹中的 SBL pdk_am437X_1_0_9\packages/ti\starterware\binary\bootloader\bin\am43xx-evm\gcc?

    我仔细检查了 SBL 源代码、并确认它确实使用 BCH8执行错误校正。  请记住、SBL 仅支持 BCH8。 因此、闪存也必须使用 BCH8。 否则、SBL 将无法更正位错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    [引用 userid="35284" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3677828 #3677828"]1. 您用于将 SBL 闪存到 NAND 中的确切闪存写入器是什么? 刷写时、您选择了哪种 ECC 算法?[/quot]

    我们使用此文件夹中的闪存写入器源:

    pdk_AM437X_1_0_9\packages/ti\starterware\tools\flash_writer\src\n 和-flash-writer_AM335x

    我们已经做了一些更改。 但我们的所有更改都不会影响 Nand 驱动程序。 我们还使用 BCH8 ECC。

    如果您要检查我们的闪存源、我可以为您提供 CCS 项目。  

    [引用 userid="35284" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3677828 #3677828"]2. 您是否使用了此文件夹中的 SBL pdk_AM437X_1_0_9\packages/ti\starterware\binary\bootloader\bin\am43xx-evm\gcc?

    是的、我们使用此 SBL。 我们对源进行了一些微小的更改、以支持我们的定制板。 这些更改只影响 DDR3时序和 PLL 初始化。 我们没有对 Nand 驱动程序或 ECC 驱动程序进行任何更改。

    如果 bootlaoder 和刷写实用程序之间的 ECC 算法不同、则正确、引导程序无法更正位错误。 但无论如何不应检测到引导加载程序的 ECC 值与计算值完全不同。 在本例中、SBL 会发生什么情况?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="484066" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3678418 #3678418">如果 Bootlaoder 和刷写实用程序之间的 ECC 算法不同、您是对的、则引导程序无法更正位错误。 但无论如何不应检测到引导加载程序的 ECC 值与计算值完全不同。 在本例中、SBL 会发生什么情况?[/QUERT]

    查看 SBL NAND ECC 代码后、如果位错误不可纠正、我相信不会采取任何措施。 NANDLibPageRead ()在 starterware/library/nandlib/nand_lib.c 中调用 NAND ECC 函数 从下面的代码片段中可以看到、每当出现 不可纠正的错误时、读取就会停止并返回函数:

                        status = gNandLibObj[chipSel].pFnEccCorrect(pNandLibInfo, pEccData, pRxData);
                        gNandLibObj[chipSel].pFnEccDisable(pNandLibInfo);
    
                        if(status & NAND_LIB_ECC_ERR_CORRECTED)
                        {
                            eccCorFlag = 1U;
                        }
                        else if(status & NAND_LIB_ECC_UNCORRECTABLE)
                        {
                            break;
                        }
    

    然后,从 starterware/bootloader/src/SBL_nand.c 中,您可以看到,如果 NANDLLibPageRead ()失败, 除了打印 诊断消息之外,不会执行任何操作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="35284" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3678907 #3678907"]然后,从 starterware/bootloader/src/sbl_nand.c 中,您可以看到,如果 NANDLLibPageRead ()失败, 除了打印 诊断消息之外,不会执行任何操作。

    我对此有了更深入的了解。

    引导时、我在器件的调试输出上看不到诊断消息。 因此,我想 NANDLibPageRad()函数没有不可纠正的错误。

    不过 、我想这里是 SBL 的下一个潜在问题。  从 SBL 调用的函数 SblNandReadFlash()函数的返回值不会在 fucnion SblNandImageCopy()中检查错误。 SBL 调用此函数、以 将二进制映像加载到 RAM 中。 因此 ,我想引导加载程序会启动任何与 NANDLibPageRad() 函数的返回值无关的内容。 请参阅下面的代码片段。

    static uint32_t SblNandImageCopy(uint32_t *pEntryPoint)
    {
        ti_header imageHdr;
        int32_t status = S_PASS;
    
        /* NAND read function to read the header. */
        SblNandReadFlash(&gSblNandObj, IMAGE_OFFSET, sizeof(imageHdr),
            (uint8_t *) &imageHdr);
        CONSOLEUtilsPrintf("\nCopying Header of the application image ");
    
        *pEntryPoint = imageHdr.load_addr;
    
        CONSOLEUtilsPrintf("\nCopying image from flash to DDR\r\n");
        /* Copies application from NAND flash to DDR RAM */
        SblNandReadFlash(&gSblNandObj, IMAGE_OFFSET + sizeof(imageHdr),
            imageHdr.image_size, (uint8_t *)(imageHdr.load_addr));
    
        return status;
    }

    我用于检测 NAND 上的位翻转的校验函数、使用 以下代码片段验证 NAND 页面:

            if (AM335X_NAND_verifyPage(hNandInfo, blockNum, (count & countMask), dataPtr, gNandRx) != E_PASS)
            {
                CONSOLEUtilsPrintf("\tData block verification failed at block ");
                CONSOLEUtilsPrintf("%d", blockNum);
                CONSOLEUtilsPrintf(" on page ");
                CONSOLEUtilsPrintf("%d (Hex: 0x%x)", (count & countMask), (count & countMask));
                CONSOLEUtilsPrintf("\r\n\r\n");
                retCode = E_FAIL;
            }

    函数 AM335X_NAND_verifyPage()是我在上一篇文章中提到的 nand_writer 的一部分。

    用于验证 nand.c 中的页 AM335X_NAND_verifyPage()的函数从 同一源文件中调用名为 NAND_readPage()的函数。 在我们的情况下、此函数返回 E_PASS、但以下数据读取错误检查显示预期数据和接收数据之间的差异。 差异始终是故障器件上的一个位翻转。 如果我重复测试、位翻转在 NAND 中始终处于相同的位置。 因此、我认为这不是随机读取错误。

    下面是 AM335X_NAND_verifyPage()函数的代码片段:

    Uint32 AM335X_NAND_verifyPage(AM335X_NAND_InfoHandle hNandInfo,
    		Uint32 block, Uint32 page, Uint8* src, Uint8* dest)
    {
    	Uint32 i, errCnt;
    
    	if (NAND_readPage(hNandInfo, block, page, dest) != E_PASS)
    		return E_FAIL;
    
    	errCnt = 0;
    	for (i = 0; i < (hNandInfo->dataBytesPerPage); i++) {
    		// Check for data read errors
    		if (src[i] != dest[i]) {
    			errCnt++;
    			DEBUG_printString("Data verification failed! Byte # ");
    			DEBUG_printHexInt(i);
    			DEBUG_printString(" Expected Data: ");
    			DEBUG_printHexInt(src[i]);
    			DEBUG_printString(", Received Byte: ");
    			DEBUG_printHexInt(dest[i]);
    			DEBUG_printString("\r\n");
    		}
    	}
    
    	if (errCnt != 0) {
    		return E_FAIL;
    	} else {
    		return E_PASS;
    	}
    
    }

    我已经使用库存中的新器件检查了该功能、一切都正常。  读取的数据等于预期的数据。 因此、我宣称该功能通常起作用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="484066" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3683080 #3683080"]

    引导时、我在器件的调试输出上看不到诊断消息。 因此,我想 NANDLibPageRad()函数没有不可纠正的错误。

    [/报价]

    您是否看到任何其他诊断消息? 只想双击控制台打印是否已启用。

    [引用 userid="484066" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3683080 #3683080">本函数在本例中返回 E_PASS、但以下对数据读取错误的检查显示预期数据和接收数据之间的差异。 差异始终是故障器件上的一个位翻转。[/quot]

    函数 NAND_readPage() 执行 ECC。 如果返回 E_PASS、则表示错误已更正。 但以下检查显示1位错误。 我不明白为什么会发生这种情况。

     您选择哪种 ECC 进行刷写?

    当函数 AM335X_NAND_verifyPage()返回 E_FAIL 时,该块将被擦除。 您是否看到相应的诊断消息?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="35284" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3683272 #3683272]\n 您是否看到任何其他诊断消息? 只是想双击控制台打印是否已启用。

    是的、其他诊断消息已打印到控制台

    [引用 userid="35284" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3683272 #3683272"] 您选择刷写哪个 ECC?[/quot]

    我们使用  eccType 1调用 uint32 AM335X_Device_setECC(),它应该是用于闪存的 BCH9 ECC 模块。

    [引用 userid="35284" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3683272 #3683272]]当函数 AM335X_NAND_verifyPage()返回 E_FAIL 时,该块将被擦除。 您是否看到相应的诊断消息?[/QUERP]

    为了检查 NAND 内容错误、我已经在一个单独项目中修改了 nandwriter、以便在不修改任何内容的情况下只检查闪存。 因此、在我的代码中不会发生擦除。 只有一条诊断消息输出到调试控制台。

    如果我用附带的 nandwriter 重新刷写器件,则函数 AM335X_NAND_verifyPage()不会失败。 如果我重新刷写了器件、那么 NAND 检查函数也会通过。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="484066" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3683948 #3683948"]因此在我的代码中不会发生擦除操作。

    那么、在从 NAND 读取数据时、您是否依赖 NAND SBL 来校正位翻转?

    [引用 userid="484066" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3683948 #3683948"]如果我使用附带的 nandwriter 重新刷写器件,则函数 AM335X_NAND_verifyPage()不会失败。

    这是否意味着使用 PDK 中的闪存写入器没有问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="35284" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3685059 #3685059"]因此,在从 NAND 读取数据时,您是否依赖 NAND SBL 来更正位翻转?

    是的、但我不理解此问题与我上一篇文章中的陈述之间的关系。 我依靠 SBL 尽可能地使用  ECC 模块(BCH8)来校正位翻转。

    [引用 userid="35284" URL"~/support/processors/f/processors-forum/993968/processor-sdk-am437x-nand-bad-block-management-and-ecc-usage/3685059 #3685059"]这是否意味着使用 PDK 中的闪存写入器没有问题?

    在我们的产品系列中、我们使用 PDK 中的闪存线进行一些修改、以支持我们的定制板。 PDK 的 nandwriter 在写入闪存页后执行 AM335X_NAND_verifyPage()。 在这里、我们的生产线上没有错误。 如果 nandwriter 在生产线上出现故障 、则无法交付设备、因为它们未通过工厂最终测试。 因此、我想 PDK 的 nandwriter 可以在我们的生产线上工作。

    NAND 上具有位翻转 的器件由我们的客户返回。 我已经使用自定义 NAND 内容验证固件分析了这些返回的器件、该固件也基于 PDK 中的 Nandwriter、但不会擦除 或写入闪存。 仅针对预期的固件二进制文件执行页面验证并检测位翻转。 验证固件 通过我的调试探针从 CCS 写入 RAM、而不是写入 NAND。 NAND 保持不变。

    如果我使用相同的过程在我们的生产线上对这些器件进行重新编程、则一切都正常、NAND 内容已按 预期进行验证。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否可以在验证软件中禁用 ECC 以查找 NAND 中的实际位翻转? 这可以告诉我们 NAND 中有多少位翻转以及 ECC 校正了多少位翻转(如果有)。 如果  NAND_readPage()中的 ECC 不能纠正任何位翻转,那么我们可以将重点放在 NAND 库中的 ECC 上。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     在我的软件中禁用 ECC 应该是可能的。

    我将修改软件并检查结果。  我将在星期二之前不会在办公室工作。 我将在星期二向您提供反馈

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    听起来不错。 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    遗憾的是、禁用 ECC 并不容易。  

    我更改了以下行:

    pObj->nandLibInfo.nandLibCtrlInfo.eccAlgo = NAND_LIB_ECC_ALGO_NONE;//NAND_LIB_ECC_ALGO_BCH_8BIT;

    但是、如果我使用此修改初始化 NAND 库(nand_lib.c)、则 NAND 库初始化失败函数(NANDLibInit())失败。 NAND 库需要 NAND_LIB_ECC_ALGO_BCH_8BIT 或 NAND_LIB_ECC_ALGO_HAMMing_1位来初始化。 否则、NAND 库将返回 NAND_LIB_INVALID_PARAM。

    因此、我不确定如何在我的软件中禁用 ECC 检查。 如果我不检查 NAND 库初始化函数的返回值、我猜可能会导致其他故障。

    此外 、在我的代码中调用函数 AM335X_Device_setECC。 如果没有设置 ECC 机制、这些函数也会返回错误。 如果我跳过此函数调用、我不确定   对 AM335X_EC.c 中 NAND_ECC_Info_Handle 的函数指针 fxnEnable()、fxnDisable()的可能调用会发生什么情况 如果未调用 AM335X_Device_setECC、则不会初始化这些指针。

    函数 NAND_readPage 不会对之前描述的函数指针执行任何 NULL 指针检查。 因此、也无法将函数指针设置为 NULL。 也许我可以编写一个虚拟函数并将其用作函数指针。 但是、我不确定这是否是禁用 NAND 库 ECC 的可行方法。

    是否对 PDK 源代码进行了任何静态代码分析?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们确实对 PDK 源代码进行了静态分析、但它未发布。 让我看一下报告、看看我发现了什么。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在函数 NandLibGpmcBchEccCheckAndCorrect()中发现使用未初始化的数组元素的潜在问题:

            eccVal = (syndrome[12] | (syndrome[13] << 8) | (syndrome[14] << 16) |
                     (syndrome[15] << 24));
    

    但是 、我还没有确信这会导致错误的纠错、因为我不能完全理解 ECC 是如何实现的。 我将继续查看代码和 TRM。

    同时、您是否可以向代码中添加一些指令插入? 例如,在 bootloader\src\SBL_nand.c 的 SblNandReadFlash()中,在 NANDLLibPageRad()之后添加一条诊断消息:

                if(NAND_LIB_PASS == status)
                {
                    CONSOLEUtilsPrintf("\r\nReading Image From NAND");
                }
                else
                {
                    CONSOLEUtilsPrintf("\r\nNANDLibPageRead() failed");
                }

    此外、添加一些全局调试变量来跟踪 NAND 库中的 ECC 统计信息。 例如,在函数 NandLibGpmcBchEccCheckAndCorrect()中:

        if(ELM_ERR_LOC_PROCESS_STS_FAIL == result)
        {
            status = NAND_LIB_ECC_UNCORRECTABLE;
            
            // debugging counter - number of uncorrectable pages
            num_page_err_uncorrectable += 1; 
        }
        else
        {
            numOfErrs = ELMNumOfErrsGet(elmBaseAddr, 0);
            if(numOfErrs == 0)
            {
                status = NAND_LIB_PASS;
                
                // debugging counter - number of pages without any error
                num_page_no_err += 1; 
            }
            else
            {
                // debugging counter - number of pages with correctable errors
                num_page_err_correctable += 1;
                
                errNum = 0U;
                 /* Get the error location and correct the same */
                for(i = 0; i < numOfErrs; i++)
                {
                    errLoc = ELMErrLocBitAddrGet(elmBaseAddr, 0, errNum);
                    if (errLoc >= (lastECCBit - 1))
                    {
                       /* Error is at the Data bytes */
                        errBytePos = ((lastDataBit - 1) - errLoc) / 8;
                        /* Error Bit mask */
                        errBitMask = 0x1 << (errLoc % 8);
                        /* Toggle the error bit to make the correction. */
                        pData[errBytePos] ^= errBitMask;
                        status = NAND_LIB_ECC_ERR_CORRECTED;
    
                        // debugging counter - number of corrected errors
                        num_err_corrected += 1;
                    }
                    else
                    {
                        /* Error is at the ECC bytes which we are not handling */
                        // debugging counter - number of errors in ECC bytes
                        num_err_unhandled += 1;
                    }
                    errNum++;
                }
            }
        }

    在 NANDLibGpmcInit()中将这些全局变量初始化为0。 例如 ,在  SblNandReadFlash()中调用 NANDLLibPageRad()之后,在 SBL 中打印它们。

    您可以使用以下命令重建 NAND 库:

    C:\ti\processor_sdk_rtos_am437x_xx_xx_xx_xx>setupenv.bat
    C:\ti\pdk_am437x_1_0_9\packages\ti\starterware>gmake clean libs PLATFORM=am43xx-evm PROFILE=release -s KW_BUILD=no
    C:\ti\pdk_am437x_1_0_9\packages\ti\starterware>gmake libs PLATFORM=am43xx-evm PROFILE=release -s KW_BUILD=no
    

    希望通过这些仪表、我们可以更好地了解 NAND ECC 的工作效果。

    谢谢、

    _________

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不幸的是、我无法清理构建

    gmake 失败并出现错误:

    PS C:\ti\pdk_am437X_1_0_9\packages/ti\starterware>gmake clean libs platform=am43xx-evm profile=release -s KW_build=no
    Process_begin:CreateProcess (NULL,C:/ti/ccsv6/utils/cygwin/rm -f C:/ti/pdk_am437x_1_0_9/packages/ti/starterware/binary/dal/obj/am43xx-evm/a9/release/gcc /* C:/ti/pdk_am437x_1_0_9/packages/ti/starterware/binary/dal/obj/am43xx-evm/a9/release/gcc/.deps /* C:/ti/pdk_am437x_1_0_9/packages/ti/starterware/binary/dal/lib/am43xx-evm/a9/release/gcc、...) 失败。
    make (e=2):DAS 系统 kann 裸片 angegebene Datei nicht finden。
    C:/ti/pdk_am437x_1_0_9/packages/ti/starterware/build/makerules/common.mk:246:目标"清洁"配方失败
    gmaking[1]:***[干净]错误2.
    Makefile:134:目标'AL_CLEAR'的配方失败
    gmake:***[DAL_CLEAR]错误2.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    抱歉、要清除的正确命令是:  

    gmake libs_clean PLATFORM=am43xx-evm PROFILE=release -s KW_BUILD=no

    我能够构建、下面是我的构建日志:

    Microsoft Windows [Version 10.0.19042.928]
    (c) Microsoft Corporation. All rights reserved.
    
    C:\Users\a0869574>cd \ti\processor_sdk_rtos_am437x_4_02_00_09
    
    C:\ti\processor_sdk_rtos_am437x_4_02_00_09>setupenv.bat
    Optional parameter not configured : CG_XML_BIN_INSTALL_PATH
    REQUIRED for xdc release build
    Example: set CG_XML_BIN_INSTALL_PATH=C:/ti/cg_xml/bin
    Optional parameter not configured : DOXYGEN_INSTALL_PATH
    REQUIRED for xdc release build
    Example: set DOXYGEN_INSTALL_PATH=C:/ti/Doxygen/doxygen/1.5.1-p1/bin
    **************************************************************************
    Environment Configuration:
        LIMIT_SOCS                : am437x
        LIMIT_BOARDS              : evmAM437x idkAM437x skAM437x
        PDK_INSTALL_PATH          : /ti/PD6FE3~1/packages
        C6X_GEN_INSTALL_PATH      : C:/ti/ti-cgt-c6000_8.2.2
        TOOLCHAIN_PATH_GCC        : C:/ti/gcc-arm-none-eabi-6-2017-q1-update
        TOOLCHAIN_PATH_A15        : C:/ti/gcc-arm-none-eabi-6-2017-q1-update
        TOOLCHAIN_PATH_A8         : C:/ti/gcc-arm-none-eabi-6-2017-q1-update
        TOOLCHAIN_PATH_A9         : C:/ti/gcc-arm-none-eabi-6-2017-q1-update
        TOOLCHAIN_PATH_M4         : C:/ti/ti-cgt-arm_16.9.3.LTS
        TOOLCHAIN_PATH_Arm9       : C:/ti/ti-cgt-arm_16.9.3.LTS
        TOOLCHAIN_PATH_EVE        : C:/ti/arp32_1.0.8
        CL_PRU_INSTALL_PATH       : C:/ti/ti-cgt-pru_2.1.5
        UTILS_INSTALL_DIR         : C:/ti/xdctools_3_50_03_33_core/bin
        HARDLIB_PATH              : C:/ti/gcc-arm-none-eabi-6-2017-q1-update/lib/gcc/arm-none-eabi/6.3.1/hard
        CROSS_TOOL_PRFX           : arm-none-eabi-
        XDC_INSTALL_PATH          : C:/ti/xdctools_3_50_03_33_core
        BIOS_INSTALL_PATH         : C:/ti/bios_6_52_00_12
        IPC_INSTALL_PATH          : C:/ti/ipc_3_47_00_00
        EDMA3LLD_BIOS6_INSTALLDIR : C:/ti/edma3_lld_2_12_05_30B
        NDK_INSTALL_PATH          : C:/ti/ndk_2_26_00_08
        IMGLIB_INSTALL_PATH       : C:/ti/imglib_c66x_3_1_1_0
        DSPLIB_INSTALL_PATH       : C:/ti/dsplib_c66x_3_4_0_0
        MATHLIB_INSTALL_PATH      : C:/ti/mathlib_c66x_3_1_1_0
        UIA_INSTALL_PATH          : C:/ti/uia_2_21_02_07
        IPC_PLATFORM: UNKNOWN
        IPC_ALT_PLATFORM:
        PROC_SDK_INSTALL_PATH     : C:/ti/processor_sdk_rtos_am437x_4_02_00_09
    **************************************************************************
    Changing to short name to support directory names containing spaces
    current directory: C:/ti/processor_sdk_rtos_am437x_4_02_00_09
    PROCESSOR SDK BUILD ENVIRONMENT CONFIGURED
    **************************************************************************
    
    C:\ti\processor_sdk_rtos_am437x_4_02_00_09>cd \ti\pdk_am437x_1_0_9\packages\ti\starterware
    
    C:\ti\pdk_am437x_1_0_9\packages\ti\starterware>gmake libs_clean PLATFORM=am43xx-evm PROFILE=release -s KW_BUILD=no
    
    C:\ti\pdk_am437x_1_0_9\packages\ti\starterware>dir binary\library\nandlib\lib\am43xx-evm\a9\release\gcc
     Volume in drive C is Windows
     Volume Serial Number is FCCB-4263
    
     Directory of C:\ti\pdk_am437x_1_0_9\packages\ti\starterware\binary\library\nandlib\lib\am43xx-evm\a9\release\gcc
    
    05/12/2021  10:04 AM    <DIR>          .
    05/12/2021  10:04 AM    <DIR>          ..
                   0 File(s)              0 bytes
                   2 Dir(s)  679,634,051,072 bytes free
    
    C:\ti\pdk_am437x_1_0_9\packages\ti\starterware>gmake libs PLATFORM=am43xx-evm PROFILE=release -s KW_BUILD=no
    # Compiling am43xx-evm:a9host:release:dal: i2c.c
    # Compiling am43xx-evm:a9host:release:dal: uart.c
    # Compiling am43xx-evm:a9host:release:dal: gpio.c
    # Compiling am43xx-evm:a9host:release:dal: mcspi.c
    # Compiling am43xx-evm:a9host:release:dal: gpmc.c
    # Compiling am43xx-evm:a9host:release:dal: elm.c
    # Compiling am43xx-evm:a9host:release:dal: qspi.c
    # Compiling am43xx-evm:a9host:release:dal: edma.c
    # Compiling am43xx-evm:a9host:release:dal: hs_mmcsd.c
    # Compiling am43xx-evm:a9host:release:dal: dmtimer.c
    # Compiling am43xx-evm:a9host:release:dal: epwm.c
    # Compiling am43xx-evm:a9host:release:dal: vpfe.c
    # Compiling am43xx-evm:a9host:release:dal: dss.c
    # Compiling am43xx-evm:a9host:release:dal: dss_coefficients.c
    # Compiling am43xx-evm:a9host:release:dal: wdt.c
    # Compiling am43xx-evm:a9host:release:dal: ecap.c
    # Compiling am43xx-evm:a9host:release:dal: tsc_adc_ss.c
    # Compiling am43xx-evm:a9host:release:dal: rtc.c
    # Compiling am43xx-evm:a9host:release:dal: dal_misc.c
    # Compiling am43xx-evm:a9host:release:dal: dcan.c
    # Compiling am43xx-evm:a9host:release:dal: cpsw.c
    # Compiling am43xx-evm:a9host:release:dal: cpsw_ale.c
    # Compiling am43xx-evm:a9host:release:dal: mdio.c
    # Compiling am43xx-evm:a9host:release:dal: mailbox.c
    # Compiling am43xx-evm:a9host:release:dal: pruss.c
    #
    # Archiving am43xx-evm:a9host:release:dal
    #
    # Compiling am43xx-evm:a9host:release:soc: armv7a/gcc/cp15.S
    # Compiling am43xx-evm:a9host:release:soc: armv7a/gcc/exceptionhandler.S
    # Compiling am43xx-evm:a9host:release:soc: armv7a/gcc/init.S
    # Compiling am43xx-evm:a9host:release:soc: armv7a/gcc/pub2mon.S
    # Compiling am43xx-evm:a9host:release:soc: soc.c
    # Compiling am43xx-evm:a9host:release:soc: armv7a/startup.c
    # Compiling am43xx-evm:a9host:release:soc: armv7a/gcc/cpu.c
    # Compiling am43xx-evm:a9host:release:soc: am43xx/am43xx_chipdb.c
    # Compiling am43xx-evm:a9host:release:soc: am43xx/hw_am43xx_chipdb.c
    # Compiling am43xx-evm:a9host:release:soc: am43xx/hw_am43xx_chipdb_baseaddr.c
    # Compiling am43xx-evm:a9host:release:soc: am43xx/hw_am43xx_chipdb_interrupt.c
    # Compiling am43xx-evm:a9host:release:soc: am43xx/am43xx_prcm.c
    # Compiling am43xx-evm:a9host:release:soc: am43xx/am437x/hw_prcm_data.c
    # Compiling am43xx-evm:a9host:release:soc: am43xx/am437x/hw_prcm_data_names.c
    # Compiling am43xx-evm:a9host:release:soc: cache_arm.c
    # Compiling am43xx-evm:a9host:release:soc: mmu_arm.c
    # Compiling am43xx-evm:a9host:release:soc: gic.c
    # Compiling am43xx-evm:a9host:release:soc: armv7a/pl310.c
    # Compiling am43xx-evm:a9host:release:soc: am43xx/am43xx_control.c
    #
    # Archiving am43xx-evm:a9host:release:soc
    #
    # Compiling am43xx-evm:a9host:release:board: board.c
    # Compiling am43xx-evm:a9host:release:board: dcard.c
    dcard.c: In function 'DCARDGetDCardList':
    dcard.c:141:12: warning: 'pDCardList' may be used uninitialized in this function [-Wmaybe-uninitialized]
         return pDCardList;
                ^~~~~~~~~~
    dcard.c: In function 'DCARDGetData':
    dcard.c:247:20: warning: 'pDCardList' may be used uninitialized in this function [-Wmaybe-uninitialized]
             pDCardData = pDCardList[dCardId];
             ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
    dcard.c: In function 'DCARDGetDevDCardId':
    dcard.c:190:12: warning: 'dCardId' may be used uninitialized in this function [-Wmaybe-uninitialized]
         return (dCardId);
                ^
    # Compiling am43xx-evm:a9host:release:board: platform.c
    # Compiling am43xx-evm:a9host:release:board: pinmux.c
    # Compiling am43xx-evm:a9host:release:board: am43xx/board_am43xx.c
    # Compiling am43xx-evm:a9host:release:board: am43xx/dcard_am43xx.c
    # Compiling am43xx-evm:a9host:release:board: am43xx/am43xx_gpevm.c
    # Compiling am43xx-evm:a9host:release:board: am43xx/am43xx_evmsk.c
    # Compiling am43xx-evm:a9host:release:board: am43xx/am43xx_idkevm.c
    # Compiling am43xx-evm:a9host:release:board: am43xx/am43xx_eposevm.c
    # Compiling am43xx-evm:a9host:release:board: am43xx/am43xx_custom.c
    # Compiling am43xx-evm:a9host:release:board: am43xx/am43xx_gpevm_pinmux_data.c
    # Compiling am43xx-evm:a9host:release:board: am43xx/am43xx_evmsk_pinmux_data.c
    # Compiling am43xx-evm:a9host:release:board: am43xx/am43xx_idkevm_pinmux_data.c
    # Compiling am43xx-evm:a9host:release:board: am43xx/am43xx_eposevm_pinmux_data.c
    #
    # Archiving am43xx-evm:a9host:release:board
    #
    # Compiling am43xx-evm:a9host:release:device: qspi_flash.c
    # Compiling am43xx-evm:a9host:release:device: lcd_device.c
    # Compiling am43xx-evm:a9host:release:device: pixcir_tsc.c
    # Compiling am43xx-evm:a9host:release:device: camera_device.c
    # Compiling am43xx-evm:a9host:release:device: enet_phy_device.c
    # Compiling am43xx-evm:a9host:release:device: nand_device.c
    # Compiling am43xx-evm:a9host:release:device: pmic_device.c
    # Compiling am43xx-evm:a9host:release:device: pmic_device_tps65910.c
    # Compiling am43xx-evm:a9host:release:device: pmic_device_tps65217.c
    # Compiling am43xx-evm:a9host:release:device: pmic_device_tps65218.c
    # Compiling am43xx-evm:a9host:release:device: clock_synthesizer.c
    #
    # Archiving am43xx-evm:a9host:release:device
    #
    # Compiling am43xx-evm:a9host:release:utils: console_utils_uart.c
    # Compiling am43xx-evm:a9host:release:utils: console_utils.c
    # Compiling am43xx-evm:a9host:release:utils: agraph.c
    # Compiling am43xx-evm:a9host:release:utils: i2c_utils.c
    # Compiling am43xx-evm:a9host:release:utils: ascii_utils.c
    # Compiling am43xx-evm:a9host:release:utils: ramdiskutils.c
    # Compiling am43xx-evm:a9host:release:utils: time_utils.c
    # Compiling am43xx-evm:a9host:release:utils: dmtimer_utils.c
    # Compiling am43xx-evm:a9host:release:utils: display_utils.c
    display_utils.c: In function 'DISPLAYUtilsConfig':
    display_utils.c:97:14: warning: comparison between pointer and integer
         if (NULL != frmBufAddr)
                  ^~
    # Compiling am43xx-evm:a9host:release:utils: display_utils_dss.c
    #
    # Archiving am43xx-evm:a9host:release:utils
    #
    # Compiling am43xx-evm:a9host:release:mmcsd_lib: mmcsd_lib.c
    # Compiling am43xx-evm:a9host:release:mmcsd_lib: hsmmcsd_lib_port.c
    #
    # Archiving am43xx-evm:a9host:release:mmcsd_lib
    #
    # Compiling am43xx-evm:a9host:release:ff9b_lib: ./src/ff.c
    # Compiling am43xx-evm:a9host:release:ff9b_lib: ./src/diskio.c
    # Compiling am43xx-evm:a9host:release:ff9b_lib: ./port/fatfs_port.c
    # Compiling am43xx-evm:a9host:release:ff9b_lib: ./port/fatfs_port_mmcsd.c
    #
    # Archiving am43xx-evm:a9host:release:ff9b_lib
    #
    # Compiling am43xx-evm:a9host:release:qspi_lib: qspi_lib.c
    #
    # Archiving am43xx-evm:a9host:release:qspi_lib
    #
    # Compiling am43xx-evm:a9host:release:nand_lib: nand_lib.c
    # Compiling am43xx-evm:a9host:release:nand_lib: nand_lib_gpmc.c
    #
    # Archiving am43xx-evm:a9host:release:nand_lib
    #
    
    C:\ti\pdk_am437x_1_0_9\packages\ti\starterware>dir binary\library\nandlib\lib\am43xx-evm\a9\release\gcc
     Volume in drive C is Windows
     Volume Serial Number is FCCB-4263
    
     Directory of C:\ti\pdk_am437x_1_0_9\packages\ti\starterware\binary\library\nandlib\lib\am43xx-evm\a9\release\gcc
    
    05/12/2021  10:06 AM    <DIR>          .
    05/12/2021  10:06 AM    <DIR>          ..
    05/12/2021  10:06 AM            20,088 libnand_lib.a
                   1 File(s)         20,088 bytes
                   2 Dir(s)  679,630,991,360 bytes free
    
    C:\ti\pdk_am437x_1_0_9\packages\ti\starterware>

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Marc:

    您是否 能够实施仪表并确定 NAND ECC 是否按预期工作、或者您是否解决了此问题?

    谢谢、此致、

    _________

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我还无法实施这些更改。
    上周、我们决定将板上的 NAND 闪存替换为 QSPI NOR 闪存、因为我们尚未看到 采用 NAND 闪存的可持续解决方案。 自一个月以来、我们一直在努力寻找问题。

    不过、我对 TI PDK 软件包非常不满意。 这从 NAND ECC 问题开始、最后介绍了如何 根据 am437在 PDK 中创建新的定制板(由于 采用 QSPI NOR 闪存的新硬件设计、我需要它)。 我希望得到更多有关这方面的信息。   添加定制电路板的 PDK 手册以该语句结尾

    "目前、AM335x 和 AM437x 电路板库重复使用了传统 Starterware 软件中使用的电路板支持。 AM335x 和 AM437x 用户还需要修改 Starterware 中的编译文件、以构建其定制板库。 AM335x/AM437x 所需的其他步骤将很快添加到本节的本文中"

    由于 PDK 版本04.03、本手册中存在此注意事项。 2年后在版本06.03中、手册中未添加其他步骤。 这也非常糟糕。

    老实说、我不会再在我们的电路板上设计 Sitara 芯片了。 也许芯片有一些优势、但 我认为软件包和手册还不够。

    对于未来的发展、我们将查看 其他类似的芯片。

    无论如何都谢谢。

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的更新、我理解您的沮丧。 关于添加定制板的文档、我们进行了一些重大更新、即将发布。 新增了一节内容、介绍如何为 AM335x/437x 创建定制板。 请参阅随附的 PDF、尤其是第3.1.3.7节-为 AM335x 和 AM437x 创建定制电路板库。  

    e2e.ti.com/.../Processor-SDK-RTOS-Documentation-3.1.-Board-Support.pdf

    对于引导、我们还进行了更新。 另请参阅随附的 PDF。

    e2e.ti.com/.../Processor-SDK-RTOS-Documentation-4.6-Boot.pdf

    我将关闭该线程。 如果您对创建定制板或从 QSPI NOR 引导有疑问、请打开新主题。

    谢谢、此致、

    _________