Blame view

RIOT/cpu/cortexm_common/mpu.c 1.33 KB
a752c7ab   elopes   add first test an...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  /*
   * Copyright (C) 2016 Loci Controls Inc.
   *
   * This file is subject to the terms and conditions of the GNU Lesser
   * General Public License v2.1. See the file LICENSE in the top level
   * directory for more details.
   */
  
  /**
   * @ingroup     cpu_cortexm_common
   * @{
   *
   * @file        mpu.c
   * @brief       Cortex-M Memory Protection Unit (MPU) Driver
   *
   * @author      Ian Martin <ian@locicontrols.com>
   *
   * @}
   */
  
  #include <assert.h>
  
  #include "cpu.h"
  #include "mpu.h"
  
  int mpu_disable(void) {
  #if __MPU_PRESENT
      MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;
      return 0;
  #else
      return -1;
  #endif
  }
  
  int mpu_enable(void) {
  #if __MPU_PRESENT
      MPU->CTRL |= MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_ENABLE_Msk;
  
      /* Enable the memory fault exception */
      SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
  
      return 0;
  #else
      return -1;
  #endif
  }
  
  bool mpu_enabled(void) {
  #if __MPU_PRESENT
      return (MPU->CTRL & MPU_CTRL_ENABLE_Msk) != 0;
  #else
      return false;
  #endif
  }
  
  int mpu_configure(uint_fast8_t region, uintptr_t base, uint_fast32_t attr) {
  #if __MPU_PRESENT
      assert(region < MPU_NUM_REGIONS);
  
      MPU->RNR  = region;
      MPU->RBAR = base & MPU_RBAR_ADDR_Msk;
      MPU->RASR = attr | MPU_RASR_ENABLE_Msk;
  
      if (!mpu_enabled()) {
          mpu_enable();
      }
  
      return 0;
  #else
      (void)region;
      (void)base;
      (void)attr;
      return -1;
  #endif
  }