9#ifndef _FSL_COMMON_ARM_H_
10#define _FSL_COMMON_ARM_H_
20#include "RTE_Components.h"
65#if ((defined(__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
66 (defined(__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
67 (defined(__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
68 (defined(__ARM_ARCH_8M_BASE__) && (__ARM_ARCH_8M_BASE__ == 1)))
72#define _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, val, ops) \
75 (val) = __LDREXB(addr); \
77 } while (0UL != __STREXB((val), (addr)))
79#define _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, val, ops) \
82 (val) = __LDREXH(addr); \
84 } while (0UL != __STREXH((val), (addr)))
86#define _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, val, ops) \
89 (val) = __LDREXW(addr); \
91 } while (0UL != __STREXW((val), (addr)))
93static inline void _SDK_AtomicLocalAdd1Byte(
volatile uint8_t *addr, uint8_t val)
97 _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val += val);
100static inline void _SDK_AtomicLocalAdd2Byte(
volatile uint16_t *addr, uint16_t val)
104 _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val += val);
107static inline void _SDK_AtomicLocalAdd4Byte(
volatile uint32_t *addr, uint32_t val)
111 _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val += val);
114static inline void _SDK_AtomicLocalSub1Byte(
volatile uint8_t *addr, uint8_t val)
118 _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val -= val);
121static inline void _SDK_AtomicLocalSub2Byte(
volatile uint16_t *addr, uint16_t val)
125 _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val -= val);
128static inline void _SDK_AtomicLocalSub4Byte(
volatile uint32_t *addr, uint32_t val)
132 _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val -= val);
135static inline void _SDK_AtomicLocalSet1Byte(
volatile uint8_t *addr, uint8_t bits)
139 _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val |= bits);
142static inline void _SDK_AtomicLocalSet2Byte(
volatile uint16_t *addr, uint16_t bits)
146 _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val |= bits);
149static inline void _SDK_AtomicLocalSet4Byte(
volatile uint32_t *addr, uint32_t bits)
153 _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val |= bits);
156static inline void _SDK_AtomicLocalClear1Byte(
volatile uint8_t *addr, uint8_t bits)
160 _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val &= ~bits);
163static inline void _SDK_AtomicLocalClear2Byte(
volatile uint16_t *addr, uint16_t bits)
167 _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val &= ~bits);
170static inline void _SDK_AtomicLocalClear4Byte(
volatile uint32_t *addr, uint32_t bits)
174 _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val &= ~bits);
177static inline void _SDK_AtomicLocalToggle1Byte(
volatile uint8_t *addr, uint8_t bits)
181 _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val ^= bits);
184static inline void _SDK_AtomicLocalToggle2Byte(
volatile uint16_t *addr, uint16_t bits)
188 _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val ^= bits);
191static inline void _SDK_AtomicLocalToggle4Byte(
volatile uint32_t *addr, uint32_t bits)
195 _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val ^= bits);
198static inline void _SDK_AtomicLocalClearAndSet1Byte(
volatile uint8_t *addr, uint8_t clearBits, uint8_t setBits)
202 _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits);
205static inline void _SDK_AtomicLocalClearAndSet2Byte(
volatile uint16_t *addr, uint16_t clearBits, uint16_t setBits)
209 _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits);
212static inline void _SDK_AtomicLocalClearAndSet4Byte(
volatile uint32_t *addr, uint32_t clearBits, uint32_t setBits)
216 _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits);
219#define SDK_ATOMIC_LOCAL_ADD(addr, val) \
220 ((1UL == sizeof(*(addr))) ? \
221 _SDK_AtomicLocalAdd1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(val)) : \
222 ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalAdd2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(val)) : \
223 _SDK_AtomicLocalAdd4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(val))))
225#define SDK_ATOMIC_LOCAL_SUB(addr, val) \
226 ((1UL == sizeof(*(addr))) ? \
227 _SDK_AtomicLocalSub1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(val)) : \
228 ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalSub2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(val)) : \
229 _SDK_AtomicLocalSub4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(val))))
231#define SDK_ATOMIC_LOCAL_SET(addr, bits) \
232 ((1UL == sizeof(*(addr))) ? \
233 _SDK_AtomicLocalSet1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(bits)) : \
234 ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalSet2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(bits)) : \
235 _SDK_AtomicLocalSet4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(bits))))
237#define SDK_ATOMIC_LOCAL_CLEAR(addr, bits) \
238 ((1UL == sizeof(*(addr))) ? \
239 _SDK_AtomicLocalClear1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(bits)) : \
240 ((2UL == sizeof(*(addr))) ? \
241 _SDK_AtomicLocalClear2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(bits)) : \
242 _SDK_AtomicLocalClear4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(bits))))
244#define SDK_ATOMIC_LOCAL_TOGGLE(addr, bits) \
245 ((1UL == sizeof(*(addr))) ? \
246 _SDK_AtomicLocalToggle1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(bits)) : \
247 ((2UL == sizeof(*(addr))) ? \
248 _SDK_AtomicLocalToggle2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(bits)) : \
249 _SDK_AtomicLocalToggle4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(bits))))
251#define SDK_ATOMIC_LOCAL_CLEAR_AND_SET(addr, clearBits, setBits) \
252 ((1UL == sizeof(*(addr))) ? \
253 _SDK_AtomicLocalClearAndSet1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(clearBits), (uint8_t)(setBits)) : \
254 ((2UL == sizeof(*(addr))) ? \
255 _SDK_AtomicLocalClearAndSet2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(clearBits), (uint16_t)(setBits)) : \
256 _SDK_AtomicLocalClearAndSet4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(clearBits), (uint32_t)(setBits))))
259#define SDK_ATOMIC_LOCAL_ADD(addr, val) \
262 uint32_t s_atomicOldInt; \
263 s_atomicOldInt = DisableGlobalIRQ(); \
265 EnableGlobalIRQ(s_atomicOldInt); \
268#define SDK_ATOMIC_LOCAL_SUB(addr, val) \
271 uint32_t s_atomicOldInt; \
272 s_atomicOldInt = DisableGlobalIRQ(); \
274 EnableGlobalIRQ(s_atomicOldInt); \
277#define SDK_ATOMIC_LOCAL_SET(addr, bits) \
280 uint32_t s_atomicOldInt; \
281 s_atomicOldInt = DisableGlobalIRQ(); \
283 EnableGlobalIRQ(s_atomicOldInt); \
286#define SDK_ATOMIC_LOCAL_CLEAR(addr, bits) \
289 uint32_t s_atomicOldInt; \
290 s_atomicOldInt = DisableGlobalIRQ(); \
291 *(addr) &= ~(bits); \
292 EnableGlobalIRQ(s_atomicOldInt); \
295#define SDK_ATOMIC_LOCAL_TOGGLE(addr, bits) \
298 uint32_t s_atomicOldInt; \
299 s_atomicOldInt = DisableGlobalIRQ(); \
301 EnableGlobalIRQ(s_atomicOldInt); \
304#define SDK_ATOMIC_LOCAL_CLEAR_AND_SET(addr, clearBits, setBits) \
307 uint32_t s_atomicOldInt; \
308 s_atomicOldInt = DisableGlobalIRQ(); \
309 *(addr) = (*(addr) & ~(clearBits)) | (setBits); \
310 EnableGlobalIRQ(s_atomicOldInt); \
319#define USEC_TO_COUNT(us, clockFreqInHz) (uint64_t)(((uint64_t)(us) * (clockFreqInHz)) / 1000000U)
321#define COUNT_TO_USEC(count, clockFreqInHz) (uint64_t)((uint64_t)(count)*1000000U / (clockFreqInHz))
324#define MSEC_TO_COUNT(ms, clockFreqInHz) (uint64_t)((uint64_t)(ms) * (clockFreqInHz) / 1000U)
326#define COUNT_TO_MSEC(count, clockFreqInHz) (uint64_t)((uint64_t)(count)*1000U / (clockFreqInHz))
338#if (defined __CORTEX_M) && ((__CORTEX_M == 4U) || (__CORTEX_M == 7U))
339#define SDK_ISR_EXIT_BARRIER __DSB()
341#define SDK_ISR_EXIT_BARRIER
348#if (defined(__ICCARM__))
353_Pragma(
"diag_suppress=Pm120")
354#define SDK_PRAGMA(x) _Pragma(#x)
355 _Pragma(
"diag_error=Pm120")
357#define SDK_ALIGN(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var
358#elif defined(__CC_ARM) || defined(__ARMCC_VERSION)
360#define SDK_ALIGN(var, alignbytes) __attribute__((aligned(alignbytes))) var
361#elif defined(__GNUC__)
363#define SDK_ALIGN(var, alignbytes) var __attribute__((aligned(alignbytes)))
365#error Toolchain not supported
369#if defined(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE)
370#define SDK_L1DCACHE_ALIGN(var) SDK_ALIGN(var, FSL_FEATURE_L1DCACHE_LINESIZE_BYTE)
373#if defined(FSL_FEATURE_L2CACHE_LINESIZE_BYTE)
374#define SDK_L2CACHE_ALIGN(var) SDK_ALIGN(var, FSL_FEATURE_L2CACHE_LINESIZE_BYTE)
378#define SDK_SIZEALIGN(var, alignbytes) \
379 ((unsigned int)((var) + ((alignbytes)-1U)) & (unsigned int)(~(unsigned int)((alignbytes)-1U)))
390#if ((!(defined(FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION) && FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION)) && \
391 defined(FSL_FEATURE_L1ICACHE_LINESIZE_BYTE))
393#if (defined(__ICCARM__))
394#define AT_NONCACHEABLE_SECTION(var) var @"NonCacheable"
395#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var @"NonCacheable"
396#define AT_NONCACHEABLE_SECTION_INIT(var) var @"NonCacheable.init"
397#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \
398 SDK_PRAGMA(data_alignment = alignbytes) var @"NonCacheable.init"
400#elif (defined(__CC_ARM) || defined(__ARMCC_VERSION))
401#define AT_NONCACHEABLE_SECTION_INIT(var) __attribute__((section("NonCacheable.init"))) var
402#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \
403 __attribute__((section("NonCacheable.init"))) __attribute__((aligned(alignbytes))) var
404#if (defined(__CC_ARM))
405#define AT_NONCACHEABLE_SECTION(var) __attribute__((section("NonCacheable"), zero_init)) var
406#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \
407 __attribute__((section("NonCacheable"), zero_init)) __attribute__((aligned(alignbytes))) var
409#define AT_NONCACHEABLE_SECTION(var) __attribute__((section(".bss.NonCacheable"))) var
410#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \
411 __attribute__((section(".bss.NonCacheable"))) __attribute__((aligned(alignbytes))) var
414#elif (defined(__GNUC__))
418#define AT_NONCACHEABLE_SECTION_INIT(var) __attribute__((section("NonCacheable.init"))) var
419#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \
420 __attribute__((section("NonCacheable.init"))) var __attribute__((aligned(alignbytes)))
421#define AT_NONCACHEABLE_SECTION(var) __attribute__((section("NonCacheable,\"aw\",%nobits @"))) var
422#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \
423 __attribute__((section("NonCacheable,\"aw\",%nobits @"))) var __attribute__((aligned(alignbytes)))
425#error Toolchain not supported.
430#define AT_NONCACHEABLE_SECTION(var) var
431#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) SDK_ALIGN(var, alignbytes)
432#define AT_NONCACHEABLE_SECTION_INIT(var) var
433#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) SDK_ALIGN(var, alignbytes)
443#if (defined(__ICCARM__))
444#define AT_QUICKACCESS_SECTION_CODE(func) func @"CodeQuickAccess"
445#define AT_QUICKACCESS_SECTION_DATA(var) var @"DataQuickAccess"
446#define AT_QUICKACCESS_SECTION_DATA_ALIGN(var, alignbytes) \
447 SDK_PRAGMA(data_alignment = alignbytes) var @"DataQuickAccess"
448#elif (defined(__CC_ARM) || defined(__ARMCC_VERSION))
449#define AT_QUICKACCESS_SECTION_CODE(func) __attribute__((section("CodeQuickAccess"), __noinline__)) func
450#define AT_QUICKACCESS_SECTION_DATA(var) __attribute__((section("DataQuickAccess"))) var
451#define AT_QUICKACCESS_SECTION_DATA_ALIGN(var, alignbytes) \
452 __attribute__((section("DataQuickAccess"))) __attribute__((aligned(alignbytes))) var
453#elif (defined(__GNUC__))
454#define AT_QUICKACCESS_SECTION_CODE(func) __attribute__((section("CodeQuickAccess"), __noinline__)) func
455#define AT_QUICKACCESS_SECTION_DATA(var) __attribute__((section("DataQuickAccess"))) var
456#define AT_QUICKACCESS_SECTION_DATA_ALIGN(var, alignbytes) \
457 __attribute__((section("DataQuickAccess"))) var __attribute__((aligned(alignbytes)))
459#error Toolchain not supported.
463#if (defined(__ICCARM__))
464#define RAMFUNCTION_SECTION_CODE(func) func @"RamFunction"
465#elif (defined(__CC_ARM) || defined(__ARMCC_VERSION))
466#define RAMFUNCTION_SECTION_CODE(func) __attribute__((section("RamFunction"))) func
467#elif (defined(__GNUC__))
468#define RAMFUNCTION_SECTION_CODE(func) __attribute__((section("RamFunction"))) func
470#error Toolchain not supported.
474#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
475 void DefaultISR(
void);
482#include "fsl_clock.h"
487#if ((defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0)) || \
488 (defined(FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT) && (FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT > 0)))
489#include "fsl_reset.h"
496#if defined(__cplusplus)
516static inline status_t EnableIRQ(IRQn_Type interrupt)
518 status_t status = kStatus_Success;
520 if (NotAvail_IRQn == interrupt)
522 status = kStatus_Fail;
525#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0)
526 else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS)
528 status = kStatus_Fail;
534#if defined(__GIC_PRIO_BITS)
535 GIC_EnableIRQ(interrupt);
537 NVIC_EnableIRQ(interrupt);
560static inline status_t DisableIRQ(IRQn_Type interrupt)
562 status_t status = kStatus_Success;
564 if (NotAvail_IRQn == interrupt)
566 status = kStatus_Fail;
569#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0)
570 else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS)
572 status = kStatus_Fail;
578#if defined(__GIC_PRIO_BITS)
579 GIC_DisableIRQ(interrupt);
581 NVIC_DisableIRQ(interrupt);
605static inline status_t EnableIRQWithPriority(IRQn_Type interrupt, uint8_t priNum)
607 status_t status = kStatus_Success;
609 if (NotAvail_IRQn == interrupt)
611 status = kStatus_Fail;
614#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0)
615 else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS)
617 status = kStatus_Fail;
623#if defined(__GIC_PRIO_BITS)
624 GIC_SetPriority(interrupt, priNum);
625 GIC_EnableIRQ(interrupt);
627 NVIC_SetPriority(interrupt, priNum);
628 NVIC_EnableIRQ(interrupt);
653static inline status_t IRQ_SetPriority(IRQn_Type interrupt, uint8_t priNum)
655 status_t status = kStatus_Success;
657 if (NotAvail_IRQn == interrupt)
659 status = kStatus_Fail;
662#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0)
663 else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS)
665 status = kStatus_Fail;
671#if defined(__GIC_PRIO_BITS)
672 GIC_SetPriority(interrupt, priNum);
674 NVIC_SetPriority(interrupt, priNum);
698static inline status_t IRQ_ClearPendingIRQ(IRQn_Type interrupt)
700 status_t status = kStatus_Success;
702 if (NotAvail_IRQn == interrupt)
704 status = kStatus_Fail;
707#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0)
708 else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS)
710 status = kStatus_Fail;
716#if defined(__GIC_PRIO_BITS)
717 GIC_ClearPendingIRQ(interrupt);
719 NVIC_ClearPendingIRQ(interrupt);
734static inline uint32_t DisableGlobalIRQ(
void)
738#if defined(CPSR_I_Msk)
739 mask = __get_CPSR() & CPSR_I_Msk;
740#elif defined(DAIF_I_BIT)
741 mask = __get_DAIF() & DAIF_I_BIT;
743 mask = __get_PRIMASK();
760static inline void EnableGlobalIRQ(uint32_t primask)
762#if defined(CPSR_I_Msk)
763 __set_CPSR((__get_CPSR() & ~CPSR_I_Msk) | primask);
764#elif defined(DAIF_I_BIT)
770 __set_PRIMASK(primask);
774#if defined(ENABLE_RAM_VECTOR_TABLE)
782uint32_t InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler);
785#if (defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0))
791#if !(defined(FSL_FEATURE_POWERLIB_EXTEND) && (FSL_FEATURE_POWERLIB_EXTEND != 0))
805void EnableDeepSleepIRQ(IRQn_Type interrupt);
820void DisableDeepSleepIRQ(IRQn_Type interrupt);
828void MSDK_EnableCpuCycleCounter(
void);
835uint32_t MSDK_GetCpuCycleCount(
void);
838#if defined(__cplusplus)