bsps: Shared ARMv7-M interrupt support

This commit is contained in:
Sebastian Huber
2012-03-24 22:53:07 +01:00
parent 0f31fddcac
commit bd0fb473c3
11 changed files with 184 additions and 129 deletions

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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

View File

@@ -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 */
/** @} */

View File

@@ -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 */

View File

@@ -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 */

View File

@@ -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

View 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 */

View 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 */

View 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 */