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/tod.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/uart.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-server.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
|
||||
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
|
||||
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)
|
||||
$(INSTALL_DATA) $< $(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-dma.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/i2c.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-server.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-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);
|
||||
|
||||
void bsp_interrupt_dispatch(void);
|
||||
|
||||
#endif /* ASM */
|
||||
|
||||
/** @} */
|
||||
|
||||
@@ -20,36 +20,29 @@
|
||||
* 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/lpc24xx.h>
|
||||
|
||||
#ifdef ARM_MULTILIB_ARCH_V4
|
||||
|
||||
void bsp_interrupt_dispatch(void)
|
||||
{
|
||||
#ifdef ARM_MULTILIB_ARCH_V4
|
||||
/* Read current vector number */
|
||||
rtems_vector_number vector = VICVectAddr;
|
||||
/* Read current vector number */
|
||||
rtems_vector_number vector = VICVectAddr;
|
||||
|
||||
/* Enable interrupts in program status register */
|
||||
uint32_t psr = arm_status_irq_enable();
|
||||
/* Enable interrupts in program status register */
|
||||
uint32_t psr = arm_status_irq_enable();
|
||||
|
||||
/* Dispatch interrupt handlers */
|
||||
bsp_interrupt_handler_dispatch(vector);
|
||||
/* Dispatch interrupt handlers */
|
||||
bsp_interrupt_handler_dispatch(vector);
|
||||
|
||||
/* Restore program status register */
|
||||
arm_status_restore(psr);
|
||||
/* Restore program status register */
|
||||
arm_status_restore(psr);
|
||||
|
||||
/* Acknowledge interrupt */
|
||||
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
|
||||
/* Acknowledge interrupt */
|
||||
VICVectAddr = 0;
|
||||
}
|
||||
|
||||
#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)
|
||||
{
|
||||
#ifdef ARM_MULTILIB_ARCH_V4
|
||||
VICIntEnable = 1U << vector;
|
||||
#else
|
||||
_ARMV7M_NVIC_Set_enable((int) vector);
|
||||
#endif
|
||||
VICIntEnable = 1U << vector;
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
|
||||
{
|
||||
#ifdef ARM_MULTILIB_ARCH_V4
|
||||
VICIntEnClear = 1U << vector;
|
||||
#else
|
||||
_ARMV7M_NVIC_Clear_enable((int) vector);
|
||||
#endif
|
||||
VICIntEnClear = 1U << vector;
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
rtems_status_code bsp_interrupt_facility_initialize(void)
|
||||
{
|
||||
#ifdef ARM_MULTILIB_ARCH_V4
|
||||
volatile uint32_t *addr = VICVectAddrBase;
|
||||
volatile uint32_t *prio = VICVectPriorityBase;
|
||||
rtems_vector_number i = 0;
|
||||
volatile uint32_t *addr = VICVectAddrBase;
|
||||
volatile uint32_t *prio = VICVectPriorityBase;
|
||||
rtems_vector_number i = 0;
|
||||
|
||||
/* Disable all interrupts */
|
||||
VICIntEnClear = 0xffffffff;
|
||||
/* Disable all interrupts */
|
||||
VICIntEnClear = 0xffffffff;
|
||||
|
||||
/* Clear all software interrupts */
|
||||
VICSoftIntClear = 0xffffffff;
|
||||
/* Clear all software interrupts */
|
||||
VICSoftIntClear = 0xffffffff;
|
||||
|
||||
/* Use IRQ category */
|
||||
VICIntSelect = 0;
|
||||
/* Use IRQ category */
|
||||
VICIntSelect = 0;
|
||||
|
||||
for (i = BSP_INTERRUPT_VECTOR_MIN; i <= BSP_INTERRUPT_VECTOR_MAX; ++i) {
|
||||
/* Use the vector address register to store the vector number */
|
||||
addr [i] = i;
|
||||
for (i = BSP_INTERRUPT_VECTOR_MIN; i <= BSP_INTERRUPT_VECTOR_MAX; ++i) {
|
||||
/* Use the vector address register to store the vector number */
|
||||
addr [i] = i;
|
||||
|
||||
/* Give vector lowest priority */
|
||||
prio [i] = 15;
|
||||
}
|
||||
/* Give vector lowest priority */
|
||||
prio [i] = 15;
|
||||
}
|
||||
|
||||
/* Reset priority mask register */
|
||||
VICSWPrioMask = 0xffff;
|
||||
/* Reset priority mask register */
|
||||
VICSWPrioMask = 0xffff;
|
||||
|
||||
/* Acknowledge interrupts for all priorities */
|
||||
for (
|
||||
i = LPC24XX_IRQ_PRIORITY_VALUE_MIN;
|
||||
i <= LPC24XX_IRQ_PRIORITY_VALUE_MAX;
|
||||
++i
|
||||
) {
|
||||
VICVectAddr = 0;
|
||||
}
|
||||
/* Acknowledge interrupts for all priorities */
|
||||
for (
|
||||
i = LPC24XX_IRQ_PRIORITY_VALUE_MIN;
|
||||
i <= LPC24XX_IRQ_PRIORITY_VALUE_MAX;
|
||||
++i
|
||||
) {
|
||||
VICVectAddr = 0;
|
||||
}
|
||||
|
||||
/* Install the IRQ exception handler */
|
||||
_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
|
||||
/* Install the IRQ exception handler */
|
||||
_CPU_ISR_install_vector(ARM_EXCEPTION_IRQ, arm_exc_interrupt, NULL);
|
||||
|
||||
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
|
||||
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)
|
||||
$(INSTALL_DATA) $< $(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