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.

[参考译文] TMDS243EVM:AM243x LBIST:测试从不完成 (SDL_LBIST_checkDone 从不返回 LBIST_DONE)

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1580041/tmds243evm-am243x-lbist-test-never-completes-sdl_lbist_checkdone-never-returns-lbist_done

器件型号: TMDS243EVM

您好:

我已经根据建议的示例在引导加载程序中实现了 LBIST 功能。 下面是相关的代码片段:

/* Timeout for LBIST completion */
#define SDL_BIST_MAX_TIMEOUT_VALUE (10000000u) //(4294967295u)

int32_t App_startMcuLbist() {
    int32_t status = SystemP_FAILURE;

    /* Start LBIST if MCU reset isolation is not enabled */
    if (!Bootloader_socIsMCUResetIsoEnabled()) {
        if (SDL_LBIST_selfTest(LBIST_MCU_M4F, SDL_LBIST_TEST) == SDL_PASS) {
            status = SystemP_SUCCESS;
        }
    } else {
        status = SystemP_SUCCESS;
    }

    return status;
}

int32_t App_waitForMcuLbist() {
    int32_t status = SystemP_FAILURE;
    uint32_t timeoutCount = 0;

    if (!Bootloader_socIsMCUResetIsoEnabled()) {
        /* Wait for LBIST to complete */
        while (timeoutCount < SDL_BIST_MAX_TIMEOUT_VALUE) {
            if (LBIST_DONE == SDL_LBIST_checkDone(LBIST_MCU_M4F)) {
                status = SystemP_SUCCESS;
                break;
            }
            timeoutCount++;
        }

        if (status == SystemP_SUCCESS) {
            status = SDL_LBIST_selfTest(LBIST_MCU_M4F, SDL_LBIST_TEST_RELEASE);
            timeoutCount = 0;

            while (timeoutCount < SDL_BIST_MAX_TIMEOUT_VALUE) {
                if (LBIST_DONE == SDL_LBIST_checkDone(LBIST_MCU_M4F)) {
                    status = SystemP_SUCCESS;
                    break;
                }
                timeoutCount++;
            }
        }
    } else {
        status = SystemP_SUCCESS;
    }

    return status;
}

...
int32_t statustest;

/* Start MCU LBIST */
statustest = App_startMcuLbist();
platformLog("App_startMcuLbist %d \r\n", statustest);

/* Wait for LBIST completion */
statustest = App_waitForMcuLbist();
platformLog("App_waitForMcuLbist %d \r\n", statustest);
Bootloader_profileAddProfilePoint("App_waitForMcuLbist");
...

我面临的问题是我 SDL_PASS 从收到 SDL_LBIST_selfTest、这表明测试已成功启动。 然而,我总是 -1 从 App_waitForMcuLbist() 因为开始的测试永远不会完成(从不返回)SDL_LBIST_checkDone  LBIST_DONE

我也尝试增加的值 SDL_BIST_MAX_TIMEOUT_VALUE,但这只会使循环需要更长的时间而不改变结果。

我在这里遗漏了什么吗? 我是否需要采取其他步骤来确保 LBIST 测试成功完成? 或者、我是否应该了解任何已知的限制或依赖性?

提前感谢您的支持!

