Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-dev by
mbed_application.c
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2017-2017 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 #include <stdlib.h> 00018 #include <stdarg.h> 00019 #include "device.h" 00020 #include "platform/mbed_application.h" 00021 00022 #if MBED_APPLICATION_SUPPORT 00023 00024 #if defined(__CORTEX_A9) 00025 00026 static void powerdown_gic(void); 00027 00028 void mbed_start_application(uintptr_t address) 00029 { 00030 __disable_irq(); 00031 powerdown_gic(); 00032 __enable_irq(); 00033 ((void(*)())address)(); 00034 } 00035 00036 static void powerdown_gic() 00037 { 00038 int i; 00039 int j; 00040 00041 for (i = 0; i < 32; i++) { 00042 GICDistributor->ICENABLER[i] = 0xFFFFFFFF; 00043 GICDistributor->ICPENDR[i] = 0xFFFFFFFF; 00044 if (i < 4) { 00045 GICDistributor->CPENDSGIR[i] = 0xFFFFFFFF; 00046 } 00047 for (j = 0; j < 8; j++) { 00048 GICDistributor->IPRIORITYR[i*8+j] = 0x00000000; 00049 } 00050 } 00051 } 00052 00053 #else 00054 00055 static void powerdown_nvic(void); 00056 static void powerdown_scb(uint32_t vtor); 00057 static void start_new_application(void *sp, void *pc); 00058 00059 void mbed_start_application(uintptr_t address) 00060 { 00061 void *sp; 00062 void *pc; 00063 00064 // Interrupts are re-enabled in start_new_application 00065 __disable_irq(); 00066 00067 SysTick->CTRL = 0x00000000; 00068 powerdown_nvic(); 00069 powerdown_scb(address); 00070 00071 sp = *((void **)address + 0); 00072 pc = *((void **)address + 1); 00073 start_new_application(sp, pc); 00074 } 00075 00076 static void powerdown_nvic() 00077 { 00078 int isr_groups_32; 00079 int i; 00080 int j; 00081 00082 #if defined(__CORTEX_M23) 00083 // M23 doesn't support ICTR and supports up to 240 external interrupts. 00084 isr_groups_32 = 8; 00085 #else 00086 isr_groups_32 = ((SCnSCB->ICTR & SCnSCB_ICTR_INTLINESNUM_Msk) >> SCnSCB_ICTR_INTLINESNUM_Pos) + 1; 00087 #endif 00088 for (i = 0; i < isr_groups_32; i++) { 00089 NVIC->ICER[i] = 0xFFFFFFFF; 00090 NVIC->ICPR[i] = 0xFFFFFFFF; 00091 for (j = 0; j < 8; j++) { 00092 #if defined(__CORTEX_M23) 00093 NVIC->IPR[i * 8 + j] = 0x00000000; 00094 #else 00095 NVIC->IP[i * 8 + j] = 0x00000000; 00096 #endif 00097 } 00098 } 00099 } 00100 00101 static void powerdown_scb(uint32_t vtor) 00102 { 00103 int i; 00104 00105 // SCB->CPUID - Read only CPU ID register 00106 SCB->ICSR = SCB_ICSR_PENDSVCLR_Msk | SCB_ICSR_PENDSTCLR_Msk; 00107 SCB->VTOR = vtor; 00108 SCB->AIRCR = 0x05FA | 0x0000; 00109 SCB->SCR = 0x00000000; 00110 // SCB->CCR - Implementation defined value 00111 #if defined(__CORTEX_M23) 00112 for (i = 0; i < 2; i++) { 00113 SCB->SHPR[i] = 0x00; 00114 } 00115 #else 00116 for (i = 0; i < 12; i++) { 00117 #if defined(__CORTEX_M7) 00118 SCB->SHPR[i] = 0x00; 00119 #else 00120 SCB->SHP[i] = 0x00; 00121 #endif 00122 } 00123 #endif 00124 SCB->SHCSR = 0x00000000; 00125 #if defined(__CORTEX_M23) 00126 #else 00127 SCB->CFSR = 0xFFFFFFFF; 00128 SCB->HFSR = SCB_HFSR_DEBUGEVT_Msk | SCB_HFSR_FORCED_Msk | SCB_HFSR_VECTTBL_Msk; 00129 SCB->DFSR = SCB_DFSR_EXTERNAL_Msk | SCB_DFSR_VCATCH_Msk | 00130 SCB_DFSR_DWTTRAP_Msk | SCB_DFSR_BKPT_Msk | SCB_DFSR_HALTED_Msk; 00131 #endif 00132 // SCB->MMFAR - Implementation defined value 00133 // SCB->BFAR - Implementation defined value 00134 // SCB->AFSR - Implementation defined value 00135 // SCB->PFR - Read only processor feature register 00136 // SCB->DFR - Read only debug feature registers 00137 // SCB->ADR - Read only auxiliary feature registers 00138 // SCB->MMFR - Read only memory model feature registers 00139 // SCB->ISAR - Read only instruction set attribute registers 00140 // SCB->CPACR - Implementation defined value 00141 } 00142 00143 #if defined (__CC_ARM) 00144 00145 __asm static void start_new_application(void *sp, void *pc) 00146 { 00147 MOV R2, #0 00148 MSR CONTROL, R2 // Switch to main stack 00149 MOV SP, R0 00150 MSR PRIMASK, R2 // Enable interrupts 00151 BX R1 00152 } 00153 00154 #elif defined (__GNUC__) || defined (__ICCARM__) 00155 00156 void start_new_application(void *sp, void *pc) 00157 { 00158 __asm volatile( 00159 "movw r2, #0 \n" // Fail to compile "mov r2, #0" with ARMC6. Replace with MOVW. 00160 // We needn't "movt r2, #0" immediately following because MOVW 00161 // will zero-extend the 16-bit immediate. 00162 "msr control, r2 \n" // Switch to main stack 00163 "mov sp, %0 \n" 00164 "msr primask, r2 \n" // Enable interrupts 00165 "bx %1 \n" 00166 : 00167 : "l"(sp), "l"(pc) 00168 : "r2", "cc", "memory" 00169 ); 00170 } 00171 00172 #else 00173 00174 #error "Unsupported toolchain" 00175 00176 #endif 00177 00178 #endif 00179 00180 #endif /* MBED_APPLICATION_SUPPORT */
Generated on Tue Jul 12 2022 19:10:21 by
 1.7.2 
    