mbed-dev library fork for STM32F100R6 microcontroller (LQFP64, 24MHz, 32kB flash, 4kB ram, 2-channel DAC, HDMI CEC, very cheap) . Use in online compiler (instead mbed library) with selected platform Nucleo F103RB.

Fork of mbed-dev by mbed official




Tested and working:

  • blink
  • system frequency 24Mhz (with external xtal 8Mhz)
  • stdio uart on pins PA_2-PA_3
  • Serial on pins PA_9-PA_10
  • AnalogOut on pins PA_4, PA_5 (DAC)
  • AnalogIn on pins PA_0, PA_1, PA_2, PA_3, PA_4, PA_5, PA_6, PA_7, PB_0, PB_1, PC_0, PC_1, PC_2, PC_3, PC_5, PC_5


    Notes:
  • TIM2 is used for mbed needs (eq Timer, Ticker, wait etc. )




    Simple test program:

    Import programtestF100R6

    simple tests for STM32F100R6 microcontroller with dedicated library

Committer:
mega64
Date:
Sun Mar 19 23:16:34 2017 +0000
Revision:
51:25d18ad142c8
Parent:
0:9b334a45a8ff
fixed incompatibility with the modified mbed environment Ch.n+1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 ;/**************************************************************************//**
bogdanm 0:9b334a45a8ff 2 ; * @file core_ca_mmu.h
bogdanm 0:9b334a45a8ff 3 ; * @brief MMU Startup File for A9_MP Device Series
bogdanm 0:9b334a45a8ff 4 ; * @version V1.01
bogdanm 0:9b334a45a8ff 5 ; * @date 10 Sept 2014
bogdanm 0:9b334a45a8ff 6 ; *
bogdanm 0:9b334a45a8ff 7 ; * @note
bogdanm 0:9b334a45a8ff 8 ; *
bogdanm 0:9b334a45a8ff 9 ; ******************************************************************************/
bogdanm 0:9b334a45a8ff 10 ;/* Copyright (c) 2012-2014 ARM LIMITED
bogdanm 0:9b334a45a8ff 11 ;
bogdanm 0:9b334a45a8ff 12 ; All rights reserved.
bogdanm 0:9b334a45a8ff 13 ; Redistribution and use in source and binary forms, with or without
bogdanm 0:9b334a45a8ff 14 ; modification, are permitted provided that the following conditions are met:
bogdanm 0:9b334a45a8ff 15 ; - Redistributions of source code must retain the above copyright
bogdanm 0:9b334a45a8ff 16 ; notice, this list of conditions and the following disclaimer.
bogdanm 0:9b334a45a8ff 17 ; - Redistributions in binary form must reproduce the above copyright
bogdanm 0:9b334a45a8ff 18 ; notice, this list of conditions and the following disclaimer in the
bogdanm 0:9b334a45a8ff 19 ; documentation and/or other materials provided with the distribution.
bogdanm 0:9b334a45a8ff 20 ; - Neither the name of ARM nor the names of its contributors may be used
bogdanm 0:9b334a45a8ff 21 ; to endorse or promote products derived from this software without
bogdanm 0:9b334a45a8ff 22 ; specific prior written permission.
bogdanm 0:9b334a45a8ff 23 ; *
bogdanm 0:9b334a45a8ff 24 ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
bogdanm 0:9b334a45a8ff 25 ; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bogdanm 0:9b334a45a8ff 26 ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
bogdanm 0:9b334a45a8ff 27 ; ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
bogdanm 0:9b334a45a8ff 28 ; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
bogdanm 0:9b334a45a8ff 29 ; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
bogdanm 0:9b334a45a8ff 30 ; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
bogdanm 0:9b334a45a8ff 31 ; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
bogdanm 0:9b334a45a8ff 32 ; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
bogdanm 0:9b334a45a8ff 33 ; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
bogdanm 0:9b334a45a8ff 34 ; POSSIBILITY OF SUCH DAMAGE.
bogdanm 0:9b334a45a8ff 35 ; ---------------------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 36
bogdanm 0:9b334a45a8ff 37 #ifdef __cplusplus
bogdanm 0:9b334a45a8ff 38 extern "C" {
bogdanm 0:9b334a45a8ff 39 #endif
bogdanm 0:9b334a45a8ff 40
bogdanm 0:9b334a45a8ff 41 #ifndef _MMU_FUNC_H
bogdanm 0:9b334a45a8ff 42 #define _MMU_FUNC_H
bogdanm 0:9b334a45a8ff 43
bogdanm 0:9b334a45a8ff 44 #define SECTION_DESCRIPTOR (0x2)
bogdanm 0:9b334a45a8ff 45 #define SECTION_MASK (0xFFFFFFFC)
bogdanm 0:9b334a45a8ff 46
bogdanm 0:9b334a45a8ff 47 #define SECTION_TEXCB_MASK (0xFFFF8FF3)
bogdanm 0:9b334a45a8ff 48 #define SECTION_B_SHIFT (2)
bogdanm 0:9b334a45a8ff 49 #define SECTION_C_SHIFT (3)
bogdanm 0:9b334a45a8ff 50 #define SECTION_TEX0_SHIFT (12)
bogdanm 0:9b334a45a8ff 51 #define SECTION_TEX1_SHIFT (13)
bogdanm 0:9b334a45a8ff 52 #define SECTION_TEX2_SHIFT (14)
bogdanm 0:9b334a45a8ff 53
bogdanm 0:9b334a45a8ff 54 #define SECTION_XN_MASK (0xFFFFFFEF)
bogdanm 0:9b334a45a8ff 55 #define SECTION_XN_SHIFT (4)
bogdanm 0:9b334a45a8ff 56
bogdanm 0:9b334a45a8ff 57 #define SECTION_DOMAIN_MASK (0xFFFFFE1F)
bogdanm 0:9b334a45a8ff 58 #define SECTION_DOMAIN_SHIFT (5)
bogdanm 0:9b334a45a8ff 59
bogdanm 0:9b334a45a8ff 60 #define SECTION_P_MASK (0xFFFFFDFF)
bogdanm 0:9b334a45a8ff 61 #define SECTION_P_SHIFT (9)
bogdanm 0:9b334a45a8ff 62
bogdanm 0:9b334a45a8ff 63 #define SECTION_AP_MASK (0xFFFF73FF)
bogdanm 0:9b334a45a8ff 64 #define SECTION_AP_SHIFT (10)
bogdanm 0:9b334a45a8ff 65 #define SECTION_AP2_SHIFT (15)
bogdanm 0:9b334a45a8ff 66
bogdanm 0:9b334a45a8ff 67 #define SECTION_S_MASK (0xFFFEFFFF)
bogdanm 0:9b334a45a8ff 68 #define SECTION_S_SHIFT (16)
bogdanm 0:9b334a45a8ff 69
bogdanm 0:9b334a45a8ff 70 #define SECTION_NG_MASK (0xFFFDFFFF)
bogdanm 0:9b334a45a8ff 71 #define SECTION_NG_SHIFT (17)
bogdanm 0:9b334a45a8ff 72
bogdanm 0:9b334a45a8ff 73 #define SECTION_NS_MASK (0xFFF7FFFF)
bogdanm 0:9b334a45a8ff 74 #define SECTION_NS_SHIFT (19)
bogdanm 0:9b334a45a8ff 75
bogdanm 0:9b334a45a8ff 76
bogdanm 0:9b334a45a8ff 77 #define PAGE_L1_DESCRIPTOR (0x1)
bogdanm 0:9b334a45a8ff 78 #define PAGE_L1_MASK (0xFFFFFFFC)
bogdanm 0:9b334a45a8ff 79
bogdanm 0:9b334a45a8ff 80 #define PAGE_L2_4K_DESC (0x2)
bogdanm 0:9b334a45a8ff 81 #define PAGE_L2_4K_MASK (0xFFFFFFFD)
bogdanm 0:9b334a45a8ff 82
bogdanm 0:9b334a45a8ff 83 #define PAGE_L2_64K_DESC (0x1)
bogdanm 0:9b334a45a8ff 84 #define PAGE_L2_64K_MASK (0xFFFFFFFC)
bogdanm 0:9b334a45a8ff 85
bogdanm 0:9b334a45a8ff 86 #define PAGE_4K_TEXCB_MASK (0xFFFFFE33)
bogdanm 0:9b334a45a8ff 87 #define PAGE_4K_B_SHIFT (2)
bogdanm 0:9b334a45a8ff 88 #define PAGE_4K_C_SHIFT (3)
bogdanm 0:9b334a45a8ff 89 #define PAGE_4K_TEX0_SHIFT (6)
bogdanm 0:9b334a45a8ff 90 #define PAGE_4K_TEX1_SHIFT (7)
bogdanm 0:9b334a45a8ff 91 #define PAGE_4K_TEX2_SHIFT (8)
bogdanm 0:9b334a45a8ff 92
bogdanm 0:9b334a45a8ff 93 #define PAGE_64K_TEXCB_MASK (0xFFFF8FF3)
bogdanm 0:9b334a45a8ff 94 #define PAGE_64K_B_SHIFT (2)
bogdanm 0:9b334a45a8ff 95 #define PAGE_64K_C_SHIFT (3)
bogdanm 0:9b334a45a8ff 96 #define PAGE_64K_TEX0_SHIFT (12)
bogdanm 0:9b334a45a8ff 97 #define PAGE_64K_TEX1_SHIFT (13)
bogdanm 0:9b334a45a8ff 98 #define PAGE_64K_TEX2_SHIFT (14)
bogdanm 0:9b334a45a8ff 99
bogdanm 0:9b334a45a8ff 100 #define PAGE_TEXCB_MASK (0xFFFF8FF3)
bogdanm 0:9b334a45a8ff 101 #define PAGE_B_SHIFT (2)
bogdanm 0:9b334a45a8ff 102 #define PAGE_C_SHIFT (3)
bogdanm 0:9b334a45a8ff 103 #define PAGE_TEX_SHIFT (12)
bogdanm 0:9b334a45a8ff 104
bogdanm 0:9b334a45a8ff 105 #define PAGE_XN_4K_MASK (0xFFFFFFFE)
bogdanm 0:9b334a45a8ff 106 #define PAGE_XN_4K_SHIFT (0)
bogdanm 0:9b334a45a8ff 107 #define PAGE_XN_64K_MASK (0xFFFF7FFF)
bogdanm 0:9b334a45a8ff 108 #define PAGE_XN_64K_SHIFT (15)
bogdanm 0:9b334a45a8ff 109
bogdanm 0:9b334a45a8ff 110
bogdanm 0:9b334a45a8ff 111 #define PAGE_DOMAIN_MASK (0xFFFFFE1F)
bogdanm 0:9b334a45a8ff 112 #define PAGE_DOMAIN_SHIFT (5)
bogdanm 0:9b334a45a8ff 113
bogdanm 0:9b334a45a8ff 114 #define PAGE_P_MASK (0xFFFFFDFF)
bogdanm 0:9b334a45a8ff 115 #define PAGE_P_SHIFT (9)
bogdanm 0:9b334a45a8ff 116
bogdanm 0:9b334a45a8ff 117 #define PAGE_AP_MASK (0xFFFFFDCF)
bogdanm 0:9b334a45a8ff 118 #define PAGE_AP_SHIFT (4)
bogdanm 0:9b334a45a8ff 119 #define PAGE_AP2_SHIFT (9)
bogdanm 0:9b334a45a8ff 120
bogdanm 0:9b334a45a8ff 121 #define PAGE_S_MASK (0xFFFFFBFF)
bogdanm 0:9b334a45a8ff 122 #define PAGE_S_SHIFT (10)
bogdanm 0:9b334a45a8ff 123
bogdanm 0:9b334a45a8ff 124 #define PAGE_NG_MASK (0xFFFFF7FF)
bogdanm 0:9b334a45a8ff 125 #define PAGE_NG_SHIFT (11)
bogdanm 0:9b334a45a8ff 126
bogdanm 0:9b334a45a8ff 127 #define PAGE_NS_MASK (0xFFFFFFF7)
bogdanm 0:9b334a45a8ff 128 #define PAGE_NS_SHIFT (3)
bogdanm 0:9b334a45a8ff 129
bogdanm 0:9b334a45a8ff 130 #define OFFSET_1M (0x00100000)
bogdanm 0:9b334a45a8ff 131 #define OFFSET_64K (0x00010000)
bogdanm 0:9b334a45a8ff 132 #define OFFSET_4K (0x00001000)
bogdanm 0:9b334a45a8ff 133
bogdanm 0:9b334a45a8ff 134 #define DESCRIPTOR_FAULT (0x00000000)
bogdanm 0:9b334a45a8ff 135
bogdanm 0:9b334a45a8ff 136 /* ########################### MMU Function Access ########################### */
bogdanm 0:9b334a45a8ff 137 /** \ingroup MMU_FunctionInterface
bogdanm 0:9b334a45a8ff 138 \defgroup MMU_Functions MMU Functions Interface
bogdanm 0:9b334a45a8ff 139 @{
bogdanm 0:9b334a45a8ff 140 */
bogdanm 0:9b334a45a8ff 141
bogdanm 0:9b334a45a8ff 142 /* Attributes enumerations */
bogdanm 0:9b334a45a8ff 143
bogdanm 0:9b334a45a8ff 144 /* Region size attributes */
bogdanm 0:9b334a45a8ff 145 typedef enum
bogdanm 0:9b334a45a8ff 146 {
bogdanm 0:9b334a45a8ff 147 SECTION,
bogdanm 0:9b334a45a8ff 148 PAGE_4k,
bogdanm 0:9b334a45a8ff 149 PAGE_64k,
bogdanm 0:9b334a45a8ff 150 } mmu_region_size_Type;
bogdanm 0:9b334a45a8ff 151
bogdanm 0:9b334a45a8ff 152 /* Region type attributes */
bogdanm 0:9b334a45a8ff 153 typedef enum
bogdanm 0:9b334a45a8ff 154 {
bogdanm 0:9b334a45a8ff 155 NORMAL,
bogdanm 0:9b334a45a8ff 156 DEVICE,
bogdanm 0:9b334a45a8ff 157 SHARED_DEVICE,
bogdanm 0:9b334a45a8ff 158 NON_SHARED_DEVICE,
bogdanm 0:9b334a45a8ff 159 STRONGLY_ORDERED
bogdanm 0:9b334a45a8ff 160 } mmu_memory_Type;
bogdanm 0:9b334a45a8ff 161
bogdanm 0:9b334a45a8ff 162 /* Region cacheability attributes */
bogdanm 0:9b334a45a8ff 163 typedef enum
bogdanm 0:9b334a45a8ff 164 {
bogdanm 0:9b334a45a8ff 165 NON_CACHEABLE,
bogdanm 0:9b334a45a8ff 166 WB_WA,
bogdanm 0:9b334a45a8ff 167 WT,
bogdanm 0:9b334a45a8ff 168 WB_NO_WA,
bogdanm 0:9b334a45a8ff 169 } mmu_cacheability_Type;
bogdanm 0:9b334a45a8ff 170
bogdanm 0:9b334a45a8ff 171 /* Region parity check attributes */
bogdanm 0:9b334a45a8ff 172 typedef enum
bogdanm 0:9b334a45a8ff 173 {
bogdanm 0:9b334a45a8ff 174 ECC_DISABLED,
bogdanm 0:9b334a45a8ff 175 ECC_ENABLED,
bogdanm 0:9b334a45a8ff 176 } mmu_ecc_check_Type;
bogdanm 0:9b334a45a8ff 177
bogdanm 0:9b334a45a8ff 178 /* Region execution attributes */
bogdanm 0:9b334a45a8ff 179 typedef enum
bogdanm 0:9b334a45a8ff 180 {
bogdanm 0:9b334a45a8ff 181 EXECUTE,
bogdanm 0:9b334a45a8ff 182 NON_EXECUTE,
bogdanm 0:9b334a45a8ff 183 } mmu_execute_Type;
bogdanm 0:9b334a45a8ff 184
bogdanm 0:9b334a45a8ff 185 /* Region global attributes */
bogdanm 0:9b334a45a8ff 186 typedef enum
bogdanm 0:9b334a45a8ff 187 {
bogdanm 0:9b334a45a8ff 188 GLOBAL,
bogdanm 0:9b334a45a8ff 189 NON_GLOBAL,
bogdanm 0:9b334a45a8ff 190 } mmu_global_Type;
bogdanm 0:9b334a45a8ff 191
bogdanm 0:9b334a45a8ff 192 /* Region shareability attributes */
bogdanm 0:9b334a45a8ff 193 typedef enum
bogdanm 0:9b334a45a8ff 194 {
bogdanm 0:9b334a45a8ff 195 NON_SHARED,
bogdanm 0:9b334a45a8ff 196 SHARED,
bogdanm 0:9b334a45a8ff 197 } mmu_shared_Type;
bogdanm 0:9b334a45a8ff 198
bogdanm 0:9b334a45a8ff 199 /* Region security attributes */
bogdanm 0:9b334a45a8ff 200 typedef enum
bogdanm 0:9b334a45a8ff 201 {
bogdanm 0:9b334a45a8ff 202 SECURE,
bogdanm 0:9b334a45a8ff 203 NON_SECURE,
bogdanm 0:9b334a45a8ff 204 } mmu_secure_Type;
bogdanm 0:9b334a45a8ff 205
bogdanm 0:9b334a45a8ff 206 /* Region access attributes */
bogdanm 0:9b334a45a8ff 207 typedef enum
bogdanm 0:9b334a45a8ff 208 {
bogdanm 0:9b334a45a8ff 209 NO_ACCESS,
bogdanm 0:9b334a45a8ff 210 RW,
bogdanm 0:9b334a45a8ff 211 READ,
bogdanm 0:9b334a45a8ff 212 } mmu_access_Type;
bogdanm 0:9b334a45a8ff 213
bogdanm 0:9b334a45a8ff 214 /* Memory Region definition */
bogdanm 0:9b334a45a8ff 215 typedef struct RegionStruct {
bogdanm 0:9b334a45a8ff 216 mmu_region_size_Type rg_t;
bogdanm 0:9b334a45a8ff 217 mmu_memory_Type mem_t;
bogdanm 0:9b334a45a8ff 218 uint8_t domain;
bogdanm 0:9b334a45a8ff 219 mmu_cacheability_Type inner_norm_t;
bogdanm 0:9b334a45a8ff 220 mmu_cacheability_Type outer_norm_t;
bogdanm 0:9b334a45a8ff 221 mmu_ecc_check_Type e_t;
bogdanm 0:9b334a45a8ff 222 mmu_execute_Type xn_t;
bogdanm 0:9b334a45a8ff 223 mmu_global_Type g_t;
bogdanm 0:9b334a45a8ff 224 mmu_secure_Type sec_t;
bogdanm 0:9b334a45a8ff 225 mmu_access_Type priv_t;
bogdanm 0:9b334a45a8ff 226 mmu_access_Type user_t;
bogdanm 0:9b334a45a8ff 227 mmu_shared_Type sh_t;
bogdanm 0:9b334a45a8ff 228
bogdanm 0:9b334a45a8ff 229 } mmu_region_attributes_Type;
bogdanm 0:9b334a45a8ff 230
bogdanm 0:9b334a45a8ff 231 /** \brief Set section execution-never attribute
bogdanm 0:9b334a45a8ff 232
bogdanm 0:9b334a45a8ff 233 The function sets section execution-never attribute
bogdanm 0:9b334a45a8ff 234
bogdanm 0:9b334a45a8ff 235 \param [out] descriptor_l1 L1 descriptor.
bogdanm 0:9b334a45a8ff 236 \param [in] xn Section execution-never attribute : EXECUTE , NON_EXECUTE.
bogdanm 0:9b334a45a8ff 237
bogdanm 0:9b334a45a8ff 238 \return 0
bogdanm 0:9b334a45a8ff 239 */
bogdanm 0:9b334a45a8ff 240 __STATIC_INLINE int __xn_section(uint32_t *descriptor_l1, mmu_execute_Type xn)
bogdanm 0:9b334a45a8ff 241 {
bogdanm 0:9b334a45a8ff 242 *descriptor_l1 &= SECTION_XN_MASK;
bogdanm 0:9b334a45a8ff 243 *descriptor_l1 |= ((xn & 0x1) << SECTION_XN_SHIFT);
bogdanm 0:9b334a45a8ff 244 return 0;
bogdanm 0:9b334a45a8ff 245 }
bogdanm 0:9b334a45a8ff 246
bogdanm 0:9b334a45a8ff 247 /** \brief Set section domain
bogdanm 0:9b334a45a8ff 248
bogdanm 0:9b334a45a8ff 249 The function sets section domain
bogdanm 0:9b334a45a8ff 250
bogdanm 0:9b334a45a8ff 251 \param [out] descriptor_l1 L1 descriptor.
bogdanm 0:9b334a45a8ff 252 \param [in] domain Section domain
bogdanm 0:9b334a45a8ff 253
bogdanm 0:9b334a45a8ff 254 \return 0
bogdanm 0:9b334a45a8ff 255 */
bogdanm 0:9b334a45a8ff 256 __STATIC_INLINE int __domain_section(uint32_t *descriptor_l1, uint8_t domain)
bogdanm 0:9b334a45a8ff 257 {
bogdanm 0:9b334a45a8ff 258 *descriptor_l1 &= SECTION_DOMAIN_MASK;
bogdanm 0:9b334a45a8ff 259 *descriptor_l1 |= ((domain & 0xF) << SECTION_DOMAIN_SHIFT);
bogdanm 0:9b334a45a8ff 260 return 0;
bogdanm 0:9b334a45a8ff 261 }
bogdanm 0:9b334a45a8ff 262
bogdanm 0:9b334a45a8ff 263 /** \brief Set section parity check
bogdanm 0:9b334a45a8ff 264
bogdanm 0:9b334a45a8ff 265 The function sets section parity check
bogdanm 0:9b334a45a8ff 266
bogdanm 0:9b334a45a8ff 267 \param [out] descriptor_l1 L1 descriptor.
bogdanm 0:9b334a45a8ff 268 \param [in] p_bit Parity check: ECC_DISABLED, ECC_ENABLED
bogdanm 0:9b334a45a8ff 269
bogdanm 0:9b334a45a8ff 270 \return 0
bogdanm 0:9b334a45a8ff 271 */
bogdanm 0:9b334a45a8ff 272 __STATIC_INLINE int __p_section(uint32_t *descriptor_l1, mmu_ecc_check_Type p_bit)
bogdanm 0:9b334a45a8ff 273 {
bogdanm 0:9b334a45a8ff 274 *descriptor_l1 &= SECTION_P_MASK;
bogdanm 0:9b334a45a8ff 275 *descriptor_l1 |= ((p_bit & 0x1) << SECTION_P_SHIFT);
bogdanm 0:9b334a45a8ff 276 return 0;
bogdanm 0:9b334a45a8ff 277 }
bogdanm 0:9b334a45a8ff 278
bogdanm 0:9b334a45a8ff 279 /** \brief Set section access privileges
bogdanm 0:9b334a45a8ff 280
bogdanm 0:9b334a45a8ff 281 The function sets section access privileges
bogdanm 0:9b334a45a8ff 282
bogdanm 0:9b334a45a8ff 283 \param [out] descriptor_l1 L1 descriptor.
bogdanm 0:9b334a45a8ff 284 \param [in] user User Level Access: NO_ACCESS, RW, READ
bogdanm 0:9b334a45a8ff 285 \param [in] priv Privilege Level Access: NO_ACCESS, RW, READ
bogdanm 0:9b334a45a8ff 286 \param [in] afe Access flag enable
bogdanm 0:9b334a45a8ff 287
bogdanm 0:9b334a45a8ff 288 \return 0
bogdanm 0:9b334a45a8ff 289 */
bogdanm 0:9b334a45a8ff 290 __STATIC_INLINE int __ap_section(uint32_t *descriptor_l1, mmu_access_Type user, mmu_access_Type priv, uint32_t afe)
bogdanm 0:9b334a45a8ff 291 {
bogdanm 0:9b334a45a8ff 292 uint32_t ap = 0;
bogdanm 0:9b334a45a8ff 293
bogdanm 0:9b334a45a8ff 294 if (afe == 0) { //full access
bogdanm 0:9b334a45a8ff 295 if ((priv == NO_ACCESS) && (user == NO_ACCESS)) { ap = 0x0; }
bogdanm 0:9b334a45a8ff 296 else if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; }
bogdanm 0:9b334a45a8ff 297 else if ((priv == RW) && (user == READ)) { ap = 0x2; }
bogdanm 0:9b334a45a8ff 298 else if ((priv == RW) && (user == RW)) { ap = 0x3; }
bogdanm 0:9b334a45a8ff 299 else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; }
bogdanm 0:9b334a45a8ff 300 else if ((priv == READ) && (user == READ)) { ap = 0x7; }
bogdanm 0:9b334a45a8ff 301 }
bogdanm 0:9b334a45a8ff 302
bogdanm 0:9b334a45a8ff 303 else { //Simplified access
bogdanm 0:9b334a45a8ff 304 if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; }
bogdanm 0:9b334a45a8ff 305 else if ((priv == RW) && (user == RW)) { ap = 0x3; }
bogdanm 0:9b334a45a8ff 306 else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; }
bogdanm 0:9b334a45a8ff 307 else if ((priv == READ) && (user == READ)) { ap = 0x7; }
bogdanm 0:9b334a45a8ff 308 }
bogdanm 0:9b334a45a8ff 309
bogdanm 0:9b334a45a8ff 310 *descriptor_l1 &= SECTION_AP_MASK;
bogdanm 0:9b334a45a8ff 311 *descriptor_l1 |= (ap & 0x3) << SECTION_AP_SHIFT;
bogdanm 0:9b334a45a8ff 312 *descriptor_l1 |= ((ap & 0x4)>>2) << SECTION_AP2_SHIFT;
bogdanm 0:9b334a45a8ff 313
bogdanm 0:9b334a45a8ff 314 return 0;
bogdanm 0:9b334a45a8ff 315 }
bogdanm 0:9b334a45a8ff 316
bogdanm 0:9b334a45a8ff 317 /** \brief Set section shareability
bogdanm 0:9b334a45a8ff 318
bogdanm 0:9b334a45a8ff 319 The function sets section shareability
bogdanm 0:9b334a45a8ff 320
bogdanm 0:9b334a45a8ff 321 \param [out] descriptor_l1 L1 descriptor.
bogdanm 0:9b334a45a8ff 322 \param [in] s_bit Section shareability: NON_SHARED, SHARED
bogdanm 0:9b334a45a8ff 323
bogdanm 0:9b334a45a8ff 324 \return 0
bogdanm 0:9b334a45a8ff 325 */
bogdanm 0:9b334a45a8ff 326 __STATIC_INLINE int __shared_section(uint32_t *descriptor_l1, mmu_shared_Type s_bit)
bogdanm 0:9b334a45a8ff 327 {
bogdanm 0:9b334a45a8ff 328 *descriptor_l1 &= SECTION_S_MASK;
bogdanm 0:9b334a45a8ff 329 *descriptor_l1 |= ((s_bit & 0x1) << SECTION_S_SHIFT);
bogdanm 0:9b334a45a8ff 330 return 0;
bogdanm 0:9b334a45a8ff 331 }
bogdanm 0:9b334a45a8ff 332
bogdanm 0:9b334a45a8ff 333 /** \brief Set section Global attribute
bogdanm 0:9b334a45a8ff 334
bogdanm 0:9b334a45a8ff 335 The function sets section Global attribute
bogdanm 0:9b334a45a8ff 336
bogdanm 0:9b334a45a8ff 337 \param [out] descriptor_l1 L1 descriptor.
bogdanm 0:9b334a45a8ff 338 \param [in] g_bit Section attribute: GLOBAL, NON_GLOBAL
bogdanm 0:9b334a45a8ff 339
bogdanm 0:9b334a45a8ff 340 \return 0
bogdanm 0:9b334a45a8ff 341 */
bogdanm 0:9b334a45a8ff 342 __STATIC_INLINE int __global_section(uint32_t *descriptor_l1, mmu_global_Type g_bit)
bogdanm 0:9b334a45a8ff 343 {
bogdanm 0:9b334a45a8ff 344 *descriptor_l1 &= SECTION_NG_MASK;
bogdanm 0:9b334a45a8ff 345 *descriptor_l1 |= ((g_bit & 0x1) << SECTION_NG_SHIFT);
bogdanm 0:9b334a45a8ff 346 return 0;
bogdanm 0:9b334a45a8ff 347 }
bogdanm 0:9b334a45a8ff 348
bogdanm 0:9b334a45a8ff 349 /** \brief Set section Security attribute
bogdanm 0:9b334a45a8ff 350
bogdanm 0:9b334a45a8ff 351 The function sets section Global attribute
bogdanm 0:9b334a45a8ff 352
bogdanm 0:9b334a45a8ff 353 \param [out] descriptor_l1 L1 descriptor.
bogdanm 0:9b334a45a8ff 354 \param [in] s_bit Section Security attribute: SECURE, NON_SECURE
bogdanm 0:9b334a45a8ff 355
bogdanm 0:9b334a45a8ff 356 \return 0
bogdanm 0:9b334a45a8ff 357 */
bogdanm 0:9b334a45a8ff 358 __STATIC_INLINE int __secure_section(uint32_t *descriptor_l1, mmu_secure_Type s_bit)
bogdanm 0:9b334a45a8ff 359 {
bogdanm 0:9b334a45a8ff 360 *descriptor_l1 &= SECTION_NS_MASK;
bogdanm 0:9b334a45a8ff 361 *descriptor_l1 |= ((s_bit & 0x1) << SECTION_NS_SHIFT);
bogdanm 0:9b334a45a8ff 362 return 0;
bogdanm 0:9b334a45a8ff 363 }
bogdanm 0:9b334a45a8ff 364
bogdanm 0:9b334a45a8ff 365 /* Page 4k or 64k */
bogdanm 0:9b334a45a8ff 366 /** \brief Set 4k/64k page execution-never attribute
bogdanm 0:9b334a45a8ff 367
bogdanm 0:9b334a45a8ff 368 The function sets 4k/64k page execution-never attribute
bogdanm 0:9b334a45a8ff 369
bogdanm 0:9b334a45a8ff 370 \param [out] descriptor_l2 L2 descriptor.
bogdanm 0:9b334a45a8ff 371 \param [in] xn Page execution-never attribute : EXECUTE , NON_EXECUTE.
bogdanm 0:9b334a45a8ff 372 \param [in] page Page size: PAGE_4k, PAGE_64k,
bogdanm 0:9b334a45a8ff 373
bogdanm 0:9b334a45a8ff 374 \return 0
bogdanm 0:9b334a45a8ff 375 */
bogdanm 0:9b334a45a8ff 376 __STATIC_INLINE int __xn_page(uint32_t *descriptor_l2, mmu_execute_Type xn, mmu_region_size_Type page)
bogdanm 0:9b334a45a8ff 377 {
bogdanm 0:9b334a45a8ff 378 if (page == PAGE_4k)
bogdanm 0:9b334a45a8ff 379 {
bogdanm 0:9b334a45a8ff 380 *descriptor_l2 &= PAGE_XN_4K_MASK;
bogdanm 0:9b334a45a8ff 381 *descriptor_l2 |= ((xn & 0x1) << PAGE_XN_4K_SHIFT);
bogdanm 0:9b334a45a8ff 382 }
bogdanm 0:9b334a45a8ff 383 else
bogdanm 0:9b334a45a8ff 384 {
bogdanm 0:9b334a45a8ff 385 *descriptor_l2 &= PAGE_XN_64K_MASK;
bogdanm 0:9b334a45a8ff 386 *descriptor_l2 |= ((xn & 0x1) << PAGE_XN_64K_SHIFT);
bogdanm 0:9b334a45a8ff 387 }
bogdanm 0:9b334a45a8ff 388 return 0;
bogdanm 0:9b334a45a8ff 389 }
bogdanm 0:9b334a45a8ff 390
bogdanm 0:9b334a45a8ff 391 /** \brief Set 4k/64k page domain
bogdanm 0:9b334a45a8ff 392
bogdanm 0:9b334a45a8ff 393 The function sets 4k/64k page domain
bogdanm 0:9b334a45a8ff 394
bogdanm 0:9b334a45a8ff 395 \param [out] descriptor_l1 L1 descriptor.
bogdanm 0:9b334a45a8ff 396 \param [in] domain Page domain
bogdanm 0:9b334a45a8ff 397
bogdanm 0:9b334a45a8ff 398 \return 0
bogdanm 0:9b334a45a8ff 399 */
bogdanm 0:9b334a45a8ff 400 __STATIC_INLINE int __domain_page(uint32_t *descriptor_l1, uint8_t domain)
bogdanm 0:9b334a45a8ff 401 {
bogdanm 0:9b334a45a8ff 402 *descriptor_l1 &= PAGE_DOMAIN_MASK;
bogdanm 0:9b334a45a8ff 403 *descriptor_l1 |= ((domain & 0xf) << PAGE_DOMAIN_SHIFT);
bogdanm 0:9b334a45a8ff 404 return 0;
bogdanm 0:9b334a45a8ff 405 }
bogdanm 0:9b334a45a8ff 406
bogdanm 0:9b334a45a8ff 407 /** \brief Set 4k/64k page parity check
bogdanm 0:9b334a45a8ff 408
bogdanm 0:9b334a45a8ff 409 The function sets 4k/64k page parity check
bogdanm 0:9b334a45a8ff 410
bogdanm 0:9b334a45a8ff 411 \param [out] descriptor_l1 L1 descriptor.
bogdanm 0:9b334a45a8ff 412 \param [in] p_bit Parity check: ECC_DISABLED, ECC_ENABLED
bogdanm 0:9b334a45a8ff 413
bogdanm 0:9b334a45a8ff 414 \return 0
bogdanm 0:9b334a45a8ff 415 */
bogdanm 0:9b334a45a8ff 416 __STATIC_INLINE int __p_page(uint32_t *descriptor_l1, mmu_ecc_check_Type p_bit)
bogdanm 0:9b334a45a8ff 417 {
bogdanm 0:9b334a45a8ff 418 *descriptor_l1 &= SECTION_P_MASK;
bogdanm 0:9b334a45a8ff 419 *descriptor_l1 |= ((p_bit & 0x1) << SECTION_P_SHIFT);
bogdanm 0:9b334a45a8ff 420 return 0;
bogdanm 0:9b334a45a8ff 421 }
bogdanm 0:9b334a45a8ff 422
bogdanm 0:9b334a45a8ff 423 /** \brief Set 4k/64k page access privileges
bogdanm 0:9b334a45a8ff 424
bogdanm 0:9b334a45a8ff 425 The function sets 4k/64k page access privileges
bogdanm 0:9b334a45a8ff 426
bogdanm 0:9b334a45a8ff 427 \param [out] descriptor_l2 L2 descriptor.
bogdanm 0:9b334a45a8ff 428 \param [in] user User Level Access: NO_ACCESS, RW, READ
bogdanm 0:9b334a45a8ff 429 \param [in] priv Privilege Level Access: NO_ACCESS, RW, READ
bogdanm 0:9b334a45a8ff 430 \param [in] afe Access flag enable
bogdanm 0:9b334a45a8ff 431
bogdanm 0:9b334a45a8ff 432 \return 0
bogdanm 0:9b334a45a8ff 433 */
bogdanm 0:9b334a45a8ff 434 __STATIC_INLINE int __ap_page(uint32_t *descriptor_l2, mmu_access_Type user, mmu_access_Type priv, uint32_t afe)
bogdanm 0:9b334a45a8ff 435 {
bogdanm 0:9b334a45a8ff 436 uint32_t ap = 0;
bogdanm 0:9b334a45a8ff 437
bogdanm 0:9b334a45a8ff 438 if (afe == 0) { //full access
bogdanm 0:9b334a45a8ff 439 if ((priv == NO_ACCESS) && (user == NO_ACCESS)) { ap = 0x0; }
bogdanm 0:9b334a45a8ff 440 else if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; }
bogdanm 0:9b334a45a8ff 441 else if ((priv == RW) && (user == READ)) { ap = 0x2; }
bogdanm 0:9b334a45a8ff 442 else if ((priv == RW) && (user == RW)) { ap = 0x3; }
bogdanm 0:9b334a45a8ff 443 else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; }
bogdanm 0:9b334a45a8ff 444 else if ((priv == READ) && (user == READ)) { ap = 0x6; }
bogdanm 0:9b334a45a8ff 445 }
bogdanm 0:9b334a45a8ff 446
bogdanm 0:9b334a45a8ff 447 else { //Simplified access
bogdanm 0:9b334a45a8ff 448 if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; }
bogdanm 0:9b334a45a8ff 449 else if ((priv == RW) && (user == RW)) { ap = 0x3; }
bogdanm 0:9b334a45a8ff 450 else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; }
bogdanm 0:9b334a45a8ff 451 else if ((priv == READ) && (user == READ)) { ap = 0x7; }
bogdanm 0:9b334a45a8ff 452 }
bogdanm 0:9b334a45a8ff 453
bogdanm 0:9b334a45a8ff 454 *descriptor_l2 &= PAGE_AP_MASK;
bogdanm 0:9b334a45a8ff 455 *descriptor_l2 |= (ap & 0x3) << PAGE_AP_SHIFT;
bogdanm 0:9b334a45a8ff 456 *descriptor_l2 |= ((ap & 0x4)>>2) << PAGE_AP2_SHIFT;
bogdanm 0:9b334a45a8ff 457
bogdanm 0:9b334a45a8ff 458 return 0;
bogdanm 0:9b334a45a8ff 459 }
bogdanm 0:9b334a45a8ff 460
bogdanm 0:9b334a45a8ff 461 /** \brief Set 4k/64k page shareability
bogdanm 0:9b334a45a8ff 462
bogdanm 0:9b334a45a8ff 463 The function sets 4k/64k page shareability
bogdanm 0:9b334a45a8ff 464
bogdanm 0:9b334a45a8ff 465 \param [out] descriptor_l2 L2 descriptor.
bogdanm 0:9b334a45a8ff 466 \param [in] s_bit 4k/64k page shareability: NON_SHARED, SHARED
bogdanm 0:9b334a45a8ff 467
bogdanm 0:9b334a45a8ff 468 \return 0
bogdanm 0:9b334a45a8ff 469 */
bogdanm 0:9b334a45a8ff 470 __STATIC_INLINE int __shared_page(uint32_t *descriptor_l2, mmu_shared_Type s_bit)
bogdanm 0:9b334a45a8ff 471 {
bogdanm 0:9b334a45a8ff 472 *descriptor_l2 &= PAGE_S_MASK;
bogdanm 0:9b334a45a8ff 473 *descriptor_l2 |= ((s_bit & 0x1) << PAGE_S_SHIFT);
bogdanm 0:9b334a45a8ff 474 return 0;
bogdanm 0:9b334a45a8ff 475 }
bogdanm 0:9b334a45a8ff 476
bogdanm 0:9b334a45a8ff 477 /** \brief Set 4k/64k page Global attribute
bogdanm 0:9b334a45a8ff 478
bogdanm 0:9b334a45a8ff 479 The function sets 4k/64k page Global attribute
bogdanm 0:9b334a45a8ff 480
bogdanm 0:9b334a45a8ff 481 \param [out] descriptor_l2 L2 descriptor.
bogdanm 0:9b334a45a8ff 482 \param [in] g_bit 4k/64k page attribute: GLOBAL, NON_GLOBAL
bogdanm 0:9b334a45a8ff 483
bogdanm 0:9b334a45a8ff 484 \return 0
bogdanm 0:9b334a45a8ff 485 */
bogdanm 0:9b334a45a8ff 486 __STATIC_INLINE int __global_page(uint32_t *descriptor_l2, mmu_global_Type g_bit)
bogdanm 0:9b334a45a8ff 487 {
bogdanm 0:9b334a45a8ff 488 *descriptor_l2 &= PAGE_NG_MASK;
bogdanm 0:9b334a45a8ff 489 *descriptor_l2 |= ((g_bit & 0x1) << PAGE_NG_SHIFT);
bogdanm 0:9b334a45a8ff 490 return 0;
bogdanm 0:9b334a45a8ff 491 }
bogdanm 0:9b334a45a8ff 492
bogdanm 0:9b334a45a8ff 493 /** \brief Set 4k/64k page Security attribute
bogdanm 0:9b334a45a8ff 494
bogdanm 0:9b334a45a8ff 495 The function sets 4k/64k page Global attribute
bogdanm 0:9b334a45a8ff 496
bogdanm 0:9b334a45a8ff 497 \param [out] descriptor_l1 L1 descriptor.
bogdanm 0:9b334a45a8ff 498 \param [in] s_bit 4k/64k page Security attribute: SECURE, NON_SECURE
bogdanm 0:9b334a45a8ff 499
bogdanm 0:9b334a45a8ff 500 \return 0
bogdanm 0:9b334a45a8ff 501 */
bogdanm 0:9b334a45a8ff 502 __STATIC_INLINE int __secure_page(uint32_t *descriptor_l1, mmu_secure_Type s_bit)
bogdanm 0:9b334a45a8ff 503 {
bogdanm 0:9b334a45a8ff 504 *descriptor_l1 &= PAGE_NS_MASK;
bogdanm 0:9b334a45a8ff 505 *descriptor_l1 |= ((s_bit & 0x1) << PAGE_NS_SHIFT);
bogdanm 0:9b334a45a8ff 506 return 0;
bogdanm 0:9b334a45a8ff 507 }
bogdanm 0:9b334a45a8ff 508
bogdanm 0:9b334a45a8ff 509
bogdanm 0:9b334a45a8ff 510 /** \brief Set Section memory attributes
bogdanm 0:9b334a45a8ff 511
bogdanm 0:9b334a45a8ff 512 The function sets section memory attributes
bogdanm 0:9b334a45a8ff 513
bogdanm 0:9b334a45a8ff 514 \param [out] descriptor_l1 L1 descriptor.
bogdanm 0:9b334a45a8ff 515 \param [in] mem Section memory type: NORMAL, DEVICE, SHARED_DEVICE, NON_SHARED_DEVICE, STRONGLY_ORDERED
bogdanm 0:9b334a45a8ff 516 \param [in] outer Outer cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA,
bogdanm 0:9b334a45a8ff 517 \param [in] inner Inner cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA,
bogdanm 0:9b334a45a8ff 518
bogdanm 0:9b334a45a8ff 519 \return 0
bogdanm 0:9b334a45a8ff 520 */
bogdanm 0:9b334a45a8ff 521 __STATIC_INLINE int __memory_section(uint32_t *descriptor_l1, mmu_memory_Type mem, mmu_cacheability_Type outer, mmu_cacheability_Type inner)
bogdanm 0:9b334a45a8ff 522 {
bogdanm 0:9b334a45a8ff 523 *descriptor_l1 &= SECTION_TEXCB_MASK;
bogdanm 0:9b334a45a8ff 524
bogdanm 0:9b334a45a8ff 525 if (STRONGLY_ORDERED == mem)
bogdanm 0:9b334a45a8ff 526 {
bogdanm 0:9b334a45a8ff 527 return 0;
bogdanm 0:9b334a45a8ff 528 }
bogdanm 0:9b334a45a8ff 529 else if (SHARED_DEVICE == mem)
bogdanm 0:9b334a45a8ff 530 {
bogdanm 0:9b334a45a8ff 531 *descriptor_l1 |= (1 << SECTION_B_SHIFT);
bogdanm 0:9b334a45a8ff 532 }
bogdanm 0:9b334a45a8ff 533 else if (NON_SHARED_DEVICE == mem)
bogdanm 0:9b334a45a8ff 534 {
bogdanm 0:9b334a45a8ff 535 *descriptor_l1 |= (1 << SECTION_TEX1_SHIFT);
bogdanm 0:9b334a45a8ff 536 }
bogdanm 0:9b334a45a8ff 537 else if (NORMAL == mem)
bogdanm 0:9b334a45a8ff 538 {
bogdanm 0:9b334a45a8ff 539 *descriptor_l1 |= 1 << SECTION_TEX2_SHIFT;
bogdanm 0:9b334a45a8ff 540 switch(inner)
bogdanm 0:9b334a45a8ff 541 {
bogdanm 0:9b334a45a8ff 542 case NON_CACHEABLE:
bogdanm 0:9b334a45a8ff 543 break;
bogdanm 0:9b334a45a8ff 544 case WB_WA:
bogdanm 0:9b334a45a8ff 545 *descriptor_l1 |= (1 << SECTION_B_SHIFT);
bogdanm 0:9b334a45a8ff 546 break;
bogdanm 0:9b334a45a8ff 547 case WT:
bogdanm 0:9b334a45a8ff 548 *descriptor_l1 |= 1 << SECTION_C_SHIFT;
bogdanm 0:9b334a45a8ff 549 break;
bogdanm 0:9b334a45a8ff 550 case WB_NO_WA:
bogdanm 0:9b334a45a8ff 551 *descriptor_l1 |= (1 << SECTION_B_SHIFT) | (1 << SECTION_C_SHIFT);
bogdanm 0:9b334a45a8ff 552 break;
bogdanm 0:9b334a45a8ff 553 }
bogdanm 0:9b334a45a8ff 554 switch(outer)
bogdanm 0:9b334a45a8ff 555 {
bogdanm 0:9b334a45a8ff 556 case NON_CACHEABLE:
bogdanm 0:9b334a45a8ff 557 break;
bogdanm 0:9b334a45a8ff 558 case WB_WA:
bogdanm 0:9b334a45a8ff 559 *descriptor_l1 |= (1 << SECTION_TEX0_SHIFT);
bogdanm 0:9b334a45a8ff 560 break;
bogdanm 0:9b334a45a8ff 561 case WT:
bogdanm 0:9b334a45a8ff 562 *descriptor_l1 |= 1 << SECTION_TEX1_SHIFT;
bogdanm 0:9b334a45a8ff 563 break;
bogdanm 0:9b334a45a8ff 564 case WB_NO_WA:
bogdanm 0:9b334a45a8ff 565 *descriptor_l1 |= (1 << SECTION_TEX0_SHIFT) | (1 << SECTION_TEX0_SHIFT);
bogdanm 0:9b334a45a8ff 566 break;
bogdanm 0:9b334a45a8ff 567 }
bogdanm 0:9b334a45a8ff 568 }
bogdanm 0:9b334a45a8ff 569
bogdanm 0:9b334a45a8ff 570 return 0;
bogdanm 0:9b334a45a8ff 571 }
bogdanm 0:9b334a45a8ff 572
bogdanm 0:9b334a45a8ff 573 /** \brief Set 4k/64k page memory attributes
bogdanm 0:9b334a45a8ff 574
bogdanm 0:9b334a45a8ff 575 The function sets 4k/64k page memory attributes
bogdanm 0:9b334a45a8ff 576
bogdanm 0:9b334a45a8ff 577 \param [out] descriptor_l2 L2 descriptor.
bogdanm 0:9b334a45a8ff 578 \param [in] mem 4k/64k page memory type: NORMAL, DEVICE, SHARED_DEVICE, NON_SHARED_DEVICE, STRONGLY_ORDERED
bogdanm 0:9b334a45a8ff 579 \param [in] outer Outer cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA,
bogdanm 0:9b334a45a8ff 580 \param [in] inner Inner cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA,
bogdanm 0:9b334a45a8ff 581
bogdanm 0:9b334a45a8ff 582 \return 0
bogdanm 0:9b334a45a8ff 583 */
bogdanm 0:9b334a45a8ff 584 __STATIC_INLINE int __memory_page(uint32_t *descriptor_l2, mmu_memory_Type mem, mmu_cacheability_Type outer, mmu_cacheability_Type inner, mmu_region_size_Type page)
bogdanm 0:9b334a45a8ff 585 {
bogdanm 0:9b334a45a8ff 586 *descriptor_l2 &= PAGE_4K_TEXCB_MASK;
bogdanm 0:9b334a45a8ff 587
bogdanm 0:9b334a45a8ff 588 if (page == PAGE_64k)
bogdanm 0:9b334a45a8ff 589 {
bogdanm 0:9b334a45a8ff 590 //same as section
bogdanm 0:9b334a45a8ff 591 __memory_section(descriptor_l2, mem, outer, inner);
bogdanm 0:9b334a45a8ff 592 }
bogdanm 0:9b334a45a8ff 593 else
bogdanm 0:9b334a45a8ff 594 {
bogdanm 0:9b334a45a8ff 595 if (STRONGLY_ORDERED == mem)
bogdanm 0:9b334a45a8ff 596 {
bogdanm 0:9b334a45a8ff 597 return 0;
bogdanm 0:9b334a45a8ff 598 }
bogdanm 0:9b334a45a8ff 599 else if (SHARED_DEVICE == mem)
bogdanm 0:9b334a45a8ff 600 {
bogdanm 0:9b334a45a8ff 601 *descriptor_l2 |= (1 << PAGE_4K_B_SHIFT);
bogdanm 0:9b334a45a8ff 602 }
bogdanm 0:9b334a45a8ff 603 else if (NON_SHARED_DEVICE == mem)
bogdanm 0:9b334a45a8ff 604 {
bogdanm 0:9b334a45a8ff 605 *descriptor_l2 |= (1 << PAGE_4K_TEX1_SHIFT);
bogdanm 0:9b334a45a8ff 606 }
bogdanm 0:9b334a45a8ff 607 else if (NORMAL == mem)
bogdanm 0:9b334a45a8ff 608 {
bogdanm 0:9b334a45a8ff 609 *descriptor_l2 |= 1 << PAGE_4K_TEX2_SHIFT;
bogdanm 0:9b334a45a8ff 610 switch(inner)
bogdanm 0:9b334a45a8ff 611 {
bogdanm 0:9b334a45a8ff 612 case NON_CACHEABLE:
bogdanm 0:9b334a45a8ff 613 break;
bogdanm 0:9b334a45a8ff 614 case WB_WA:
bogdanm 0:9b334a45a8ff 615 *descriptor_l2 |= (1 << PAGE_4K_B_SHIFT);
bogdanm 0:9b334a45a8ff 616 break;
bogdanm 0:9b334a45a8ff 617 case WT:
bogdanm 0:9b334a45a8ff 618 *descriptor_l2 |= 1 << PAGE_4K_C_SHIFT;
bogdanm 0:9b334a45a8ff 619 break;
bogdanm 0:9b334a45a8ff 620 case WB_NO_WA:
bogdanm 0:9b334a45a8ff 621 *descriptor_l2 |= (1 << PAGE_4K_B_SHIFT) | (1 << PAGE_4K_C_SHIFT);
bogdanm 0:9b334a45a8ff 622 break;
bogdanm 0:9b334a45a8ff 623 }
bogdanm 0:9b334a45a8ff 624 switch(outer)
bogdanm 0:9b334a45a8ff 625 {
bogdanm 0:9b334a45a8ff 626 case NON_CACHEABLE:
bogdanm 0:9b334a45a8ff 627 break;
bogdanm 0:9b334a45a8ff 628 case WB_WA:
bogdanm 0:9b334a45a8ff 629 *descriptor_l2 |= (1 << PAGE_4K_TEX0_SHIFT);
bogdanm 0:9b334a45a8ff 630 break;
bogdanm 0:9b334a45a8ff 631 case WT:
bogdanm 0:9b334a45a8ff 632 *descriptor_l2 |= 1 << PAGE_4K_TEX1_SHIFT;
bogdanm 0:9b334a45a8ff 633 break;
bogdanm 0:9b334a45a8ff 634 case WB_NO_WA:
bogdanm 0:9b334a45a8ff 635 *descriptor_l2 |= (1 << PAGE_4K_TEX0_SHIFT) | (1 << PAGE_4K_TEX0_SHIFT);
bogdanm 0:9b334a45a8ff 636 break;
bogdanm 0:9b334a45a8ff 637 }
bogdanm 0:9b334a45a8ff 638 }
bogdanm 0:9b334a45a8ff 639 }
bogdanm 0:9b334a45a8ff 640
bogdanm 0:9b334a45a8ff 641 return 0;
bogdanm 0:9b334a45a8ff 642 }
bogdanm 0:9b334a45a8ff 643
bogdanm 0:9b334a45a8ff 644 /** \brief Create a L1 section descriptor
bogdanm 0:9b334a45a8ff 645
bogdanm 0:9b334a45a8ff 646 The function creates a section descriptor.
bogdanm 0:9b334a45a8ff 647
bogdanm 0:9b334a45a8ff 648 Assumptions:
bogdanm 0:9b334a45a8ff 649 - 16MB super sections not supported
bogdanm 0:9b334a45a8ff 650 - TEX remap disabled, so memory type and attributes are described directly by bits in the descriptor
bogdanm 0:9b334a45a8ff 651 - Functions always return 0
bogdanm 0:9b334a45a8ff 652
bogdanm 0:9b334a45a8ff 653 \param [out] descriptor L1 descriptor
bogdanm 0:9b334a45a8ff 654 \param [out] descriptor2 L2 descriptor
bogdanm 0:9b334a45a8ff 655 \param [in] reg Section attributes
bogdanm 0:9b334a45a8ff 656
bogdanm 0:9b334a45a8ff 657 \return 0
bogdanm 0:9b334a45a8ff 658 */
bogdanm 0:9b334a45a8ff 659 __STATIC_INLINE int __get_section_descriptor(uint32_t *descriptor, mmu_region_attributes_Type reg)
bogdanm 0:9b334a45a8ff 660 {
bogdanm 0:9b334a45a8ff 661 *descriptor = 0;
bogdanm 0:9b334a45a8ff 662
bogdanm 0:9b334a45a8ff 663 __memory_section(descriptor, reg.mem_t, reg.outer_norm_t, reg.inner_norm_t);
bogdanm 0:9b334a45a8ff 664 __xn_section(descriptor,reg.xn_t);
bogdanm 0:9b334a45a8ff 665 __domain_section(descriptor, reg.domain);
bogdanm 0:9b334a45a8ff 666 __p_section(descriptor, reg.e_t);
bogdanm 0:9b334a45a8ff 667 __ap_section(descriptor, reg.priv_t, reg.user_t, 1);
bogdanm 0:9b334a45a8ff 668 __shared_section(descriptor,reg.sh_t);
bogdanm 0:9b334a45a8ff 669 __global_section(descriptor,reg.g_t);
bogdanm 0:9b334a45a8ff 670 __secure_section(descriptor,reg.sec_t);
bogdanm 0:9b334a45a8ff 671 *descriptor &= SECTION_MASK;
bogdanm 0:9b334a45a8ff 672 *descriptor |= SECTION_DESCRIPTOR;
bogdanm 0:9b334a45a8ff 673
bogdanm 0:9b334a45a8ff 674 return 0;
bogdanm 0:9b334a45a8ff 675
bogdanm 0:9b334a45a8ff 676 }
bogdanm 0:9b334a45a8ff 677
bogdanm 0:9b334a45a8ff 678
bogdanm 0:9b334a45a8ff 679 /** \brief Create a L1 and L2 4k/64k page descriptor
bogdanm 0:9b334a45a8ff 680
bogdanm 0:9b334a45a8ff 681 The function creates a 4k/64k page descriptor.
bogdanm 0:9b334a45a8ff 682 Assumptions:
bogdanm 0:9b334a45a8ff 683 - TEX remap disabled, so memory type and attributes are described directly by bits in the descriptor
bogdanm 0:9b334a45a8ff 684 - Functions always return 0
bogdanm 0:9b334a45a8ff 685
bogdanm 0:9b334a45a8ff 686 \param [out] descriptor L1 descriptor
bogdanm 0:9b334a45a8ff 687 \param [out] descriptor2 L2 descriptor
bogdanm 0:9b334a45a8ff 688 \param [in] reg 4k/64k page attributes
bogdanm 0:9b334a45a8ff 689
bogdanm 0:9b334a45a8ff 690 \return 0
bogdanm 0:9b334a45a8ff 691 */
bogdanm 0:9b334a45a8ff 692 __STATIC_INLINE int __get_page_descriptor(uint32_t *descriptor, uint32_t *descriptor2, mmu_region_attributes_Type reg)
bogdanm 0:9b334a45a8ff 693 {
bogdanm 0:9b334a45a8ff 694 *descriptor = 0;
bogdanm 0:9b334a45a8ff 695 *descriptor2 = 0;
bogdanm 0:9b334a45a8ff 696
bogdanm 0:9b334a45a8ff 697 switch (reg.rg_t)
bogdanm 0:9b334a45a8ff 698 {
bogdanm 0:9b334a45a8ff 699 case PAGE_4k:
bogdanm 0:9b334a45a8ff 700 __memory_page(descriptor2, reg.mem_t, reg.outer_norm_t, reg.inner_norm_t, PAGE_4k);
bogdanm 0:9b334a45a8ff 701 __xn_page(descriptor2, reg.xn_t, PAGE_4k);
bogdanm 0:9b334a45a8ff 702 __domain_page(descriptor, reg.domain);
bogdanm 0:9b334a45a8ff 703 __p_page(descriptor, reg.e_t);
bogdanm 0:9b334a45a8ff 704 __ap_page(descriptor2, reg.priv_t, reg.user_t, 1);
bogdanm 0:9b334a45a8ff 705 __shared_page(descriptor2,reg.sh_t);
bogdanm 0:9b334a45a8ff 706 __global_page(descriptor2,reg.g_t);
bogdanm 0:9b334a45a8ff 707 __secure_page(descriptor,reg.sec_t);
bogdanm 0:9b334a45a8ff 708 *descriptor &= PAGE_L1_MASK;
bogdanm 0:9b334a45a8ff 709 *descriptor |= PAGE_L1_DESCRIPTOR;
bogdanm 0:9b334a45a8ff 710 *descriptor2 &= PAGE_L2_4K_MASK;
bogdanm 0:9b334a45a8ff 711 *descriptor2 |= PAGE_L2_4K_DESC;
bogdanm 0:9b334a45a8ff 712 break;
bogdanm 0:9b334a45a8ff 713
bogdanm 0:9b334a45a8ff 714 case PAGE_64k:
bogdanm 0:9b334a45a8ff 715 __memory_page(descriptor2, reg.mem_t, reg.outer_norm_t, reg.inner_norm_t, PAGE_64k);
bogdanm 0:9b334a45a8ff 716 __xn_page(descriptor2, reg.xn_t, PAGE_64k);
bogdanm 0:9b334a45a8ff 717 __domain_page(descriptor, reg.domain);
bogdanm 0:9b334a45a8ff 718 __p_page(descriptor, reg.e_t);
bogdanm 0:9b334a45a8ff 719 __ap_page(descriptor2, reg.priv_t, reg.user_t, 1);
bogdanm 0:9b334a45a8ff 720 __shared_page(descriptor2,reg.sh_t);
bogdanm 0:9b334a45a8ff 721 __global_page(descriptor2,reg.g_t);
bogdanm 0:9b334a45a8ff 722 __secure_page(descriptor,reg.sec_t);
bogdanm 0:9b334a45a8ff 723 *descriptor &= PAGE_L1_MASK;
bogdanm 0:9b334a45a8ff 724 *descriptor |= PAGE_L1_DESCRIPTOR;
bogdanm 0:9b334a45a8ff 725 *descriptor2 &= PAGE_L2_64K_MASK;
bogdanm 0:9b334a45a8ff 726 *descriptor2 |= PAGE_L2_64K_DESC;
bogdanm 0:9b334a45a8ff 727 break;
bogdanm 0:9b334a45a8ff 728
bogdanm 0:9b334a45a8ff 729 case SECTION:
bogdanm 0:9b334a45a8ff 730 //error
bogdanm 0:9b334a45a8ff 731 break;
bogdanm 0:9b334a45a8ff 732
bogdanm 0:9b334a45a8ff 733 }
bogdanm 0:9b334a45a8ff 734
bogdanm 0:9b334a45a8ff 735 return 0;
bogdanm 0:9b334a45a8ff 736
bogdanm 0:9b334a45a8ff 737 }
bogdanm 0:9b334a45a8ff 738
bogdanm 0:9b334a45a8ff 739 /** \brief Create a 1MB Section
bogdanm 0:9b334a45a8ff 740
bogdanm 0:9b334a45a8ff 741 \param [in] ttb Translation table base address
bogdanm 0:9b334a45a8ff 742 \param [in] base_address Section base address
bogdanm 0:9b334a45a8ff 743 \param [in] count Number of sections to create
bogdanm 0:9b334a45a8ff 744 \param [in] descriptor_l1 L1 descriptor (region attributes)
bogdanm 0:9b334a45a8ff 745
bogdanm 0:9b334a45a8ff 746 */
bogdanm 0:9b334a45a8ff 747 __STATIC_INLINE void __TTSection(uint32_t *ttb, uint32_t base_address, uint32_t count, uint32_t descriptor_l1)
bogdanm 0:9b334a45a8ff 748 {
bogdanm 0:9b334a45a8ff 749 uint32_t offset;
bogdanm 0:9b334a45a8ff 750 uint32_t entry;
bogdanm 0:9b334a45a8ff 751 uint32_t i;
bogdanm 0:9b334a45a8ff 752
bogdanm 0:9b334a45a8ff 753 offset = base_address >> 20;
bogdanm 0:9b334a45a8ff 754 entry = (base_address & 0xFFF00000) | descriptor_l1;
bogdanm 0:9b334a45a8ff 755
bogdanm 0:9b334a45a8ff 756 //4 bytes aligned
bogdanm 0:9b334a45a8ff 757 ttb = ttb + offset;
bogdanm 0:9b334a45a8ff 758
bogdanm 0:9b334a45a8ff 759 for (i = 0; i < count; i++ )
bogdanm 0:9b334a45a8ff 760 {
bogdanm 0:9b334a45a8ff 761 //4 bytes aligned
bogdanm 0:9b334a45a8ff 762 *ttb++ = entry;
bogdanm 0:9b334a45a8ff 763 entry += OFFSET_1M;
bogdanm 0:9b334a45a8ff 764 }
bogdanm 0:9b334a45a8ff 765 }
bogdanm 0:9b334a45a8ff 766
bogdanm 0:9b334a45a8ff 767 /** \brief Create a 4k page entry
bogdanm 0:9b334a45a8ff 768
bogdanm 0:9b334a45a8ff 769 \param [in] ttb L1 table base address
bogdanm 0:9b334a45a8ff 770 \param [in] base_address 4k base address
bogdanm 0:9b334a45a8ff 771 \param [in] count Number of 4k pages to create
bogdanm 0:9b334a45a8ff 772 \param [in] descriptor_l1 L1 descriptor (region attributes)
bogdanm 0:9b334a45a8ff 773 \param [in] ttb_l2 L2 table base address
bogdanm 0:9b334a45a8ff 774 \param [in] descriptor_l2 L2 descriptor (region attributes)
bogdanm 0:9b334a45a8ff 775
bogdanm 0:9b334a45a8ff 776 */
bogdanm 0:9b334a45a8ff 777 __STATIC_INLINE void __TTPage_4k(uint32_t *ttb, uint32_t base_address, uint32_t count, uint32_t descriptor_l1, uint32_t *ttb_l2, uint32_t descriptor_l2 )
bogdanm 0:9b334a45a8ff 778 {
bogdanm 0:9b334a45a8ff 779
bogdanm 0:9b334a45a8ff 780 uint32_t offset, offset2;
bogdanm 0:9b334a45a8ff 781 uint32_t entry, entry2;
bogdanm 0:9b334a45a8ff 782 uint32_t i;
bogdanm 0:9b334a45a8ff 783
bogdanm 0:9b334a45a8ff 784
bogdanm 0:9b334a45a8ff 785 offset = base_address >> 20;
bogdanm 0:9b334a45a8ff 786 entry = ((int)ttb_l2 & 0xFFFFFC00) | descriptor_l1;
bogdanm 0:9b334a45a8ff 787
bogdanm 0:9b334a45a8ff 788 //4 bytes aligned
bogdanm 0:9b334a45a8ff 789 ttb += offset;
bogdanm 0:9b334a45a8ff 790 //create l1_entry
bogdanm 0:9b334a45a8ff 791 *ttb = entry;
bogdanm 0:9b334a45a8ff 792
bogdanm 0:9b334a45a8ff 793 offset2 = (base_address & 0xff000) >> 12;
bogdanm 0:9b334a45a8ff 794 ttb_l2 += offset2;
bogdanm 0:9b334a45a8ff 795 entry2 = (base_address & 0xFFFFF000) | descriptor_l2;
bogdanm 0:9b334a45a8ff 796 for (i = 0; i < count; i++ )
bogdanm 0:9b334a45a8ff 797 {
bogdanm 0:9b334a45a8ff 798 //4 bytes aligned
bogdanm 0:9b334a45a8ff 799 *ttb_l2++ = entry2;
bogdanm 0:9b334a45a8ff 800 entry2 += OFFSET_4K;
bogdanm 0:9b334a45a8ff 801 }
bogdanm 0:9b334a45a8ff 802 }
bogdanm 0:9b334a45a8ff 803
bogdanm 0:9b334a45a8ff 804 /** \brief Create a 64k page entry
bogdanm 0:9b334a45a8ff 805
bogdanm 0:9b334a45a8ff 806 \param [in] ttb L1 table base address
bogdanm 0:9b334a45a8ff 807 \param [in] base_address 64k base address
bogdanm 0:9b334a45a8ff 808 \param [in] count Number of 64k pages to create
bogdanm 0:9b334a45a8ff 809 \param [in] descriptor_l1 L1 descriptor (region attributes)
bogdanm 0:9b334a45a8ff 810 \param [in] ttb_l2 L2 table base address
bogdanm 0:9b334a45a8ff 811 \param [in] descriptor_l2 L2 descriptor (region attributes)
bogdanm 0:9b334a45a8ff 812
bogdanm 0:9b334a45a8ff 813 */
bogdanm 0:9b334a45a8ff 814 __STATIC_INLINE void __TTPage_64k(uint32_t *ttb, uint32_t base_address, uint32_t count, uint32_t descriptor_l1, uint32_t *ttb_l2, uint32_t descriptor_l2 )
bogdanm 0:9b334a45a8ff 815 {
bogdanm 0:9b334a45a8ff 816 uint32_t offset, offset2;
bogdanm 0:9b334a45a8ff 817 uint32_t entry, entry2;
bogdanm 0:9b334a45a8ff 818 uint32_t i,j;
bogdanm 0:9b334a45a8ff 819
bogdanm 0:9b334a45a8ff 820
bogdanm 0:9b334a45a8ff 821 offset = base_address >> 20;
bogdanm 0:9b334a45a8ff 822 entry = ((int)ttb_l2 & 0xFFFFFC00) | descriptor_l1;
bogdanm 0:9b334a45a8ff 823
bogdanm 0:9b334a45a8ff 824 //4 bytes aligned
bogdanm 0:9b334a45a8ff 825 ttb += offset;
bogdanm 0:9b334a45a8ff 826 //create l1_entry
bogdanm 0:9b334a45a8ff 827 *ttb = entry;
bogdanm 0:9b334a45a8ff 828
bogdanm 0:9b334a45a8ff 829 offset2 = (base_address & 0xff000) >> 12;
bogdanm 0:9b334a45a8ff 830 ttb_l2 += offset2;
bogdanm 0:9b334a45a8ff 831 entry2 = (base_address & 0xFFFF0000) | descriptor_l2;
bogdanm 0:9b334a45a8ff 832 for (i = 0; i < count; i++ )
bogdanm 0:9b334a45a8ff 833 {
bogdanm 0:9b334a45a8ff 834 //create 16 entries
bogdanm 0:9b334a45a8ff 835 for (j = 0; j < 16; j++)
bogdanm 0:9b334a45a8ff 836 //4 bytes aligned
bogdanm 0:9b334a45a8ff 837 *ttb_l2++ = entry2;
bogdanm 0:9b334a45a8ff 838 entry2 += OFFSET_64K;
bogdanm 0:9b334a45a8ff 839 }
bogdanm 0:9b334a45a8ff 840 }
bogdanm 0:9b334a45a8ff 841
bogdanm 0:9b334a45a8ff 842 /*@} end of MMU_Functions */
bogdanm 0:9b334a45a8ff 843 #endif
bogdanm 0:9b334a45a8ff 844
bogdanm 0:9b334a45a8ff 845 #ifdef __cplusplus
bogdanm 0:9b334a45a8ff 846 }
bogdanm 0:9b334a45a8ff 847 #endif