diff options
Diffstat (limited to 'c/src/lib/libbsp/arm/lpc24xx/irq/irq.c')
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/irq/irq.c | 56 |
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); } |