MPU FreeRTOS

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

MPU FreeRTOS

1,613 Views
imanolallende
Contributor III

I am using the i.MX 6SoloX board with a Linux image in the Cortex-A9 and FreeRTOS in Cortex-M4. I am trying to use the OCRAM as shared memory between both cores.

If we look to the memory maps tables, it can be seen that the A9 is  0x90000-0x91FFFF and M4 is  20900000-2091FFFF.

In Linux dtb I have set the following shared memory:

    fsl,shared-mem-addr = <0x91F000>;
    fsl,shared-mem-size = <0x1000>;

Therefore, in FreeRTOS I want to read the following memory range and I set the permission in the RDC. (hardware_init.c)

    uint32_t start, end;

    start = 0x20910000;
    end = 0x2091FFFF;

    RDC_SetMrAccess(RDC, rdcMrOcram, start, end, 0xFF, true, false);

If a I write something in the RAM memory, the only way I have get to read it through the Cortex-M4 is disabling the Cache memory in system_MCIMX6X_M4.c.

      LMEM_PSCCR = (LMEM_PSCCR_ENWRBUF_MASK /*| LMEM_PSCCR_ENCACHE_MASK*/);

However, I only want to disable it for the OCRAM, not for the whole system. I tried with the MPU but I do not get the desired result. I program it in region 1 with the following features (TEX 000 / C 1 / B 0 / S 1 / AP 011 / 64KB).

Why I do not get to read the data if I disable the cache for it? Do I disable it correctly?

pastedImage_2.png

    /* M4 core clock root configuration. */
    /* Initialize MPU */
    /* Make sure outstanding transfers are done. */
    __DMB();
    /* Disable the MPU. */
    MPU->CTRL = 0;

    /* Select Region 0 to configure DDR memory(1MB). */
    MPU->RNR  = 0;
    MPU->RBAR = 0x80000000;
    MPU->RASR = 0x030B0027;

    /* Select Region 1 to configure share memory with A9(1M). */
    MPU->RNR  = 1;
    MPU->RBAR = 0x20910000;
    MPU->RASR = 0x306001F;                                    


    /* Select Region 2 to configure ocram. */
    MPU->RNR  = 2;
    MPU->RBAR = 0;
    MPU->RASR = 0;


    /* Select Region 3 to configure QSPI memory. */
    MPU->RNR  = 3;
    MPU->RBAR = 0x60000000;
    MPU->RASR = 0x030B0029;

    /* Disable unused regions. */
    MPU->RNR  = 4;
    MPU->RBAR = 0;
    MPU->RASR = 0;
    MPU->RNR  = 5;
    MPU->RBAR = 0;
    MPU->RASR = 0;
    MPU->RNR  = 6;
    MPU->RBAR = 0;
    MPU->RASR = 0;
    MPU->RNR  = 7;
    MPU->RBAR = 0;
    MPU->RASR = 0;

    /* Enable Privileged default memory map and the MPU. */
    MPU->CTRL = MPU_CTRL_ENABLE_Msk |
             MPU_CTRL_PRIVDEFENA_Msk;
    /* Memory barriers to ensure subsequence data & instruction
    * transfers using updated MPU settings.
    */
    __DSB();
    __ISB()

Labels (1)
0 Kudos
2 Replies

978 Views
imanolallende
Contributor III

Still not working. Does anyone know how to do it?

0 Kudos

978 Views
Carlos_Musich
NXP Employee
NXP Employee

Hi Imanol,

Please take a look to the following posts, you will find them useful.

How does M4 and A9 on i.mx6sx access DDR 

MCC for FreeRTOS 

Running RPMsg Demo Applications for Multicore Communication with IMX6SX and IMX7D 


Best regards,
TIC

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos