pinebuds/platform/cmsis/inc/cmsis.h
2022-08-15 17:20:27 +08:00

150 lines
3.3 KiB
C

/* mbed Microcontroller Library - CMSIS
* Copyright (C) 2009-2011 ARM Limited. All rights reserved.
*
* A generic CMSIS include header, pulling in LPC11U24 specifics
*/
#ifndef MBED_CMSIS_H
#define MBED_CMSIS_H
#ifdef __cplusplus
extern "C" {
#endif
#include "plat_addr_map.h"
#include _TO_STRING(CONCAT_SUFFIX(CHIP_ID_LITERAL, h))
#define IRQ_PRIORITY_REALTIME 0
#define IRQ_PRIORITY_HIGHPLUSPLUS 1
#define IRQ_PRIORITY_HIGHPLUS 2
#define IRQ_PRIORITY_HIGH 3
#define IRQ_PRIORITY_ABOVENORMAL 4
#define IRQ_PRIORITY_NORMAL 5
#define IRQ_PRIORITY_BELOWNORMAL 6
#define IRQ_PRIORITY_LOW 7
#ifdef __ARM_ARCH_ISA_ARM
#define IRQ_LOCK_MASK (CPSR_I_Msk | CPSR_F_Msk)
#else
#define NVIC_USER_IRQ_OFFSET 16
#define NVIC_NUM_VECTORS (NVIC_USER_IRQ_OFFSET + USER_IRQn_QTY)
#endif
#ifndef __ASSEMBLER__
#ifdef __ARMCC_VERSION
// Stupid armclang
#undef __SSAT
#define __SSAT(ARG1,ARG2) \
__extension__ \
({ \
int32_t __RES, __ARG1 = (ARG1); \
__ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
__RES; \
})
#endif
__STATIC_FORCEINLINE uint32_t int_lock_global(void)
{
#ifdef __ARM_ARCH_ISA_ARM
uint32_t cpsr = __get_CPSR();
uint32_t st = cpsr & IRQ_LOCK_MASK;
if (st != IRQ_LOCK_MASK) {
cpsr |= IRQ_LOCK_MASK;
__set_CPSR(cpsr);
}
return st;
#else
uint32_t pri = __get_PRIMASK();
if ((pri & 0x1) == 0) {
__disable_irq();
}
return pri;
#endif
}
__STATIC_FORCEINLINE void int_unlock_global(uint32_t pri)
{
#ifdef __ARM_ARCH_ISA_ARM
if (pri != IRQ_LOCK_MASK) {
uint32_t cpsr = __get_CPSR();
cpsr = (cpsr & ~IRQ_LOCK_MASK) | pri;
__set_CPSR(cpsr);
}
#else
if ((pri & 0x1) == 0) {
__enable_irq();
}
#endif
}
__STATIC_FORCEINLINE uint32_t int_lock(void)
{
#ifdef INT_LOCK_EXCEPTION
#ifdef __ARM_ARCH_ISA_ARM
uint32_t mask = GIC_GetInterfacePriorityMask();
// Only allow IRQs with priority IRQ_PRIORITY_HIGHPLUSPLUS and IRQ_PRIORITY_REALTIME
GIC_SetInterfacePriorityMask(((IRQ_PRIORITY_HIGHPLUS << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL));
return mask;
#else
uint32_t pri = __get_BASEPRI();
// Only allow IRQs with priority IRQ_PRIORITY_HIGHPLUSPLUS and IRQ_PRIORITY_REALTIME
__set_BASEPRI(((IRQ_PRIORITY_HIGHPLUS << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL));
return pri;
#endif
#else
return int_lock_global();
#endif
}
__STATIC_FORCEINLINE void int_unlock(uint32_t pri)
{
#ifdef INT_LOCK_EXCEPTION
#ifdef __ARM_ARCH_ISA_ARM
GIC_SetInterfacePriorityMask(pri);
#else
__set_BASEPRI(pri);
#endif
#else
int_unlock_global(pri);
#endif
}
__STATIC_FORCEINLINE int in_isr(void)
{
#ifdef __ARM_ARCH_ISA_ARM
uint32_t mode = __get_mode();
return mode != CPSR_M_USR && mode != CPSR_M_SYS;
#else
return __get_IPSR() != 0;
#endif
}
__STATIC_FORCEINLINE int32_t ftoi_nearest(float f)
{
return (f >= 0) ? (int32_t)(f + 0.5) : (int32_t)(f - 0.5);
}
void GotBaseInit(void);
int set_bool_flag(bool *flag);
void clear_bool_flag(bool *flag);
float db_to_float(float db);
uint32_t get_msb_pos(uint32_t val);
uint32_t get_lsb_pos(uint32_t val);
uint32_t integer_sqrt(uint32_t val);
uint32_t integer_sqrt_nearest(uint32_t val);
#endif
#ifdef __cplusplus
}
#endif
#endif