forked from Imagelibrary/rtems
bsps: Shared ARMv7-M interrupt support
This commit is contained in:
@@ -42,6 +42,7 @@ include_bsp_HEADERS += ../../shared/include/irq-info.h
|
|||||||
include_bsp_HEADERS += ../../shared/include/stackalloc.h
|
include_bsp_HEADERS += ../../shared/include/stackalloc.h
|
||||||
include_bsp_HEADERS += ../../shared/tod.h
|
include_bsp_HEADERS += ../../shared/tod.h
|
||||||
include_bsp_HEADERS += ../shared/include/start.h
|
include_bsp_HEADERS += ../shared/include/start.h
|
||||||
|
include_bsp_HEADERS += ../shared/armv7m/include/armv7m-irq.h
|
||||||
include_bsp_HEADERS += include/irq.h
|
include_bsp_HEADERS += include/irq.h
|
||||||
include_bsp_HEADERS += include/uart.h
|
include_bsp_HEADERS += include/uart.h
|
||||||
include_bsp_HEADERS += include/lm3s69xx.h
|
include_bsp_HEADERS += include/lm3s69xx.h
|
||||||
@@ -82,7 +83,8 @@ libbsp_a_SOURCES += ../../shared/src/irq-info.c
|
|||||||
libbsp_a_SOURCES += ../../shared/src/irq-legacy.c
|
libbsp_a_SOURCES += ../../shared/src/irq-legacy.c
|
||||||
libbsp_a_SOURCES += ../../shared/src/irq-server.c
|
libbsp_a_SOURCES += ../../shared/src/irq-server.c
|
||||||
libbsp_a_SOURCES += ../../shared/src/irq-shell.c
|
libbsp_a_SOURCES += ../../shared/src/irq-shell.c
|
||||||
libbsp_a_SOURCES += irq/irq.c
|
libbsp_a_SOURCES += ../shared/armv7m/irq/armv7m-irq.c
|
||||||
|
libbsp_a_SOURCES += ../shared/armv7m/irq/armv7m-irq-dispatch.c
|
||||||
|
|
||||||
# Console
|
# Console
|
||||||
libbsp_a_SOURCES += ../../shared/console.c
|
libbsp_a_SOURCES += ../../shared/console.c
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2011 Sebastian Huber. All rights reserved.
|
|
||||||
*
|
|
||||||
* embedded brains GmbH
|
|
||||||
* Obere Lagerstr. 30
|
|
||||||
* 82178 Puchheim
|
|
||||||
* Germany
|
|
||||||
* <rtems@embedded-brains.de>
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rtems.com/license/LICENSE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <rtems/score/armv7m.h>
|
|
||||||
|
|
||||||
#include <bsp.h>
|
|
||||||
#include <bsp/irq.h>
|
|
||||||
#include <bsp/irq-generic.h>
|
|
||||||
#include <bsp/lm3s69xx.h>
|
|
||||||
|
|
||||||
static __attribute__((aligned(128))) ARMV7M_Exception_handler
|
|
||||||
lm3s69xx_vector_table [BSP_INTERRUPT_VECTOR_MAX + 1];
|
|
||||||
|
|
||||||
void bsp_interrupt_dispatch(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
|
|
||||||
{
|
|
||||||
return RTEMS_SUCCESSFUL;
|
|
||||||
}
|
|
||||||
|
|
||||||
rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
|
|
||||||
{
|
|
||||||
return RTEMS_SUCCESSFUL;
|
|
||||||
}
|
|
||||||
|
|
||||||
rtems_status_code bsp_interrupt_facility_initialize(void)
|
|
||||||
{
|
|
||||||
memcpy(&lm3s69xx_vector_table [0], (void *) 0, sizeof(lm3s69xx_vector_table));
|
|
||||||
_ARMV7M_SCB->vtor = &lm3s69xx_vector_table [0];
|
|
||||||
|
|
||||||
return RTEMS_SUCCESSFUL;
|
|
||||||
}
|
|
||||||
@@ -89,6 +89,10 @@ $(PROJECT_INCLUDE)/bsp/start.h: ../shared/include/start.h $(PROJECT_INCLUDE)/bsp
|
|||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/start.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/start.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/start.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/start.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/armv7m-irq.h: ../shared/armv7m/include/armv7m-irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/armv7m-irq.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/armv7m-irq.h
|
||||||
|
|
||||||
$(PROJECT_INCLUDE)/bsp/irq.h: include/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
$(PROJECT_INCLUDE)/bsp/irq.h: include/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.h
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ include_bsp_HEADERS += ../shared/lpc/include/lpc-i2s.h
|
|||||||
include_bsp_HEADERS += ../shared/lpc/include/lpc-emc.h
|
include_bsp_HEADERS += ../shared/lpc/include/lpc-emc.h
|
||||||
include_bsp_HEADERS += ../shared/lpc/include/lpc-dma.h
|
include_bsp_HEADERS += ../shared/lpc/include/lpc-dma.h
|
||||||
include_bsp_HEADERS += ../shared/lpc/include/lpc-lcd.h
|
include_bsp_HEADERS += ../shared/lpc/include/lpc-lcd.h
|
||||||
|
include_bsp_HEADERS += ../shared/armv7m/include/armv7m-irq.h
|
||||||
include_bsp_HEADERS += include/dma.h
|
include_bsp_HEADERS += include/dma.h
|
||||||
include_bsp_HEADERS += include/i2c.h
|
include_bsp_HEADERS += include/i2c.h
|
||||||
include_bsp_HEADERS += include/io.h
|
include_bsp_HEADERS += include/io.h
|
||||||
@@ -112,6 +113,8 @@ libbsp_a_SOURCES += ../../shared/src/irq-info.c
|
|||||||
libbsp_a_SOURCES += ../../shared/src/irq-legacy.c
|
libbsp_a_SOURCES += ../../shared/src/irq-legacy.c
|
||||||
libbsp_a_SOURCES += ../../shared/src/irq-server.c
|
libbsp_a_SOURCES += ../../shared/src/irq-server.c
|
||||||
libbsp_a_SOURCES += ../../shared/src/irq-shell.c
|
libbsp_a_SOURCES += ../../shared/src/irq-shell.c
|
||||||
|
libbsp_a_SOURCES += ../shared/armv7m/irq/armv7m-irq.c
|
||||||
|
libbsp_a_SOURCES += ../shared/armv7m/irq/armv7m-irq-dispatch.c
|
||||||
libbsp_a_SOURCES += irq/irq.c
|
libbsp_a_SOURCES += irq/irq.c
|
||||||
libbsp_a_SOURCES += irq/irq-dispatch.c
|
libbsp_a_SOURCES += irq/irq-dispatch.c
|
||||||
|
|
||||||
|
|||||||
@@ -133,8 +133,6 @@ void lpc24xx_irq_set_priority(rtems_vector_number vector, unsigned priority);
|
|||||||
|
|
||||||
unsigned lpc24xx_irq_get_priority(rtems_vector_number vector);
|
unsigned lpc24xx_irq_get_priority(rtems_vector_number vector);
|
||||||
|
|
||||||
void bsp_interrupt_dispatch(void);
|
|
||||||
|
|
||||||
#endif /* ASM */
|
#endif /* ASM */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|||||||
@@ -20,36 +20,29 @@
|
|||||||
* http://www.rtems.com/license/LICENSE.
|
* http://www.rtems.com/license/LICENSE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <rtems/score/armv7m.h>
|
|
||||||
|
|
||||||
#include <bsp.h>
|
#include <bsp.h>
|
||||||
#include <bsp/irq.h>
|
#include <bsp/irq.h>
|
||||||
#include <bsp/irq-generic.h>
|
#include <bsp/irq-generic.h>
|
||||||
#include <bsp/lpc24xx.h>
|
#include <bsp/lpc24xx.h>
|
||||||
|
|
||||||
|
#ifdef ARM_MULTILIB_ARCH_V4
|
||||||
|
|
||||||
void bsp_interrupt_dispatch(void)
|
void bsp_interrupt_dispatch(void)
|
||||||
{
|
{
|
||||||
#ifdef ARM_MULTILIB_ARCH_V4
|
/* Read current vector number */
|
||||||
/* Read current vector number */
|
rtems_vector_number vector = VICVectAddr;
|
||||||
rtems_vector_number vector = VICVectAddr;
|
|
||||||
|
|
||||||
/* Enable interrupts in program status register */
|
/* Enable interrupts in program status register */
|
||||||
uint32_t psr = arm_status_irq_enable();
|
uint32_t psr = arm_status_irq_enable();
|
||||||
|
|
||||||
/* Dispatch interrupt handlers */
|
/* Dispatch interrupt handlers */
|
||||||
bsp_interrupt_handler_dispatch(vector);
|
bsp_interrupt_handler_dispatch(vector);
|
||||||
|
|
||||||
/* Restore program status register */
|
/* Restore program status register */
|
||||||
arm_status_restore(psr);
|
arm_status_restore(psr);
|
||||||
|
|
||||||
/* Acknowledge interrupt */
|
/* Acknowledge interrupt */
|
||||||
VICVectAddr = 0;
|
VICVectAddr = 0;
|
||||||
#else
|
|
||||||
rtems_vector_number vector =
|
|
||||||
ARMV7M_SCB_ICSR_VECTACTIVE_GET(_ARMV7M_SCB->icsr);
|
|
||||||
|
|
||||||
_ARMV7M_Interrupt_service_enter();
|
|
||||||
bsp_interrupt_handler_dispatch(ARMV7M_IRQ_OF_VECTOR(vector));
|
|
||||||
_ARMV7M_Interrupt_service_leave();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* ARM_MULTILIB_ARCH_V4 */
|
||||||
|
|||||||
@@ -61,86 +61,61 @@ unsigned lpc24xx_irq_get_priority(rtems_vector_number vector)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ARM_MULTILIB_ARCH_V4
|
||||||
|
|
||||||
rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
|
rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
|
||||||
{
|
{
|
||||||
#ifdef ARM_MULTILIB_ARCH_V4
|
VICIntEnable = 1U << vector;
|
||||||
VICIntEnable = 1U << vector;
|
|
||||||
#else
|
|
||||||
_ARMV7M_NVIC_Set_enable((int) vector);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return RTEMS_SUCCESSFUL;
|
return RTEMS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
|
rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
|
||||||
{
|
{
|
||||||
#ifdef ARM_MULTILIB_ARCH_V4
|
VICIntEnClear = 1U << vector;
|
||||||
VICIntEnClear = 1U << vector;
|
|
||||||
#else
|
|
||||||
_ARMV7M_NVIC_Clear_enable((int) vector);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return RTEMS_SUCCESSFUL;
|
return RTEMS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtems_status_code bsp_interrupt_facility_initialize(void)
|
rtems_status_code bsp_interrupt_facility_initialize(void)
|
||||||
{
|
{
|
||||||
#ifdef ARM_MULTILIB_ARCH_V4
|
volatile uint32_t *addr = VICVectAddrBase;
|
||||||
volatile uint32_t *addr = VICVectAddrBase;
|
volatile uint32_t *prio = VICVectPriorityBase;
|
||||||
volatile uint32_t *prio = VICVectPriorityBase;
|
rtems_vector_number i = 0;
|
||||||
rtems_vector_number i = 0;
|
|
||||||
|
|
||||||
/* Disable all interrupts */
|
/* Disable all interrupts */
|
||||||
VICIntEnClear = 0xffffffff;
|
VICIntEnClear = 0xffffffff;
|
||||||
|
|
||||||
/* Clear all software interrupts */
|
/* Clear all software interrupts */
|
||||||
VICSoftIntClear = 0xffffffff;
|
VICSoftIntClear = 0xffffffff;
|
||||||
|
|
||||||
/* Use IRQ category */
|
/* Use IRQ category */
|
||||||
VICIntSelect = 0;
|
VICIntSelect = 0;
|
||||||
|
|
||||||
for (i = BSP_INTERRUPT_VECTOR_MIN; i <= BSP_INTERRUPT_VECTOR_MAX; ++i) {
|
for (i = BSP_INTERRUPT_VECTOR_MIN; i <= BSP_INTERRUPT_VECTOR_MAX; ++i) {
|
||||||
/* Use the vector address register to store the vector number */
|
/* Use the vector address register to store the vector number */
|
||||||
addr [i] = i;
|
addr [i] = i;
|
||||||
|
|
||||||
/* Give vector lowest priority */
|
/* Give vector lowest priority */
|
||||||
prio [i] = 15;
|
prio [i] = 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reset priority mask register */
|
/* Reset priority mask register */
|
||||||
VICSWPrioMask = 0xffff;
|
VICSWPrioMask = 0xffff;
|
||||||
|
|
||||||
/* Acknowledge interrupts for all priorities */
|
/* Acknowledge interrupts for all priorities */
|
||||||
for (
|
for (
|
||||||
i = LPC24XX_IRQ_PRIORITY_VALUE_MIN;
|
i = LPC24XX_IRQ_PRIORITY_VALUE_MIN;
|
||||||
i <= LPC24XX_IRQ_PRIORITY_VALUE_MAX;
|
i <= LPC24XX_IRQ_PRIORITY_VALUE_MAX;
|
||||||
++i
|
++i
|
||||||
) {
|
) {
|
||||||
VICVectAddr = 0;
|
VICVectAddr = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Install the IRQ exception handler */
|
/* Install the IRQ exception handler */
|
||||||
_CPU_ISR_install_vector(ARM_EXCEPTION_IRQ, arm_exc_interrupt, NULL);
|
_CPU_ISR_install_vector(ARM_EXCEPTION_IRQ, arm_exc_interrupt, NULL);
|
||||||
#else
|
|
||||||
rtems_vector_number i = 0;
|
|
||||||
ARMV7M_Exception_handler *vector_table =
|
|
||||||
(ARMV7M_Exception_handler *) bsp_vector_table_begin;
|
|
||||||
|
|
||||||
memcpy(
|
|
||||||
vector_table,
|
|
||||||
bsp_start_vector_table_begin,
|
|
||||||
(size_t) bsp_vector_table_size
|
|
||||||
);
|
|
||||||
|
|
||||||
for (i = BSP_INTERRUPT_VECTOR_MIN; i <= BSP_INTERRUPT_VECTOR_MAX; ++i) {
|
|
||||||
vector_table [ARMV7M_VECTOR_IRQ(i)] = bsp_interrupt_dispatch;
|
|
||||||
_ARMV7M_NVIC_Clear_enable(i);
|
|
||||||
_ARMV7M_NVIC_Clear_pending(i);
|
|
||||||
lpc24xx_irq_set_priority(i, LPC24XX_IRQ_PRIORITY_VALUE_MAX - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
_ARMV7M_SCB->vtor = vector_table;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return RTEMS_SUCCESSFUL;
|
return RTEMS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* ARM_MULTILIB_ARCH_V4 */
|
||||||
|
|||||||
@@ -101,6 +101,10 @@ $(PROJECT_INCLUDE)/bsp/lpc-lcd.h: ../shared/lpc/include/lpc-lcd.h $(PROJECT_INCL
|
|||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lpc-lcd.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lpc-lcd.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lpc-lcd.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lpc-lcd.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/armv7m-irq.h: ../shared/armv7m/include/armv7m-irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/armv7m-irq.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/armv7m-irq.h
|
||||||
|
|
||||||
$(PROJECT_INCLUDE)/bsp/dma.h: include/dma.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
$(PROJECT_INCLUDE)/bsp/dma.h: include/dma.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/dma.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/dma.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/dma.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/dma.h
|
||||||
|
|||||||
28
c/src/lib/libbsp/arm/shared/armv7m/include/armv7m-irq.h
Normal file
28
c/src/lib/libbsp/arm/shared/armv7m/include/armv7m-irq.h
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 Sebastian Huber. All rights reserved.
|
||||||
|
*
|
||||||
|
* embedded brains GmbH
|
||||||
|
* Obere Lagerstr. 30
|
||||||
|
* 82178 Puchheim
|
||||||
|
* Germany
|
||||||
|
* <rtems@embedded-brains.de>
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rtems.com/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LIBBSP_ARM_SHARED_ARMV7M_IRQ_H
|
||||||
|
#define LIBBSP_ARM_SHARED_ARMV7M_IRQ_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void _ARMV7M_NVIC_Interrupt_dispatch(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* LIBBSP_ARM_SHARED_ARMV7M_IRQ_H */
|
||||||
32
c/src/lib/libbsp/arm/shared/armv7m/irq/armv7m-irq-dispatch.c
Normal file
32
c/src/lib/libbsp/arm/shared/armv7m/irq/armv7m-irq-dispatch.c
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2011-2012 Sebastian Huber. All rights reserved.
|
||||||
|
*
|
||||||
|
* embedded brains GmbH
|
||||||
|
* Obere Lagerstr. 30
|
||||||
|
* 82178 Puchheim
|
||||||
|
* Germany
|
||||||
|
* <rtems@embedded-brains.de>
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rtems.com/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtems/score/armv7m.h>
|
||||||
|
|
||||||
|
#include <bsp/irq-generic.h>
|
||||||
|
#include <bsp/armv7m-irq.h>
|
||||||
|
|
||||||
|
#ifdef ARM_MULTILIB_ARCH_V7M
|
||||||
|
|
||||||
|
void _ARMV7M_NVIC_Interrupt_dispatch(void)
|
||||||
|
{
|
||||||
|
rtems_vector_number vector =
|
||||||
|
ARMV7M_SCB_ICSR_VECTACTIVE_GET(_ARMV7M_SCB->icsr);
|
||||||
|
|
||||||
|
_ARMV7M_Interrupt_service_enter();
|
||||||
|
bsp_interrupt_handler_dispatch(ARMV7M_IRQ_OF_VECTOR(vector));
|
||||||
|
_ARMV7M_Interrupt_service_leave();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARM_MULTILIB_ARCH_V7M */
|
||||||
63
c/src/lib/libbsp/arm/shared/armv7m/irq/armv7m-irq.c
Normal file
63
c/src/lib/libbsp/arm/shared/armv7m/irq/armv7m-irq.c
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2011-2012 Sebastian Huber. All rights reserved.
|
||||||
|
*
|
||||||
|
* embedded brains GmbH
|
||||||
|
* Obere Lagerstr. 30
|
||||||
|
* 82178 Puchheim
|
||||||
|
* Germany
|
||||||
|
* <rtems@embedded-brains.de>
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rtems.com/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtems/score/armv7m.h>
|
||||||
|
|
||||||
|
#include <bsp.h>
|
||||||
|
#include <bsp/irq.h>
|
||||||
|
#include <bsp/irq-generic.h>
|
||||||
|
#include <bsp/linker-symbols.h>
|
||||||
|
#include <bsp/armv7m-irq.h>
|
||||||
|
|
||||||
|
#ifdef ARM_MULTILIB_ARCH_V7M
|
||||||
|
|
||||||
|
rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
|
||||||
|
{
|
||||||
|
_ARMV7M_NVIC_Set_enable((int) vector);
|
||||||
|
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
|
||||||
|
{
|
||||||
|
_ARMV7M_NVIC_Clear_enable((int) vector);
|
||||||
|
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rtems_status_code bsp_interrupt_facility_initialize(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
ARMV7M_Exception_handler *vector_table =
|
||||||
|
(ARMV7M_Exception_handler *) bsp_vector_table_begin;
|
||||||
|
|
||||||
|
memcpy(
|
||||||
|
vector_table,
|
||||||
|
bsp_start_vector_table_begin,
|
||||||
|
(size_t) bsp_vector_table_size
|
||||||
|
);
|
||||||
|
|
||||||
|
for (i = BSP_INTERRUPT_VECTOR_MIN; i <= BSP_INTERRUPT_VECTOR_MAX; ++i) {
|
||||||
|
vector_table [ARMV7M_VECTOR_IRQ(i)] = _ARMV7M_NVIC_Interrupt_dispatch;
|
||||||
|
_ARMV7M_NVIC_Clear_enable(i);
|
||||||
|
_ARMV7M_NVIC_Clear_pending(i);
|
||||||
|
_ARMV7M_NVIC_Set_priority(i, ARMV7M_EXCEPTION_PRIORITY_LOWEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
_ARMV7M_SCB->vtor = vector_table;
|
||||||
|
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARM_MULTILIB_ARCH_V7M */
|
||||||
Reference in New Issue
Block a user