summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/arm/lpc24xx/irq/irq.c')
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/irq/irq.c56
1 files changed, 47 insertions, 9 deletions
diff --git a/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c b/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c
index 00275418bd..72165c0501 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c
@@ -7,8 +7,8 @@
*/
/*
- * Copyright (c) 2008
- * Embedded Brains GmbH
+ * Copyright (c) 2008, 2009
+ * embedded brains GmbH
* Obere Lagerstr. 30
* D-82178 Puchheim
* Germany
@@ -23,32 +23,70 @@
#include <bsp/irq-generic.h>
#include <bsp/lpc24xx.h>
-void ExecuteITHandler( void)
+static inline bool lpc24xx_irq_is_valid( rtems_vector_number vector)
+{
+ return vector <= BSP_INTERRUPT_VECTOR_MAX;
+}
+
+void lpc24xx_irq_set_priority( rtems_vector_number vector, unsigned priority)
+{
+ if (lpc24xx_irq_is_valid( vector)) {
+ if (priority > LPC24XX_IRQ_PRIORITY_VALUE_MAX) {
+ priority = LPC24XX_IRQ_PRIORITY_VALUE_MAX;
+ }
+
+ VICVectPriorityBase [vector] = priority;
+ }
+}
+
+unsigned lpc24xx_irq_priority( rtems_vector_number vector)
+{
+ if (lpc24xx_irq_is_valid( vector)) {
+ return VICVectPriorityBase [vector];
+ } else {
+ return LPC24XX_IRQ_PRIORITY_VALUE_MIN - 1;
+ }
+}
+
+void bsp_interrupt_dispatch( void)
{
/* Read current vector number */
rtems_vector_number vector = VICVectAddr;
- /* Acknowledge interrupt */
- VICVectAddr = 0;
+ /* Enable interrupts in program status register */
+ uint32_t psr = arm_status_irq_enable();
/* Dispatch interrupt handlers */
bsp_interrupt_handler_dispatch( vector);
+
+ /* Restore program status register */
+ arm_status_restore( psr);
+
+ /* Acknowledge interrupt */
+ VICVectAddr = 0;
}
rtems_status_code bsp_interrupt_vector_enable( rtems_vector_number vector)
{
- VICIntEnable = 1U << vector;
+ if (lpc24xx_irq_is_valid( vector)) {
+ VICIntEnable = 1U << vector;
+ }
return RTEMS_SUCCESSFUL;
}
rtems_status_code bsp_interrupt_vector_disable( rtems_vector_number vector)
{
- VICIntEnClear = 1U << vector;
+ if (lpc24xx_irq_is_valid( vector)) {
+ VICIntEnClear = 1U << vector;
+ }
return RTEMS_SUCCESSFUL;
}
+/* FIXME */
+void arm_exc_interrupt( void);
+
rtems_status_code bsp_interrupt_facility_initialize( void)
{
volatile uint32_t *addr = VICVectAddrBase;
@@ -79,12 +117,12 @@ rtems_status_code bsp_interrupt_facility_initialize( void)
VICVectAddr = 0;
/* Install the IRQ exception handler */
- _CPU_ISR_install_vector( ARM_EXCEPTION_IRQ, _ISR_Handler, NULL);
+ _CPU_ISR_install_vector( ARM_EXCEPTION_IRQ, arm_exc_interrupt, NULL);
return RTEMS_SUCCESSFUL;
}
void bsp_interrupt_handler_default( rtems_vector_number vector)
{
- printk( "Spurious interrupt: %u\n", vector);
+ printk( "spurious interrupt: %u\n", vector);
}