Modification of Mbed-dev library for LQFP48 package microcontrollers: STM32F103C8 (STM32F103C8T6) and STM32F103CB (STM32F103CBT6) (Bluepill boards, Maple mini etc. )

Fork of mbed-STM32F103C8_org by Nothing Special

Library for STM32F103C8 (Bluepill boards etc.).
Use this instead of mbed library.
This library allows the size of the code in the FLASH up to 128kB. Therefore, code also runs on microcontrollers STM32F103CB (eg. Maple mini).
But in the case of STM32F103C8, check the size of the resulting code would not exceed 64kB.

To compile a program with this library, use NUCLEO-F103RB as the target name. !

Changes:

  • Corrected initialization of the HSE + crystal clock (mbed permanent bug), allowing the use of on-board xtal (8MHz).(1)
  • Additionally, it also set USB clock (48Mhz).(2)
  • Definitions of pins and peripherals adjusted to LQFP48 case.
  • Board led LED1 is now PC_13 (3)
  • USER_BUTTON is now PC_14 (4)

    Now the library is complete rebuilt based on mbed-dev v160 (and not yet fully tested).

notes
(1) - In case 8MHz xtal on board, CPU frequency is 72MHz. Without xtal is 64MHz.
(2) - Using the USB interface is only possible if STM32 is clocking by on-board 8MHz xtal or external clock signal 8MHz on the OSC_IN pin.
(3) - On Bluepill board led operation is reversed, i.e. 0 - led on, 1 - led off.
(4) - Bluepill board has no real user button

Information

After export to SW4STM (AC6):

  • add line #include "mbed_config.h" in files Serial.h and RawSerial.h
  • in project properties change Optimisation Level to Optimise for size (-Os)
Committer:
mega64
Date:
Thu Apr 27 23:56:38 2017 +0000
Revision:
148:8b0b02bf146f
Parent:
146:03e976389d16
Remove unnecessary folders

Who changed what in which revision?

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