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.

[FAQ] TDA4VH-Q1: Extending SDL CCM example to the Main Domain R5Fs

Part Number: TDA4VH-Q1

Currently the SDL CCM test caters only to MCU domain R5Fs. Provide the steps to port the SDL cpu_app to perform CCM on the Main Domain R5Fs.

  • Hi,

    Please find below the steps to port the SDL cpu_app to perform CCM on the Main Domain -

    1. Apply this patch on the base SDL directory, to modify the existing cpu_app to run on the main domain using the below steps -

    cd $RTOS_SDK/sdl/
    git init
    git add .
    git commit -m "init commit"
    git am $PATH_TO_PATCH_SHARED_BELOW

    5355.0001-Porting-CCM-cpu_app-to-eMCU-Main-R5F.txt
    From aa1556f24ea5c248e828f87472f7b2aca4552256 Mon Sep 17 00:00:00 2001
    From: Josiitaa RL <j-rl@ti.com>
    Date: Thu, 4 Apr 2024 15:42:58 +0530
    Subject: [PATCH] Porting CCM cpu_app to eMCU/Main R5F
    
    - Includes macro changes from SDL_CCM_MCU_R5F0 to SDL_CCM_R5F0
    - ESM events defined
    - CCM event bitmap modified
    
    Signed-off-by: Josiitaa RL <j-rl@ti.com>
    ---
     examples/cpu/cpu_example.c | 15 ++++++++-------
     examples/cpu/main.c        |  8 +++++---
     src/sdl/r5/sdl_ccm.c       | 18 +++++++++---------
     src/sdl/sdl_esm_core.h     |  7 +++++++
     4 files changed, 29 insertions(+), 19 deletions(-)
    
    diff --git a/examples/cpu/cpu_example.c b/examples/cpu/cpu_example.c
    index 8126e39..7b3a49b 100755
    --- a/examples/cpu/cpu_example.c
    +++ b/examples/cpu/cpu_example.c
    @@ -226,7 +226,7 @@ int32_t SDL_TEST_CCMSelfTest(void)
     
         UART_printf("\n R5F-CPU example application CCM self test: starting");
     
    -    result = SDL_CCM_selfTest(SDL_CCM_MCU_R5F0,
    +    result = SDL_CCM_selfTest(SDL_CCM_R5F0,
     	                          SDL_CCM_MONITOR_TYPE_OUTPUT_COMPARE_BLOCK,
                                   SDL_CCM_SELFTEST_TYPE_NORMAL, 0U,
                                   10000000);
    @@ -258,7 +258,7 @@ int32_t SDL_TEST_CCMSelfTestErrorForce(void)
     
         UART_printf("\n R5F-CPU example application CCM self test with error forcing: starting");
     
    -    result = SDL_CCM_selfTest(SDL_CCM_MCU_R5F0,
    +    result = SDL_CCM_selfTest(SDL_CCM_R5F0,
     	                          SDL_CCM_MONITOR_TYPE_OUTPUT_COMPARE_BLOCK,
                                   SDL_CCM_SELFTEST_TYPE_ERROR_FORCING, 0U,
                                   10000000);
    @@ -289,7 +289,7 @@ int32_t SDL_TEST_CCMInjectError(void)
     
         UART_printf("\n R5F-CPU example application CCM inject  error: test starting");
     
    -    result = SDL_CCM_injectError(SDL_CCM_MCU_R5F0, SDL_CCM_MONITOR_TYPE_OUTPUT_COMPARE_BLOCK);
    +    result = SDL_CCM_injectError(SDL_CCM_R5F0, SDL_CCM_MONITOR_TYPE_OUTPUT_COMPARE_BLOCK);
     
         if (result != SDL_PASS ) {
             UART_printf("\n R5F-CPU example application CCM inject failed");
    @@ -357,7 +357,7 @@ int32_t CCM_Test_init (void)
             /* Wait for any self test running to settle */
             Osal_delay(2000);
             /* Initialize CCM */
    -        result = SDL_CCM_init(0);
    +        result = SDL_CCM_init(SDL_CCM_R5F0);
             if (result != SDL_PASS) {
                 /* print error and quit */
                 UART_printf("CCM_Test_init: Error result = %d\n", result);
    @@ -368,7 +368,7 @@ int32_t CCM_Test_init (void)
             }
     		Osal_delay(2000);
     		        /* Initialize CCM */
    -        result = SDL_CCM_verifyConfig(0);
    +        result = SDL_CCM_verifyConfig(SDL_CCM_R5F0);
             if (result != SDL_PASS) {
                 /* print error and quit */
                 UART_printf("R5F-CPU example application CCM_Test_init: Error result = %d\n", result);
    @@ -399,7 +399,7 @@ int32_t CCM_funcTest(void)
     	{
     		UART_printf("\nCCM Functional Test \r\n");
     	    /* Run the test for diagnostics first */
    -		testResult = CCM_runTest(SDL_CCM_MCU_R5F0);
    +		testResult = CCM_runTest(SDL_CCM_R5F0);
     	}
     	else
     	{
    @@ -539,6 +539,7 @@ int32_t cpu_example_app(void)
             }
         }
     	
    +    /* MPU tests can be tested only on the core that they are being run on. Does not apply to Main Domain
     	if(testResult == 0)
     	{
     		SDL_copyResetVector();
    @@ -549,7 +550,7 @@ int32_t cpu_example_app(void)
         		UART_printf("R5F-CPU example application SDL_runMPUSelfTest: failure on line no. %d \n", __LINE__);
         		testResult = -1;
         	}
    -	}
    +	}*/
       return(testResult);
     }
     /* Nothing past this point */
    diff --git a/examples/cpu/main.c b/examples/cpu/main.c
    index da2f7be..9f318a8 100755
    --- a/examples/cpu/main.c
    +++ b/examples/cpu/main.c
    @@ -106,9 +106,11 @@ int32_t SDL_ESM_applicationCallbackFunction(SDL_ESM_Inst esmInst,
                     esmInst, esmIntrType, grpChannel, index, intSrc);
         UART_printf("  Take action \n");
     
    -    SDL_CCM_getErrorType(SDL_CCM_MCU_R5F0, intSrc, &monitorType);
    -    SDL_CCM_clearError(SDL_CCM_MCU_R5F0, monitorType);
    -
    +    SDL_CCM_getErrorType(SDL_CCM_R5F0, intSrc, &monitorType);
    +    SDL_CCM_clearError(SDL_CCM_R5F0, monitorType);
    +    /* Clear ESM registers. */
    +    SDL_ESM_disableIntr(SDL_ESM0_CFG_BASE, intSrc);
    +    SDL_ESM_clrNError(SDL_ESM_INST_MAIN_ESM0);
        return retVal;
     }
     
    diff --git a/src/sdl/r5/sdl_ccm.c b/src/sdl/r5/sdl_ccm.c
    index 3be4efe..c695e14 100755
    --- a/src/sdl/r5/sdl_ccm.c
    +++ b/src/sdl/r5/sdl_ccm.c
    @@ -62,15 +62,15 @@
     #define        SDL_ESM_CCM_STAT_ERR_INT   5
        /**<  CCM Interrupt source self test or split mode interrupt */
     
    -/* Event BitMap for ECC ESM callback for MCU */
    +/* Event BitMap for ECC ESM callback for Main Domain */
     uint32_t SDL_CCM_eventBitMap[SDL_ESM_MAX_EVENT_MAP_NUM_WORDS] =
     {
    -    0x00000000u, 0x00000000u, 0x00000000u, 0x0000001Fu,
         0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u,
         0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u,
         0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u,
         0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u,
         0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u,
    +    0x000001F0u, 0x00000000u, 0x00000000u, 0x00000000u,
         0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u,
         0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u,
     };
    @@ -263,8 +263,8 @@ static int32_t SDL_CCM_ESM_callBackFunction (SDL_ESM_Inst instance, SDL_ESM_IntT
     
         /* Check if it is self test related interrupt */
         switch (intSrc) {
    -        case SDL_ESM_MCU_R5_SELFTEST_ERR_INT:
    -        case SDL_ESM_MCU_R5_CCM_STAT_ERR_INT:
    +        case SDL_ESM_R5_SELFTEST_ERR_INT:
    +        case SDL_ESM_R5_CCM_STAT_ERR_INT:
                 /* These events can come for any of the CCM block. Read status register to see which self test */
                 retVal = SDL_CCM_CheckSelfTestErrorSource(&monitorType);
                 if ( retVal != SDL_PASS) {
    @@ -397,8 +397,8 @@ int32_t SDL_CCM_init(SDL_CCM_Inst instance)
     
                 if (retVal == SDL_PASS) {
     
    -                /* Register error interrupt call back function with MCU ESM handler */
    -                retVal = SDL_ESM_registerCCMCallback(SDL_ESM_INST_MCU_ESM0, SDL_CCM_eventBitMap,
    +                /* Register error interrupt call back function with MAIN ESM handler */
    +                retVal = SDL_ESM_registerCCMCallback(SDL_ESM_INST_MAIN_ESM0, SDL_CCM_eventBitMap,
                                                   &SDL_CCM_ESM_callBackFunction,
                                                   NULL);
                 }
    @@ -774,7 +774,7 @@ int32_t SDL_CCM_getErrorType(SDL_CCM_Inst instance, uint32_t intSrc, SDL_CCM_Mon
             switch(intSrc)
             {
     
    -            case SDL_ESM_MCU_R5_CPU_BUS_CMP_ERR:
    +            case SDL_ESM_R5_CPU_BUS_CMP_ERR:
                 {
                     /* Read status register of CPU output compare block  */
                     sdlResult = SDL_armR5ReadCCMRegister (SDL_CCM_baseAddress[instance],
    @@ -789,7 +789,7 @@ int32_t SDL_CCM_getErrorType(SDL_CCM_Inst instance, uint32_t intSrc, SDL_CCM_Mon
                     }
                     break;
                 }
    -            case SDL_ESM_MCU_R5_VIM_BUS_CMP_ERR_INT:
    +            case SDL_ESM_R5_VIM_BUS_CMP_ERR_INT:
                 {
                     /* Read status register of VIM compare block  */
                     sdlResult = SDL_armR5ReadCCMRegister (SDL_CCM_baseAddress[instance],
    @@ -804,7 +804,7 @@ int32_t SDL_CCM_getErrorType(SDL_CCM_Inst instance, uint32_t intSrc, SDL_CCM_Mon
                     }
                     break;
                 }
    -            case SDL_ESM_MCU_R5_INACTIVITY_ERR_INT:
    +            case SDL_ESM_R5_INACTIVITY_ERR_INT:
                 {
                     /* Read status register of Inactivity monitor block  */
                     sdlResult = SDL_armR5ReadCCMRegister (SDL_CCM_baseAddress[instance],
    diff --git a/src/sdl/sdl_esm_core.h b/src/sdl/sdl_esm_core.h
    index 6c6d2ba..0dc09fd 100644
    --- a/src/sdl/sdl_esm_core.h
    +++ b/src/sdl/sdl_esm_core.h
    @@ -186,6 +186,13 @@ extern "C" {
     #define SDL_ESM_MCU_CBASS_ECC_AGGR_SEC_INT     SDLR_MCU_ESM0_ESM_LVL_EVENT_MCUM_MCU_ECC_AGGR0_CORR_LEVEL_0
     #define SDL_ESM_MCU_CBASS_ECC_AGGR_DED_INT     SDLR_MCU_ESM0_ESM_LVL_EVENT_MCUM_MCU_ECC_AGGR0_UNCORR_LEVEL_0
     
    +/*MAIN R5F CCM Events*/
    +#define SDL_ESM_R5_SELFTEST_ERR_INT            SDLR_ESM0_ESM_PLS_EVENT0_R5FSS0_COMMON0_SELFTEST_ERR_PULSE_0
    +#define SDL_ESM_R5_CPU_BUS_CMP_ERR             SDLR_ESM0_ESM_PLS_EVENT0_R5FSS0_COMMON0_COMPARE_ERR_PULSE_0
    +#define SDL_ESM_R5_INACTIVITY_ERR_INT          SDLR_ESM0_ESM_PLS_EVENT0_R5FSS0_COMMON0_BUS_MONITOR_ERR_PULSE_0
    +#define SDL_ESM_R5_VIM_BUS_CMP_ERR_INT         SDLR_ESM0_ESM_PLS_EVENT0_R5FSS0_COMMON0_VIM_COMPARE_ERR_PULSE_0
    +#define SDL_ESM_R5_CCM_STAT_ERR_INT            SDLR_ESM0_ESM_PLS_EVENT0_R5FSS0_CCM_COMPARE_STAT_PULSE_INTR_0
    +
     #endif /* SOC_J784S4 */
     
     #ifdef __cplusplus
    -- 
    2.34.1
    
    

    2. This example must be tested when the Main R5F is running in lockstep mode. To enable lockstep mode on the Main R5F,

    • Build the cpu_app using the command - make cpu_app SOC=j784s4
    • cd PDK/packages/ti/build and build a dummy app that can run power on the MCU2_0 core using - make sbl_boot_test BOARD=j784s4_evm CORE=mcu2_0
    • cd PDK/packages/ti/boot/sbl/tools/multicoreImageGen/bin and enable lockstep mode by generating combined appimage on the MCU2_0 core using the command - ./MulticoreImageGen LE 55 cpu_app_multicore.appimage 8 ~/SDK/sdl/binary/cpu_app/bin/j784s4/cpu_app_r5f_baremetal_debug.rprc 28 ~/SDK/PDK/packages/ti/boot/sbl/example/k3MulticoreApp/binary/j784s4/sbl_boot_test_j784s4_evm_mcu2_0TestApp_release.rprc

    NOTE: In the above combined image command, Make sure you are writing the correct core number. It can be found at (..\PDK\ti\boot\sbl\soc\k3\sbl_slave_core_boot.h) Ex. #define MCU1_CPU0_ID (8U), here 8 is the core number for the mcu1_0 core and #define MCU2_SMP_ID (28U), here 28 is the core number for the mcu2_0 SMP core to enable lockstep.

    Regards,

    Josiitaa