mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Thu Sep 06 13:40:20 2018 +0100
Revision:
187:0387e8f68319
Parent:
186:707f6e361f3e
Child:
189:f392fc9709a3
mbed-dev library. Release version 163

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 160:d5399cc887bb 1 /* mbed Microcontroller Library
<> 160:d5399cc887bb 2 * Copyright (c) 2017-2017 ARM Limited
<> 160:d5399cc887bb 3 *
<> 160:d5399cc887bb 4 * Licensed under the Apache License, Version 2.0 (the "License");
<> 160:d5399cc887bb 5 * you may not use this file except in compliance with the License.
<> 160:d5399cc887bb 6 * You may obtain a copy of the License at
<> 160:d5399cc887bb 7 *
<> 160:d5399cc887bb 8 * http://www.apache.org/licenses/LICENSE-2.0
<> 160:d5399cc887bb 9 *
<> 160:d5399cc887bb 10 * Unless required by applicable law or agreed to in writing, software
<> 160:d5399cc887bb 11 * distributed under the License is distributed on an "AS IS" BASIS,
<> 160:d5399cc887bb 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 160:d5399cc887bb 13 * See the License for the specific language governing permissions and
<> 160:d5399cc887bb 14 * limitations under the License.
<> 160:d5399cc887bb 15 */
<> 160:d5399cc887bb 16
<> 160:d5399cc887bb 17 #include <stdlib.h>
<> 160:d5399cc887bb 18 #include <stdarg.h>
<> 160:d5399cc887bb 19 #include "device.h"
<> 160:d5399cc887bb 20 #include "platform/mbed_application.h"
<> 160:d5399cc887bb 21
<> 160:d5399cc887bb 22 #if MBED_APPLICATION_SUPPORT
<> 160:d5399cc887bb 23
AnnaBridge 187:0387e8f68319 24 #if defined(__CORTEX_A9)
AnnaBridge 187:0387e8f68319 25
AnnaBridge 187:0387e8f68319 26 static void powerdown_gic(void);
AnnaBridge 187:0387e8f68319 27
AnnaBridge 187:0387e8f68319 28 void mbed_start_application(uintptr_t address)
AnnaBridge 187:0387e8f68319 29 {
AnnaBridge 187:0387e8f68319 30 __disable_irq();
AnnaBridge 187:0387e8f68319 31 powerdown_gic();
AnnaBridge 187:0387e8f68319 32 __enable_irq();
AnnaBridge 187:0387e8f68319 33 ((void(*)())address)();
AnnaBridge 187:0387e8f68319 34 }
AnnaBridge 187:0387e8f68319 35
AnnaBridge 187:0387e8f68319 36 static void powerdown_gic()
AnnaBridge 187:0387e8f68319 37 {
AnnaBridge 187:0387e8f68319 38 int i;
AnnaBridge 187:0387e8f68319 39 int j;
AnnaBridge 187:0387e8f68319 40
AnnaBridge 187:0387e8f68319 41 for (i = 0; i < 32; i++) {
AnnaBridge 187:0387e8f68319 42 GICDistributor->ICENABLER[i] = 0xFFFFFFFF;
AnnaBridge 187:0387e8f68319 43 GICDistributor->ICPENDR[i] = 0xFFFFFFFF;
AnnaBridge 187:0387e8f68319 44 if (i < 4) {
AnnaBridge 187:0387e8f68319 45 GICDistributor->CPENDSGIR[i] = 0xFFFFFFFF;
AnnaBridge 187:0387e8f68319 46 }
AnnaBridge 187:0387e8f68319 47 for (j = 0; j < 8; j++) {
AnnaBridge 187:0387e8f68319 48 GICDistributor->IPRIORITYR[i*8+j] = 0x00000000;
AnnaBridge 187:0387e8f68319 49 }
AnnaBridge 187:0387e8f68319 50 }
AnnaBridge 187:0387e8f68319 51 }
AnnaBridge 187:0387e8f68319 52
AnnaBridge 187:0387e8f68319 53 #else
AnnaBridge 187:0387e8f68319 54
<> 160:d5399cc887bb 55 static void powerdown_nvic(void);
<> 160:d5399cc887bb 56 static void powerdown_scb(uint32_t vtor);
<> 160:d5399cc887bb 57 static void start_new_application(void *sp, void *pc);
<> 160:d5399cc887bb 58
<> 160:d5399cc887bb 59 void mbed_start_application(uintptr_t address)
<> 160:d5399cc887bb 60 {
<> 160:d5399cc887bb 61 void *sp;
<> 160:d5399cc887bb 62 void *pc;
<> 160:d5399cc887bb 63
<> 160:d5399cc887bb 64 // Interrupts are re-enabled in start_new_application
<> 160:d5399cc887bb 65 __disable_irq();
<> 160:d5399cc887bb 66
<> 160:d5399cc887bb 67 SysTick->CTRL = 0x00000000;
<> 160:d5399cc887bb 68 powerdown_nvic();
<> 160:d5399cc887bb 69 powerdown_scb(address);
<> 160:d5399cc887bb 70
AnnaBridge 187:0387e8f68319 71 sp = *((void **)address + 0);
AnnaBridge 187:0387e8f68319 72 pc = *((void **)address + 1);
<> 160:d5399cc887bb 73 start_new_application(sp, pc);
<> 160:d5399cc887bb 74 }
<> 160:d5399cc887bb 75
<> 160:d5399cc887bb 76 static void powerdown_nvic()
<> 160:d5399cc887bb 77 {
AnnaBridge 173:e131a1973e81 78 int isr_groups_32;
<> 160:d5399cc887bb 79 int i;
<> 160:d5399cc887bb 80 int j;
<> 160:d5399cc887bb 81
Anna Bridge 186:707f6e361f3e 82 #if defined(__CORTEX_M23)
Anna Bridge 186:707f6e361f3e 83 // M23 doesn't support ICTR and supports up to 240 external interrupts.
Anna Bridge 186:707f6e361f3e 84 isr_groups_32 = 8;
Anna Bridge 186:707f6e361f3e 85 #else
AnnaBridge 173:e131a1973e81 86 isr_groups_32 = ((SCnSCB->ICTR & SCnSCB_ICTR_INTLINESNUM_Msk) >> SCnSCB_ICTR_INTLINESNUM_Pos) + 1;
Anna Bridge 186:707f6e361f3e 87 #endif
AnnaBridge 173:e131a1973e81 88 for (i = 0; i < isr_groups_32; i++) {
<> 160:d5399cc887bb 89 NVIC->ICER[i] = 0xFFFFFFFF;
<> 160:d5399cc887bb 90 NVIC->ICPR[i] = 0xFFFFFFFF;
<> 160:d5399cc887bb 91 for (j = 0; j < 8; j++) {
Anna Bridge 186:707f6e361f3e 92 #if defined(__CORTEX_M23)
Anna Bridge 186:707f6e361f3e 93 NVIC->IPR[i * 8 + j] = 0x00000000;
Anna Bridge 186:707f6e361f3e 94 #else
<> 160:d5399cc887bb 95 NVIC->IP[i * 8 + j] = 0x00000000;
Anna Bridge 186:707f6e361f3e 96 #endif
<> 160:d5399cc887bb 97 }
<> 160:d5399cc887bb 98 }
<> 160:d5399cc887bb 99 }
<> 160:d5399cc887bb 100
<> 160:d5399cc887bb 101 static void powerdown_scb(uint32_t vtor)
<> 160:d5399cc887bb 102 {
<> 160:d5399cc887bb 103 int i;
<> 160:d5399cc887bb 104
<> 160:d5399cc887bb 105 // SCB->CPUID - Read only CPU ID register
<> 160:d5399cc887bb 106 SCB->ICSR = SCB_ICSR_PENDSVCLR_Msk | SCB_ICSR_PENDSTCLR_Msk;
<> 160:d5399cc887bb 107 SCB->VTOR = vtor;
<> 160:d5399cc887bb 108 SCB->AIRCR = 0x05FA | 0x0000;
<> 160:d5399cc887bb 109 SCB->SCR = 0x00000000;
<> 160:d5399cc887bb 110 // SCB->CCR - Implementation defined value
Anna Bridge 186:707f6e361f3e 111 #if defined(__CORTEX_M23)
Anna Bridge 186:707f6e361f3e 112 for (i = 0; i < 2; i++) {
Anna Bridge 186:707f6e361f3e 113 SCB->SHPR[i] = 0x00;
Anna Bridge 186:707f6e361f3e 114 }
Anna Bridge 186:707f6e361f3e 115 #else
<> 160:d5399cc887bb 116 for (i = 0; i < 12; i++) {
<> 160:d5399cc887bb 117 #if defined(__CORTEX_M7)
<> 160:d5399cc887bb 118 SCB->SHPR[i] = 0x00;
<> 160:d5399cc887bb 119 #else
<> 160:d5399cc887bb 120 SCB->SHP[i] = 0x00;
<> 160:d5399cc887bb 121 #endif
<> 160:d5399cc887bb 122 }
Anna Bridge 186:707f6e361f3e 123 #endif
<> 160:d5399cc887bb 124 SCB->SHCSR = 0x00000000;
Anna Bridge 186:707f6e361f3e 125 #if defined(__CORTEX_M23)
Anna Bridge 186:707f6e361f3e 126 #else
<> 160:d5399cc887bb 127 SCB->CFSR = 0xFFFFFFFF;
<> 160:d5399cc887bb 128 SCB->HFSR = SCB_HFSR_DEBUGEVT_Msk | SCB_HFSR_FORCED_Msk | SCB_HFSR_VECTTBL_Msk;
<> 160:d5399cc887bb 129 SCB->DFSR = SCB_DFSR_EXTERNAL_Msk | SCB_DFSR_VCATCH_Msk |
<> 160:d5399cc887bb 130 SCB_DFSR_DWTTRAP_Msk | SCB_DFSR_BKPT_Msk | SCB_DFSR_HALTED_Msk;
Anna Bridge 186:707f6e361f3e 131 #endif
<> 160:d5399cc887bb 132 // SCB->MMFAR - Implementation defined value
<> 160:d5399cc887bb 133 // SCB->BFAR - Implementation defined value
<> 160:d5399cc887bb 134 // SCB->AFSR - Implementation defined value
<> 160:d5399cc887bb 135 // SCB->PFR - Read only processor feature register
<> 160:d5399cc887bb 136 // SCB->DFR - Read only debug feature registers
<> 160:d5399cc887bb 137 // SCB->ADR - Read only auxiliary feature registers
<> 160:d5399cc887bb 138 // SCB->MMFR - Read only memory model feature registers
<> 160:d5399cc887bb 139 // SCB->ISAR - Read only instruction set attribute registers
<> 160:d5399cc887bb 140 // SCB->CPACR - Implementation defined value
<> 160:d5399cc887bb 141 }
<> 160:d5399cc887bb 142
<> 160:d5399cc887bb 143 #if defined (__CC_ARM)
<> 160:d5399cc887bb 144
<> 160:d5399cc887bb 145 __asm static void start_new_application(void *sp, void *pc)
<> 160:d5399cc887bb 146 {
<> 160:d5399cc887bb 147 MOV R2, #0
<> 160:d5399cc887bb 148 MSR CONTROL, R2 // Switch to main stack
<> 160:d5399cc887bb 149 MOV SP, R0
<> 160:d5399cc887bb 150 MSR PRIMASK, R2 // Enable interrupts
<> 160:d5399cc887bb 151 BX R1
<> 160:d5399cc887bb 152 }
<> 160:d5399cc887bb 153
<> 160:d5399cc887bb 154 #elif defined (__GNUC__) || defined (__ICCARM__)
<> 160:d5399cc887bb 155
<> 160:d5399cc887bb 156 void start_new_application(void *sp, void *pc)
<> 160:d5399cc887bb 157 {
AnnaBridge 187:0387e8f68319 158 __asm volatile(
Anna Bridge 186:707f6e361f3e 159 "movw r2, #0 \n" // Fail to compile "mov r2, #0" with ARMC6. Replace with MOVW.
AnnaBridge 187:0387e8f68319 160 // We needn't "movt r2, #0" immediately following because MOVW
AnnaBridge 187:0387e8f68319 161 // will zero-extend the 16-bit immediate.
<> 160:d5399cc887bb 162 "msr control, r2 \n" // Switch to main stack
<> 160:d5399cc887bb 163 "mov sp, %0 \n"
<> 160:d5399cc887bb 164 "msr primask, r2 \n" // Enable interrupts
<> 160:d5399cc887bb 165 "bx %1 \n"
<> 160:d5399cc887bb 166 :
AnnaBridge 187:0387e8f68319 167 : "l"(sp), "l"(pc)
<> 160:d5399cc887bb 168 : "r2", "cc", "memory"
<> 160:d5399cc887bb 169 );
<> 160:d5399cc887bb 170 }
<> 160:d5399cc887bb 171
<> 160:d5399cc887bb 172 #else
<> 160:d5399cc887bb 173
<> 160:d5399cc887bb 174 #error "Unsupported toolchain"
<> 160:d5399cc887bb 175
<> 160:d5399cc887bb 176 #endif
<> 160:d5399cc887bb 177
AnnaBridge 187:0387e8f68319 178 #endif
AnnaBridge 187:0387e8f68319 179
<> 160:d5399cc887bb 180 #endif /* MBED_APPLICATION_SUPPORT */