Esempio n. 1
0
_mqx_uint _kinetis_mpu_sw_check_mask
    (
        // [IN] cheked block start address
        uint_32 addr, 
        // [IN] checked block size
        _mem_size size,
        // [IN] required access flags, direct value - cortex mpu specific
        uint_32 flags,
        uint_32 mask
    ) 
{
    _mqx_uint i, res = 0, state = 0;
    
    for (i = 0; i < CORTEX_MPU_REC; i++) {
        if ((MPU_WORD(i, 3) & MPU_WORD_VLD_MASK) && ((addr >= MPU_WORD(i, 0) && addr <= MPU_WORD(i, 1)) || ((addr + size - 1) >= MPU_WORD(i, 0) && (addr + size - 1) <= MPU_WORD(i, 1)))) {
            // founded record, check flags
            
            state |= MPU_WORD_M0UM(MPU_WORD(i, 2));
        }
    }

    // only for core access
    if ((state & mask) == flags) {
        res = 1;
    }
                                   
    return res;
}
Esempio n. 2
0
_mqx_uint _kinetis_mpu_add_region
    (
        // [IN] mpu region start address
        uchar_ptr start,
        // [IN] mpu region end address
        uchar_ptr end,
        // [IN] access rights, direct value - cortex mpu specific
        _mqx_uint flags
    )
{
    _mqx_uint i;
    _mqx_uint res = MQX_OK;

    for (i = 1; (i < CORTEX_MPU_REC) && (MPU_WORD(i, 3) & MPU_WORD_VLD_MASK); i++) {}

    if (i < CORTEX_MPU_REC) {
        MPU_WORD(i, 0) = (_mem_size)start & MPU_WORD_SRTADDR_MASK;
        MPU_WORD(i, 1) = (_mem_size)end & MPU_WORD_ENDADDR_MASK | 0x01f;
        MPU_WORD(i, 2) = flags;
        MPU_WORD(i, 3) = MPU_WORD_VLD_MASK;
    }
    else
        res = MQX_ERROR;

    return res;
}
Esempio n. 3
0
_mqx_uint _kinetis_mpu_init(void) {
    _mqx_uint i;
    
    MPU_CESR &= ~MPU_CESR_VLD_MASK;
    
    for (i = 0; i < CORTEX_MPU_REC; i++) {
        MPU_WORD(i, 2) = 0;
    }
    
    return MQX_OK;
}