Fork of mbed-dev build 137, last build before FAT file system appears to be broken. Also reduced HSE timeout time in STM4XX HAL

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Sep 30 18:07:01 2016 +0100
Revision:
148:21d94c44109e
Parent:
144:ef7eb2e8f9f7
This updates the lib to the mbed lib v127

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /* General C++ Object Thunking class
<> 144:ef7eb2e8f9f7 2 *
<> 144:ef7eb2e8f9f7 3 * - allows direct callbacks to non-static C++ class functions
<> 144:ef7eb2e8f9f7 4 * - keeps track for the corresponding class instance
<> 144:ef7eb2e8f9f7 5 * - supports an optional context parameter for the called function
<> 144:ef7eb2e8f9f7 6 * - ideally suited for class object receiving interrupts (NVIC_SetVector)
<> 144:ef7eb2e8f9f7 7 *
<> 144:ef7eb2e8f9f7 8 * Copyright (c) 2014-2015 ARM Limited
<> 144:ef7eb2e8f9f7 9 *
<> 144:ef7eb2e8f9f7 10 * Licensed under the Apache License, Version 2.0 (the "License");
<> 144:ef7eb2e8f9f7 11 * you may not use this file except in compliance with the License.
<> 144:ef7eb2e8f9f7 12 * You may obtain a copy of the License at
<> 144:ef7eb2e8f9f7 13 *
<> 144:ef7eb2e8f9f7 14 * http://www.apache.org/licenses/LICENSE-2.0
<> 144:ef7eb2e8f9f7 15 *
<> 144:ef7eb2e8f9f7 16 * Unless required by applicable law or agreed to in writing, software
<> 144:ef7eb2e8f9f7 17 * distributed under the License is distributed on an "AS IS" BASIS,
<> 144:ef7eb2e8f9f7 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 144:ef7eb2e8f9f7 19 * See the License for the specific language governing permissions and
<> 144:ef7eb2e8f9f7 20 * limitations under the License.
<> 144:ef7eb2e8f9f7 21 */
<> 144:ef7eb2e8f9f7 22
<> 144:ef7eb2e8f9f7 23 /* General C++ Object Thunking class
<> 144:ef7eb2e8f9f7 24 *
<> 144:ef7eb2e8f9f7 25 * - allows direct callbacks to non-static C++ class functions
<> 144:ef7eb2e8f9f7 26 * - keeps track for the corresponding class instance
<> 144:ef7eb2e8f9f7 27 * - supports an optional context parameter for the called function
<> 144:ef7eb2e8f9f7 28 * - ideally suited for class object receiving interrupts (NVIC_SetVector)
<> 144:ef7eb2e8f9f7 29 */
<> 144:ef7eb2e8f9f7 30
<> 144:ef7eb2e8f9f7 31 #ifndef __CTHUNK_H__
<> 144:ef7eb2e8f9f7 32 #define __CTHUNK_H__
<> 144:ef7eb2e8f9f7 33
<> 144:ef7eb2e8f9f7 34 #define CTHUNK_ADDRESS 1
<> 148:21d94c44109e 35 #define CTHUNK_VARIABLES volatile uint32_t code[2]
<> 144:ef7eb2e8f9f7 36
<> 148:21d94c44109e 37 #if (defined(__CORTEX_M3) || defined(__CORTEX_M4) || defined(__CORTEX_M7) || defined(__CORTEX_A9))
<> 144:ef7eb2e8f9f7 38 /**
<> 148:21d94c44109e 39 * CTHUNK disassembly for Cortex-M3/M4/M7/A9 (thumb2):
<> 148:21d94c44109e 40 * * adr r0, #4
<> 148:21d94c44109e 41 * * ldm r0, {r0, r1, r2, pc}
<> 144:ef7eb2e8f9f7 42 *
<> 144:ef7eb2e8f9f7 43 * This instruction loads the arguments for the static thunking function to r0-r2, and
<> 144:ef7eb2e8f9f7 44 * branches to that function by loading its address into PC.
<> 144:ef7eb2e8f9f7 45 *
<> 144:ef7eb2e8f9f7 46 * This is safe for both regular calling and interrupt calling, since it only touches scratch registers
<> 144:ef7eb2e8f9f7 47 * which should be saved by the caller, and are automatically saved as part of the IRQ context switch.
<> 144:ef7eb2e8f9f7 48 */
<> 148:21d94c44109e 49 #define CTHUNK_ASSIGMENT do { \
<> 148:21d94c44109e 50 m_thunk.code[0] = 0xE890A001; \
<> 148:21d94c44109e 51 m_thunk.code[1] = 0x00008007; \
<> 148:21d94c44109e 52 } while (0)
<> 144:ef7eb2e8f9f7 53
<> 148:21d94c44109e 54 #elif (defined(__CORTEX_M0PLUS) || defined(__CORTEX_M0))
<> 144:ef7eb2e8f9f7 55 /*
<> 148:21d94c44109e 56 * CTHUNK disassembly for Cortex M0/M0+ (thumb):
<> 148:21d94c44109e 57 * * adr r0, #4
<> 148:21d94c44109e 58 * * ldm r0, {r0, r1, r2, r3}
<> 148:21d94c44109e 59 * * bx r3
<> 144:ef7eb2e8f9f7 60 */
<> 144:ef7eb2e8f9f7 61 #define CTHUNK_ASSIGMENT do { \
<> 148:21d94c44109e 62 m_thunk.code[0] = 0xC80FA001; \
<> 148:21d94c44109e 63 m_thunk.code[1] = 0x00004718; \
<> 144:ef7eb2e8f9f7 64 } while (0)
<> 144:ef7eb2e8f9f7 65
<> 144:ef7eb2e8f9f7 66 #else
<> 144:ef7eb2e8f9f7 67 #error "Target is not currently suported."
<> 144:ef7eb2e8f9f7 68 #endif
<> 144:ef7eb2e8f9f7 69
<> 144:ef7eb2e8f9f7 70 /* IRQ/Exception compatible thunk entry function */
<> 144:ef7eb2e8f9f7 71 typedef void (*CThunkEntry)(void);
<> 144:ef7eb2e8f9f7 72
<> 144:ef7eb2e8f9f7 73 /**
<> 144:ef7eb2e8f9f7 74 * Class for created a pointer with data bound to it
<> 144:ef7eb2e8f9f7 75 *
<> 144:ef7eb2e8f9f7 76 * @Note Synchronization level: Not protected
<> 144:ef7eb2e8f9f7 77 */
<> 144:ef7eb2e8f9f7 78 template<class T>
<> 144:ef7eb2e8f9f7 79 class CThunk
<> 144:ef7eb2e8f9f7 80 {
<> 144:ef7eb2e8f9f7 81 public:
<> 144:ef7eb2e8f9f7 82 typedef void (T::*CCallbackSimple)(void);
<> 144:ef7eb2e8f9f7 83 typedef void (T::*CCallback)(void* context);
<> 144:ef7eb2e8f9f7 84
<> 144:ef7eb2e8f9f7 85 inline CThunk(T *instance)
<> 144:ef7eb2e8f9f7 86 {
<> 144:ef7eb2e8f9f7 87 init(instance, NULL, NULL);
<> 144:ef7eb2e8f9f7 88 }
<> 144:ef7eb2e8f9f7 89
<> 144:ef7eb2e8f9f7 90 inline CThunk(T *instance, CCallback callback)
<> 144:ef7eb2e8f9f7 91 {
<> 144:ef7eb2e8f9f7 92 init(instance, callback, NULL);
<> 144:ef7eb2e8f9f7 93 }
<> 144:ef7eb2e8f9f7 94
<> 144:ef7eb2e8f9f7 95 ~CThunk() {
<> 144:ef7eb2e8f9f7 96
<> 144:ef7eb2e8f9f7 97 }
<> 144:ef7eb2e8f9f7 98
<> 144:ef7eb2e8f9f7 99 inline CThunk(T *instance, CCallbackSimple callback)
<> 144:ef7eb2e8f9f7 100 {
<> 144:ef7eb2e8f9f7 101 init(instance, (CCallback)callback, NULL);
<> 144:ef7eb2e8f9f7 102 }
<> 144:ef7eb2e8f9f7 103
<> 144:ef7eb2e8f9f7 104 inline CThunk(T &instance, CCallback callback)
<> 144:ef7eb2e8f9f7 105 {
<> 144:ef7eb2e8f9f7 106 init(instance, callback, NULL);
<> 144:ef7eb2e8f9f7 107 }
<> 144:ef7eb2e8f9f7 108
<> 144:ef7eb2e8f9f7 109 inline CThunk(T &instance, CCallbackSimple callback)
<> 144:ef7eb2e8f9f7 110 {
<> 144:ef7eb2e8f9f7 111 init(instance, (CCallback)callback, NULL);
<> 144:ef7eb2e8f9f7 112 }
<> 144:ef7eb2e8f9f7 113
<> 144:ef7eb2e8f9f7 114 inline CThunk(T &instance, CCallback callback, void* context)
<> 144:ef7eb2e8f9f7 115 {
<> 144:ef7eb2e8f9f7 116 init(instance, callback, context);
<> 144:ef7eb2e8f9f7 117 }
<> 144:ef7eb2e8f9f7 118
<> 144:ef7eb2e8f9f7 119 inline void callback(CCallback callback)
<> 144:ef7eb2e8f9f7 120 {
<> 144:ef7eb2e8f9f7 121 m_callback = callback;
<> 144:ef7eb2e8f9f7 122 }
<> 144:ef7eb2e8f9f7 123
<> 144:ef7eb2e8f9f7 124 inline void callback(CCallbackSimple callback)
<> 144:ef7eb2e8f9f7 125 {
<> 144:ef7eb2e8f9f7 126 m_callback = (CCallback)callback;
<> 144:ef7eb2e8f9f7 127 }
<> 144:ef7eb2e8f9f7 128
<> 144:ef7eb2e8f9f7 129 inline void context(void* context)
<> 144:ef7eb2e8f9f7 130 {
<> 144:ef7eb2e8f9f7 131 m_thunk.context = (uint32_t)context;
<> 144:ef7eb2e8f9f7 132 }
<> 144:ef7eb2e8f9f7 133
<> 144:ef7eb2e8f9f7 134 inline void context(uint32_t context)
<> 144:ef7eb2e8f9f7 135 {
<> 144:ef7eb2e8f9f7 136 m_thunk.context = context;
<> 144:ef7eb2e8f9f7 137 }
<> 144:ef7eb2e8f9f7 138
<> 144:ef7eb2e8f9f7 139 inline uint32_t entry(void)
<> 144:ef7eb2e8f9f7 140 {
<> 144:ef7eb2e8f9f7 141 return (((uint32_t)&m_thunk)|CTHUNK_ADDRESS);
<> 144:ef7eb2e8f9f7 142 }
<> 144:ef7eb2e8f9f7 143
<> 144:ef7eb2e8f9f7 144 /* get thunk entry point for connecting rhunk to an IRQ table */
<> 144:ef7eb2e8f9f7 145 inline operator CThunkEntry(void)
<> 144:ef7eb2e8f9f7 146 {
<> 144:ef7eb2e8f9f7 147 return (CThunkEntry)entry();
<> 144:ef7eb2e8f9f7 148 }
<> 144:ef7eb2e8f9f7 149
<> 144:ef7eb2e8f9f7 150 /* get thunk entry point for connecting rhunk to an IRQ table */
<> 144:ef7eb2e8f9f7 151 inline operator uint32_t(void)
<> 144:ef7eb2e8f9f7 152 {
<> 144:ef7eb2e8f9f7 153 return entry();
<> 144:ef7eb2e8f9f7 154 }
<> 144:ef7eb2e8f9f7 155
<> 144:ef7eb2e8f9f7 156 /* simple test function */
<> 144:ef7eb2e8f9f7 157 inline void call(void)
<> 144:ef7eb2e8f9f7 158 {
<> 144:ef7eb2e8f9f7 159 (((CThunkEntry)(entry()))());
<> 144:ef7eb2e8f9f7 160 }
<> 144:ef7eb2e8f9f7 161
<> 144:ef7eb2e8f9f7 162 private:
<> 144:ef7eb2e8f9f7 163 T* m_instance;
<> 144:ef7eb2e8f9f7 164 volatile CCallback m_callback;
<> 144:ef7eb2e8f9f7 165
<> 144:ef7eb2e8f9f7 166 // TODO: this needs proper fix, to refactor toolchain header file and all its use
<> 144:ef7eb2e8f9f7 167 // PACKED there is not defined properly for IAR
<> 144:ef7eb2e8f9f7 168 #if defined (__ICCARM__)
<> 144:ef7eb2e8f9f7 169 typedef __packed struct
<> 144:ef7eb2e8f9f7 170 {
<> 144:ef7eb2e8f9f7 171 CTHUNK_VARIABLES;
<> 144:ef7eb2e8f9f7 172 volatile uint32_t instance;
<> 144:ef7eb2e8f9f7 173 volatile uint32_t context;
<> 144:ef7eb2e8f9f7 174 volatile uint32_t callback;
<> 144:ef7eb2e8f9f7 175 volatile uint32_t trampoline;
<> 144:ef7eb2e8f9f7 176 } CThunkTrampoline;
<> 144:ef7eb2e8f9f7 177 #else
<> 144:ef7eb2e8f9f7 178 typedef struct
<> 144:ef7eb2e8f9f7 179 {
<> 144:ef7eb2e8f9f7 180 CTHUNK_VARIABLES;
<> 144:ef7eb2e8f9f7 181 volatile uint32_t instance;
<> 144:ef7eb2e8f9f7 182 volatile uint32_t context;
<> 144:ef7eb2e8f9f7 183 volatile uint32_t callback;
<> 144:ef7eb2e8f9f7 184 volatile uint32_t trampoline;
<> 144:ef7eb2e8f9f7 185 } __attribute__((__packed__)) CThunkTrampoline;
<> 144:ef7eb2e8f9f7 186 #endif
<> 144:ef7eb2e8f9f7 187
<> 144:ef7eb2e8f9f7 188 static void trampoline(T* instance, void* context, CCallback* callback)
<> 144:ef7eb2e8f9f7 189 {
<> 144:ef7eb2e8f9f7 190 if(instance && *callback) {
<> 144:ef7eb2e8f9f7 191 (static_cast<T*>(instance)->**callback)(context);
<> 144:ef7eb2e8f9f7 192 }
<> 144:ef7eb2e8f9f7 193 }
<> 144:ef7eb2e8f9f7 194
<> 144:ef7eb2e8f9f7 195 volatile CThunkTrampoline m_thunk;
<> 144:ef7eb2e8f9f7 196
<> 144:ef7eb2e8f9f7 197 inline void init(T *instance, CCallback callback, void* context)
<> 144:ef7eb2e8f9f7 198 {
<> 144:ef7eb2e8f9f7 199 /* remember callback - need to add this level of redirection
<> 144:ef7eb2e8f9f7 200 as pointer size for member functions differs between platforms */
<> 144:ef7eb2e8f9f7 201 m_callback = callback;
<> 144:ef7eb2e8f9f7 202
<> 144:ef7eb2e8f9f7 203 /* populate thunking trampoline */
<> 144:ef7eb2e8f9f7 204 CTHUNK_ASSIGMENT;
<> 144:ef7eb2e8f9f7 205 m_thunk.context = (uint32_t)context;
<> 144:ef7eb2e8f9f7 206 m_thunk.instance = (uint32_t)instance;
<> 144:ef7eb2e8f9f7 207 m_thunk.callback = (uint32_t)&m_callback;
<> 144:ef7eb2e8f9f7 208 m_thunk.trampoline = (uint32_t)&trampoline;
<> 144:ef7eb2e8f9f7 209
<> 144:ef7eb2e8f9f7 210 #if defined(__CORTEX_A9)
<> 144:ef7eb2e8f9f7 211 /* Data cache clean */
<> 144:ef7eb2e8f9f7 212 /* Cache control */
<> 144:ef7eb2e8f9f7 213 {
<> 144:ef7eb2e8f9f7 214 uint32_t start_addr = (uint32_t)&m_thunk & 0xFFFFFFE0;
<> 144:ef7eb2e8f9f7 215 uint32_t end_addr = (uint32_t)&m_thunk + sizeof(m_thunk);
<> 144:ef7eb2e8f9f7 216 uint32_t addr;
<> 144:ef7eb2e8f9f7 217
<> 144:ef7eb2e8f9f7 218 /* Data cache clean and invalid */
<> 144:ef7eb2e8f9f7 219 for (addr = start_addr; addr < end_addr; addr += 0x20) {
<> 144:ef7eb2e8f9f7 220 __v7_clean_inv_dcache_mva((void *)addr);
<> 144:ef7eb2e8f9f7 221 }
<> 144:ef7eb2e8f9f7 222 /* Instruction cache invalid */
<> 144:ef7eb2e8f9f7 223 __v7_inv_icache_all();
<> 144:ef7eb2e8f9f7 224 __ca9u_inv_tlb_all();
<> 144:ef7eb2e8f9f7 225 __v7_inv_btac();
<> 144:ef7eb2e8f9f7 226 }
<> 144:ef7eb2e8f9f7 227 #endif
<> 148:21d94c44109e 228 #if defined(__CORTEX_M7)
<> 148:21d94c44109e 229 /* Data cache clean and invalid */
<> 148:21d94c44109e 230 SCB_CleanInvalidateDCache();
<> 148:21d94c44109e 231
<> 148:21d94c44109e 232 /* Instruction cache invalid */
<> 148:21d94c44109e 233 SCB_InvalidateICache();
<> 148:21d94c44109e 234 #endif
<> 144:ef7eb2e8f9f7 235 __ISB();
<> 144:ef7eb2e8f9f7 236 __DSB();
<> 144:ef7eb2e8f9f7 237 }
<> 144:ef7eb2e8f9f7 238 };
<> 144:ef7eb2e8f9f7 239
<> 144:ef7eb2e8f9f7 240 #endif/*__CTHUNK_H__*/