Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
/*
 * Copyright (c) 2017 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief CMSIS interface file
 *
 * This header contains the interface to the ARM CMSIS Core headers.
 */

#ifndef _CMSIS__H_
#define _CMSIS__H_

#ifdef __cplusplus
extern "C" {
#endif

#include <soc.h>

/* CP10 Access Bits */
#define CPACR_CP10_Pos          20U
#define CPACR_CP10_Msk          (3UL << CPACR_CP10_Pos)
#define CPACR_CP10_NO_ACCESS    (0UL << CPACR_CP10_Pos)
#define CPACR_CP10_PRIV_ACCESS  (1UL << CPACR_CP10_Pos)
#define CPACR_CP10_RESERVED     (2UL << CPACR_CP10_Pos)
#define CPACR_CP10_FULL_ACCESS  (3UL << CPACR_CP10_Pos)

/* CP11 Access Bits */
#define CPACR_CP11_Pos          22U
#define CPACR_CP11_Msk          (3UL << CPACR_CP11_Pos)
#define CPACR_CP11_NO_ACCESS    (0UL << CPACR_CP11_Pos)
#define CPACR_CP11_PRIV_ACCESS  (1UL << CPACR_CP11_Pos)
#define CPACR_CP11_RESERVED     (2UL << CPACR_CP11_Pos)
#define CPACR_CP11_FULL_ACCESS  (3UL << CPACR_CP11_Pos)

#define SCB_UFSR  (*((__IOM u16_t *) &SCB->CFSR + 2))
#define SCB_BFSR  (*((__IOM u8_t *) &SCB->CFSR + 1))
#define SCB_MMFSR (*((__IOM u8_t *) &SCB->CFSR))

/* CFSR[UFSR] */
#define CFSR_DIVBYZERO_Pos		(25U)
#define CFSR_DIVBYZERO_Msk		(0x1U << CFSR_DIVBYZERO_Pos)
#define CFSR_UNALIGNED_Pos		(24U)
#define CFSR_UNALIGNED_Msk		(0x1U << CFSR_UNALIGNED_Pos)
#define CFSR_NOCP_Pos			(19U)
#define CFSR_NOCP_Msk			(0x1U << CFSR_NOCP_Pos)
#define CFSR_INVPC_Pos			(18U)
#define CFSR_INVPC_Msk			(0x1U << CFSR_INVPC_Pos)
#define CFSR_INVSTATE_Pos		(17U)
#define CFSR_INVSTATE_Msk		(0x1U << CFSR_INVSTATE_Pos)
#define CFSR_UNDEFINSTR_Pos		(16U)
#define CFSR_UNDEFINSTR_Msk		(0x1U << CFSR_UNDEFINSTR_Pos)

/* CFSR[BFSR] */
#define CFSR_BFARVALID_Pos		(15U)
#define CFSR_BFARVALID_Msk		(0x1U << CFSR_BFARVALID_Pos)
#define CFSR_LSPERR_Pos			(13U)
#define CFSR_LSPERR_Msk			(0x1U << CFSR_LSPERR_Pos)
#define CFSR_STKERR_Pos			(12U)
#define CFSR_STKERR_Msk			(0x1U << CFSR_STKERR_Pos)
#define CFSR_UNSTKERR_Pos		(11U)
#define CFSR_UNSTKERR_Msk		(0x1U << CFSR_UNSTKERR_Pos)
#define CFSR_IMPRECISERR_Pos		(10U)
#define CFSR_IMPRECISERR_Msk		(0x1U << CFSR_IMPRECISERR_Pos)
#define CFSR_PRECISERR_Pos		(9U)
#define CFSR_PRECISERR_Msk		(0x1U << CFSR_PRECISERR_Pos)
#define CFSR_IBUSERR_Pos		(8U)
#define CFSR_IBUSERR_Msk		(0x1U << CFSR_IBUSERR_Pos)

/* CFSR[MMFSR] */
#define CFSR_MMARVALID_Pos		(7U)
#define CFSR_MMARVALID_Msk		(0x1U << CFSR_MMARVALID_Pos)
#define CFSR_MLSPERR_Pos		(5U)
#define CFSR_MLSPERR_Msk		(0x1U << CFSR_MLSPERR_Pos)
#define CFSR_MSTKERR_Pos		(4U)
#define CFSR_MSTKERR_Msk		(0x1U << CFSR_MSTKERR_Pos)
#define CFSR_MUNSTKERR_Pos		(3U)
#define CFSR_MUNSTKERR_Msk		(0x1U << CFSR_MUNSTKERR_Pos)
#define CFSR_DACCVIOL_Pos		(1U)
#define CFSR_DACCVIOL_Msk		(0x1U << CFSR_DACCVIOL_Pos)
#define CFSR_IACCVIOL_Pos		(0U)
#define CFSR_IACCVIOL_Msk		(0x1U << CFSR_IACCVIOL_Pos)


/* Fill in CMSIS required values for non-CMSIS compliant SoCs.
 * Use __NVIC_PRIO_BITS as it is required and simple to check, but
 * ultimately all SoCs will define their own CMSIS types and constants.
 */
#ifndef __NVIC_PRIO_BITS
typedef enum {
	Reset_IRQn                    = -15,
	NonMaskableInt_IRQn           = -14,
	HardFault_IRQn                = -13,
#if defined(CONFIG_ARMV7_M)
	MemoryManagement_IRQn         = -12,
	BusFault_IRQn                 = -11,
	UsageFault_IRQn               = -10,
#endif /* CONFIG_ARMV7_M */
	SVCall_IRQn                   =  -5,
	DebugMonitor_IRQn             =  -4,
	PendSV_IRQn                   =  -2,
	SysTick_IRQn                  =  -1,
} IRQn_Type;

#if defined(CONFIG_CPU_CORTEX_M0)
#define __CM0_REV        0
#elif defined(CONFIG_CPU_CORTEX_M0PLUS)
#define __CM0PLUS_REV    0
#elif defined(CONFIG_CPU_CORTEX_M3)
#define __CM3_REV        0
#elif defined(CONFIG_CPU_CORTEX_M4)
#define __CM4_REV        0
#elif defined(CONFIG_CPU_CORTEX_M7)
#define __CM7_REV        0
#else
#error "Unknown Cortex-M device"
#endif

#define __MPU_PRESENT                  0 /* Zephyr has no MPU support */
#define __NVIC_PRIO_BITS               CONFIG_NUM_IRQ_PRIO_BITS
#define __Vendor_SysTickConfig         0 /* Default to standard SysTick */
#endif /* __NVIC_PRIO_BITS */

#if __NVIC_PRIO_BITS != CONFIG_NUM_IRQ_PRIO_BITS
#error "CONFIG_NUM_IRQ_PRIO_BITS and __NVIC_PRIO_BITS are not set to the same value"
#endif

#if defined(CONFIG_CPU_CORTEX_M0)
#include <core_cm0.h>
#elif defined(CONFIG_CPU_CORTEX_M0PLUS)
#include <core_cm0plus.h>
#elif defined(CONFIG_CPU_CORTEX_M3)
#include <core_cm3.h>
#elif defined(CONFIG_CPU_CORTEX_M4)
#include <core_cm4.h>
#elif defined(CONFIG_CPU_CORTEX_M7)
#include <core_cm7.h>
#else
#error "Unknown Cortex-M device"
#endif

#ifdef __cplusplus
}
#endif

#endif /* _CMSIS__H_ */