此致、
Sebastian

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

    是否有任何更新?

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

    同时、我还尝试了几种方法来从 R5F 引导加载程序在 M4F 内核上运行 LBIST。
    我的函数 App_startMcuLbist () 现在看起来像这样:

    int32_t App_startMcuLbist()
    {
        int32_t status = SystemP_FAILURE;
    
        uartSendStringInt("Bootloader_socIsMCUResetIsoEnabled: ", Bootloader_socIsMCUResetIsoEnabled());
    
        /* Start LBIST if MCU reset isolation is not enabled */
        if (!Bootloader_socIsMCUResetIsoEnabled())
        {
            // Power-up for M4F core
            int32_t setRet = Sciclient_pmSetModuleState(
                TISCI_DEV_MCU_M4FSS0_CORE0,
                TISCI_MSG_VALUE_DEVICE_SW_STATE_ON,
                TISCI_MSG_FLAG_AOP,
                0xFFFFFFFFU
            );
            uartSendStringInt("Sciclient_pmSetModuleState (M4F ON) ret: ", setRet);
    
    
            // Reset release for M4F core (0 = deassert reset)
            int32_t rstRet = Sciclient_pmSetModuleRst(
                TISCI_DEV_MCU_M4FSS0_CORE0,
                0,
                0xFFFFFFFFU
            );
            uartSendStringInt("Sciclient_pmSetModuleRst (M4F Release) ret: ", rstRet);
    
    
            // Explicitly enable clocks for M4F (DAP and VBUS)
            uartSendString("Enabling M4F core clocks (DAP, VBUS)...\r\n");
            int32_t clkStatus = 0;
            clkStatus = Sciclient_pmModuleClkRequest(TISCI_DEV_MCU_M4FSS0_CORE0, TISCI_DEV_MCU_M4FSS0_CORE0_DAP_CLK, TISCI_MSG_VALUE_CLOCK_SW_STATE_REQ,0, 0xFFFFFFFFU);
            uartSendStringInt("DAP_CLK enable status: ", clkStatus);
            clkStatus = Sciclient_pmModuleClkRequest(TISCI_DEV_MCU_M4FSS0_CORE0, TISCI_DEV_MCU_M4FSS0_CORE0_VBUS_CLK, TISCI_MSG_VALUE_CLOCK_SW_STATE_REQ,0, 0xFFFFFFFFU);
            uartSendStringInt("VBUS_CLK enable status: ", clkStatus);
    
    
            // M4F software reset
            uartSendString("M4F Software-Reset vor LBIST...\r\n");
            int32_t swRstRet = Sciclient_pmSetModuleRst(
                TISCI_DEV_MCU_M4FSS0_CORE0,
                1, // Assert Reset
                0xFFFFFFFFU
            );
            uartSendStringInt("Sciclient_pmSetModuleRst (M4F Assert) ret: ", swRstRet);
            swRstRet = Sciclient_pmSetModuleRst(
                TISCI_DEV_MCU_M4FSS0_CORE0,
                0, // Deassert Reset
                0xFFFFFFFFU
            );
            uartSendStringInt("Sciclient_pmSetModuleRst (M4F Deassert) ret: ", swRstRet);
    
    
            // Check status
            uint32_t m4fPowerState = 0, m4fResetState = 0, m4fContextLoss = 0;
            int32_t ret = Sciclient_pmGetModuleState(
                TISCI_DEV_MCU_M4FSS0_CORE0,
                &m4fPowerState,
                &m4fResetState,
                &m4fContextLoss,
                0xFFFFFFFFU
            );
            uartSendStringInt("M4F Get Module State (ret): ", ret);
            uartSendStringInt("M4F Power State: ", m4fPowerState);
            uartSendStringInt("M4F Reset State: ", m4fResetState);
            uartSendStringInt("M4F Context Loss: ", m4fContextLoss);
    
    
            // Check LBIST status register
            volatile uint32_t* lbistStatusReg = (volatile uint32_t*)(CSL_MCU_CTRL_MMR0_CFG0_BASE + CSL_MCU_CTRL_MMR_CFG0_MCU_M4FSS0_LBIST_STAT);
            uartSendStringInt("LBIST Status Register: ", *lbistStatusReg);
    
    
            if (SDL_LBIST_selfTest(LBIST_MCU_M4F, SDL_LBIST_TEST) == SDL_PASS)
            {
                status = SystemP_SUCCESS;
            }
        }
        else
        {
            status = SystemP_SUCCESS;
        }
        return status;
    }

    我在这里调用函数:

    uint64_t m4fClkRate = 0;
    SOC_moduleGetClockFrequency(TISCI_DEV_MCU_M4FSS0_CORE0, 0, &m4fClkRate);
    uartSendStringLong("MCU M4F Core Clock Frequency 1: ", m4fClkRate);
    
    /* start MCU LBIST*/ 
    int32_t statusLbist = App_startMcuLbist();
    uartSendStringInt("App_startMcuLbist ", statusLbist);
    
    /* wait for LBIST completion */
    statusLbist = App_waitForMcuLbist();
    uartSendStringInt("App_waitForMcuLbist ", statusLbist);
    Bootloader_profileAddProfilePoint("App_waitForMcuLbist");
    
    SOC_moduleGetClockFrequency(TISCI_DEV_MCU_M4FSS0_CORE0, 0, &m4fClkRate);
    uartSendStringLong("MCU M4F Core Clock Frequency 2: ", m4fClkRate);

    UART 输出:

    MCU M4F Core Clock Frequency 1: 400000000
    Bootloader_socIsMCUResetIsoEnabled: 0
    Sciclient_pmSetModuleState (M4F ON) ret: 0
    Sciclient_pmSetModuleRst (M4F Release) ret: 0
    Enabling M4F core clocks (DAP, VBUS)...
    DAP_CLK enable status: 0
    VBUS_CLK enable status: 0
    M4F Software-Reset vor LBIST...
    Sciclient_pmSetModuleRst (M4F Assert) ret: 0
    Sciclient_pmSetModuleRst (M4F Deassert) ret: 0
    M4F Get Module State (ret): 0
    M4F Power State: 1
    M4F Reset State: 0
    M4F Context Loss: 1
    LBIST Status Register: 0
    App_startMcuLbist 0
    App_waitForMcuLbist -1
    MCU M4F Core Clock Frequency 2: 400000000

    您可以看到、LBIST 仍然无法启动。 LBIST 状态寄存器始终读为 0、App_waitForMcuLbist 返回–1。 我是否可能错误地读取 LBIST 状态寄存器、或者是否还有另一个需要的步骤来触发 M4F 内核的 LBIST? 请提供任何建议或文件参考。


    谢谢!

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

    下面似乎对我有用。

        int32_t testResult = 0;
        SDL_LBIST_inst instance = LBIST_MCU_M4F;
        uint8_t tisciProcId = SCICLIENT_PROCID_MCU_M4FSS0_C0;
        uint32_t tisciDeviceId = TISCI_DEV_MCU_M4FSS0_CORE0;
        uint32_t timeoutCount = 0;
    
        /* Unlock all MMR registers for SDL LBIST access */
        SOC_unlockAllMMR();
    
        /* Request Primary core */
        status = Sciclient_procBootRequestProcessor(tisciProcId, 0xFFFFFFFFU);
        if (status != SDL_PASS){
            testResult = -1;
        }
    
        /* Put Primary core in reset */
        if (testResult == 0){
            status = Sciclient_pmSetModuleRst(tisciDeviceId,
                                              0x1,
                                              0xFFFFFFFFU);
            if (status != SDL_PASS){
                testResult = -1;
            }
        }
    
        /* Place Primary core into retention */
        if (testResult == 0){
            status =  Sciclient_pmSetModuleState(tisciDeviceId,
                                                TISCI_MSG_VALUE_DEVICE_SW_STATE_RETENTION,
                                                TISCI_MSG_FLAG_AOP,
                                                0xFFFFFFFFU);
            if (status != SDL_PASS)
            {
                testResult = -1;
            }
        }
    
        /* Run LBIST */
        if (testResult == 0){
            status = SDL_LBIST_selfTest(instance, SDL_LBIST_TEST);
            if (status != SDL_PASS){
                testResult = -1;
            }
        }
    
        /* Check LBIST run finished */
        if (testResult == 0)
        {
            timeoutCount = 0;
            while(timeoutCount < SDL_BIST_MAX_TIMEOUT_VALUE && LBIST_DONE != SDL_LBIST_checkDone(instance))
            {
                timeoutCount++;
            }
            if (timeoutCount >= SDL_BIST_MAX_TIMEOUT_VALUE){
                testResult = -1;
            }
        }
    
        /* Release LBIST */
        if (testResult == 0){
            status = SDL_LBIST_selfTest(instance, SDL_LBIST_TEST_RELEASE);
            if (status != SDL_PASS){
                testResult = -1;
            }
        }
    
        /* Check LBIST release finished */
        if (testResult == 0) {
            timeoutCount = 0;
            while(timeoutCount < SDL_BIST_MAX_TIMEOUT_VALUE && LBIST_DONE != SDL_LBIST_checkDone(instance))
            {
                timeoutCount++;
            }
            if (timeoutCount >= SDL_BIST_MAX_TIMEOUT_VALUE){
                testResult = -1;
            }
        }
    
        /* Power off Primary core */
        if (testResult == 0){
            status =  Sciclient_pmSetModuleState(tisciDeviceId,
                                                 TISCI_MSG_VALUE_DEVICE_SW_STATE_AUTO_OFF,
                                                 TISCI_MSG_FLAG_AOP,
                                                 0xFFFFFFFFU);
            if (status != SDL_PASS){
                testResult = -1;
            }
        }
    
        /* Take Primary core out of local reset */
        if (testResult == 0){
            status = Sciclient_pmSetModuleRst(tisciDeviceId,
                                              0x0,
                                              0xFFFFFFFFU);
            if (status != SDL_PASS){
                testResult = -1;
            }
        }
    
        /* Release Primary core */
        if (testResult == 0){
            status = Sciclient_procBootReleaseProcessor(tisciProcId,
                                                        TISCI_MSG_FLAG_AOP,
                                                        0xFFFFFFFFU);
            if (status != SDL_PASS){
                testResult = -1;
            }
        }