_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; }
_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; }
_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; }