]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/CORTEX_EFM32_Gecko_Starter_Kit_Simplicity_Studio/Source/SilLabs_Code/emlib/inc/em_mpu.h
Add EFM32 Giant Gecko Starter Kit demo - still a work in progress as the low power...
[freertos] / FreeRTOS / Demo / CORTEX_EFM32_Gecko_Starter_Kit_Simplicity_Studio / Source / SilLabs_Code / emlib / inc / em_mpu.h
diff --git a/FreeRTOS/Demo/CORTEX_EFM32_Gecko_Starter_Kit_Simplicity_Studio/Source/SilLabs_Code/emlib/inc/em_mpu.h b/FreeRTOS/Demo/CORTEX_EFM32_Gecko_Starter_Kit_Simplicity_Studio/Source/SilLabs_Code/emlib/inc/em_mpu.h
new file mode 100644 (file)
index 0000000..300a989
--- /dev/null
@@ -0,0 +1,242 @@
+/***************************************************************************//**\r
+ * @file em_mpu.h\r
+ * @brief Memory protection unit (MPU) peripheral API\r
+ * @version 4.0.0\r
+ *******************************************************************************\r
+ * @section License\r
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>\r
+ *******************************************************************************\r
+ *\r
+ * Permission is granted to anyone to use this software for any purpose,\r
+ * including commercial applications, and to alter it and redistribute it\r
+ * freely, subject to the following restrictions:\r
+ *\r
+ * 1. The origin of this software must not be misrepresented; you must not\r
+ *    claim that you wrote the original software.\r
+ * 2. Altered source versions must be plainly marked as such, and must not be\r
+ *    misrepresented as being the original software.\r
+ * 3. This notice may not be removed or altered from any source distribution.\r
+ *\r
+ * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no\r
+ * obligation to support this Software. Silicon Labs is providing the\r
+ * Software "AS IS", with no express or implied warranties of any kind,\r
+ * including, but not limited to, any implied warranties of merchantability\r
+ * or fitness for any particular purpose or warranties against infringement\r
+ * of any proprietary rights of a third party.\r
+ *\r
+ * Silicon Labs will not be liable for any consequential, incidental, or\r
+ * special damages, or any other relief, or for any claim by any third party,\r
+ * arising from your use of this Software.\r
+ *\r
+ ******************************************************************************/\r
+\r
+\r
+#ifndef __SILICON_LABS_EM_MPU_H_\r
+#define __SILICON_LABS_EM_MPU_H_\r
+\r
+#include "em_device.h"\r
+\r
+#if defined(__MPU_PRESENT) && (__MPU_PRESENT == 1)\r
+#include "em_assert.h"\r
+\r
+#include <stdbool.h>\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/***************************************************************************//**\r
+ * @addtogroup EM_Library\r
+ * @{\r
+ ******************************************************************************/\r
+\r
+/***************************************************************************//**\r
+ * @addtogroup MPU\r
+ * @{\r
+ ******************************************************************************/\r
+\r
+/** @anchor MPU_CTRL_PRIVDEFENA\r
+ *  Argument to MPU_enable(). Enables priviledged\r
+ *  access to default memory map.                                            */\r
+#define MPU_CTRL_PRIVDEFENA    MPU_CTRL_PRIVDEFENA_Msk\r
+\r
+/** @anchor MPU_CTRL_HFNMIENA\r
+ *  Argument to MPU_enable(). Enables MPU during hard fault,\r
+ *  NMI, and FAULTMASK handlers.                                             */\r
+#define MPU_CTRL_HFNMIENA      MPU_CTRL_HFNMIENA_Msk\r
+\r
+/*******************************************************************************\r
+ ********************************   ENUMS   ************************************\r
+ ******************************************************************************/\r
+\r
+/**\r
+ * Size of an MPU region.\r
+ */\r
+typedef enum\r
+{\r
+  mpuRegionSize32b   = 4,        /**< 32   byte region size. */\r
+  mpuRegionSize64b   = 5,        /**< 64   byte region size. */\r
+  mpuRegionSize128b  = 6,        /**< 128  byte region size. */\r
+  mpuRegionSize256b  = 7,        /**< 256  byte region size. */\r
+  mpuRegionSize512b  = 8,        /**< 512  byte region size. */\r
+  mpuRegionSize1Kb   = 9,        /**< 1K   byte region size. */\r
+  mpuRegionSize2Kb   = 10,       /**< 2K   byte region size. */\r
+  mpuRegionSize4Kb   = 11,       /**< 4K   byte region size. */\r
+  mpuRegionSize8Kb   = 12,       /**< 8K   byte region size. */\r
+  mpuRegionSize16Kb  = 13,       /**< 16K  byte region size. */\r
+  mpuRegionSize32Kb  = 14,       /**< 32K  byte region size. */\r
+  mpuRegionSize64Kb  = 15,       /**< 64K  byte region size. */\r
+  mpuRegionSize128Kb = 16,       /**< 128K byte region size. */\r
+  mpuRegionSize256Kb = 17,       /**< 256K byte region size. */\r
+  mpuRegionSize512Kb = 18,       /**< 512K byte region size. */\r
+  mpuRegionSize1Mb   = 19,       /**< 1M   byte region size. */\r
+  mpuRegionSize2Mb   = 20,       /**< 2M   byte region size. */\r
+  mpuRegionSize4Mb   = 21,       /**< 4M   byte region size. */\r
+  mpuRegionSize8Mb   = 22,       /**< 8M   byte region size. */\r
+  mpuRegionSize16Mb  = 23,       /**< 16M  byte region size. */\r
+  mpuRegionSize32Mb  = 24,       /**< 32M  byte region size. */\r
+  mpuRegionSize64Mb  = 25,       /**< 64M  byte region size. */\r
+  mpuRegionSize128Mb = 26,       /**< 128M byte region size. */\r
+  mpuRegionSize256Mb = 27,       /**< 256M byte region size. */\r
+  mpuRegionSize512Mb = 28,       /**< 512M byte region size. */\r
+  mpuRegionSize1Gb   = 29,       /**< 1G   byte region size. */\r
+  mpuRegionSize2Gb   = 30,       /**< 2G   byte region size. */\r
+  mpuRegionSize4Gb   = 31        /**< 4G   byte region size. */\r
+} MPU_RegionSize_TypeDef;\r
+\r
+/**\r
+ * MPU region access permission attributes.\r
+ */\r
+typedef enum\r
+{\r
+  mpuRegionNoAccess     = 0,  /**< No access what so ever.                   */\r
+  mpuRegionApPRw        = 1,  /**< Priviledged state R/W only.               */\r
+  mpuRegionApPRwURo     = 2,  /**< Priviledged state R/W, User state R only. */\r
+  mpuRegionApFullAccess = 3,  /**< R/W in Priviledged and User state.        */\r
+  mpuRegionApPRo        = 5,  /**< Priviledged R only.                       */\r
+  mpuRegionApPRo_URo    = 6   /**< R only in Priviledged and User state.     */\r
+} MPU_RegionAp_TypeDef;\r
+\r
+\r
+/*******************************************************************************\r
+ *******************************   STRUCTS   ***********************************\r
+ ******************************************************************************/\r
+\r
+/** MPU Region init structure. */\r
+typedef struct\r
+{\r
+  bool                   regionEnable;     /**< MPU region enable.                */\r
+  uint8_t                regionNo;         /**< MPU region number.                */\r
+  uint32_t               baseAddress;      /**< Region baseaddress.               */\r
+  MPU_RegionSize_TypeDef size;             /**< Memory region size.               */\r
+  MPU_RegionAp_TypeDef   accessPermission; /**< Memory access permissions.   */\r
+  bool                   disableExec;      /**< Disable execution.                */\r
+  bool                   shareable;        /**< Memory shareable attribute.       */\r
+  bool                   cacheable;        /**< Memory cacheable attribute.       */\r
+  bool                   bufferable;       /**< Memory bufferable attribute.      */\r
+  uint8_t                srd;              /**< Memory subregion disable bits.    */\r
+  uint8_t                tex;              /**< Memory type extension attributes. */\r
+} MPU_RegionInit_TypeDef;\r
+\r
+/** Default configuration of MPU region init structure for flash memory.     */\r
+#define MPU_INIT_FLASH_DEFAULT                                  \\r
+  {                                                             \\r
+    true,                   /* Enable MPU region.            */ \\r
+    0,                      /* MPU Region number.            */ \\r
+    FLASH_MEM_BASE,         /* Flash base address.           */ \\r
+    mpuRegionSize1Mb,       /* Size - Set to max. */ \\r
+    mpuRegionApFullAccess,  /* Access permissions.           */ \\r
+    false,                  /* Execution allowed.            */ \\r
+    false,                  /* Not shareable.                */ \\r
+    true,                   /* Cacheable.                    */ \\r
+    false,                  /* Not bufferable.               */ \\r
+    0,                      /* No subregions.                */ \\r
+    0                       /* No TEX attributes.            */ \\r
+  }\r
+\r
+\r
+/** Default configuration of MPU region init structure for sram memory.      */\r
+#define MPU_INIT_SRAM_DEFAULT                                   \\r
+  {                                                             \\r
+    true,                   /* Enable MPU region.            */ \\r
+    1,                      /* MPU Region number.            */ \\r
+    RAM_MEM_BASE,           /* SRAM base address.            */ \\r
+    mpuRegionSize128Kb,     /* Size - Set to max. */ \\r
+    mpuRegionApFullAccess,  /* Access permissions.           */ \\r
+    false,                  /* Execution allowed.            */ \\r
+    true,                   /* Shareable.                    */ \\r
+    true,                   /* Cacheable.                    */ \\r
+    false,                  /* Not bufferable.               */ \\r
+    0,                      /* No subregions.                */ \\r
+    0                       /* No TEX attributes.            */ \\r
+  }\r
+\r
+\r
+/** Default configuration of MPU region init structure for onchip peripherals.*/\r
+#define MPU_INIT_PERIPHERAL_DEFAULT                             \\r
+  {                                                             \\r
+    true,                   /* Enable MPU region.            */ \\r
+    0,                      /* MPU Region number.            */ \\r
+    0,                      /* Region base address.          */ \\r
+    mpuRegionSize32b,       /* Size - Set to minimum         */ \\r
+    mpuRegionApFullAccess,  /* Access permissions.           */ \\r
+    true,                   /* Execution not allowed.        */ \\r
+    true,                   /* Shareable.                    */ \\r
+    false,                  /* Not cacheable.                */ \\r
+    true,                   /* Bufferable.                   */ \\r
+    0,                      /* No subregions.                */ \\r
+    0                       /* No TEX attributes.            */ \\r
+  }\r
+\r
+\r
+/*******************************************************************************\r
+ *****************************   PROTOTYPES   **********************************\r
+ ******************************************************************************/\r
+\r
+\r
+void MPU_ConfigureRegion(const MPU_RegionInit_TypeDef *init);\r
+\r
+\r
+/***************************************************************************//**\r
+ * @brief\r
+ *   Disable the MPU\r
+ * @details\r
+ *   Disable MPU and MPU fault exceptions.\r
+ ******************************************************************************/\r
+__STATIC_INLINE void MPU_Disable(void)\r
+{\r
+  SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;      /* Disable fault exceptions */\r
+  MPU->CTRL  &= ~MPU_CTRL_ENABLE_Msk;            /* Disable the MPU */\r
+}\r
+\r
+\r
+/***************************************************************************//**\r
+ * @brief\r
+ *   Enable the MPU\r
+ * @details\r
+ *   Enable MPU and MPU fault exceptions.\r
+ * @param[in] flags\r
+ *   Use a logical OR of @ref MPU_CTRL_PRIVDEFENA and\r
+ *   @ref MPU_CTRL_HFNMIENA as needed.\r
+ ******************************************************************************/\r
+__STATIC_INLINE void MPU_Enable(uint32_t flags)\r
+{\r
+  EFM_ASSERT(!(flags & ~(MPU_CTRL_PRIVDEFENA_Msk |\r
+                         MPU_CTRL_HFNMIENA_Msk |\r
+                         MPU_CTRL_ENABLE_Msk)));\r
+\r
+  MPU->CTRL   = flags | MPU_CTRL_ENABLE_Msk;     /* Enable the MPU */\r
+  SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;       /* Enable fault exceptions */\r
+}\r
+\r
+\r
+/** @} (end addtogroup MPU) */\r
+/** @} (end addtogroup EM_Library) */\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* defined(__MPU_PRESENT) && (__MPU_PRESENT == 1) */\r
+\r
+#endif /* __SILICON_LABS_EM_MPU_H_ */\r