source: rtems/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c @ ba938b8d

4.104.115
Last change on this file since ba938b8d was ba938b8d, checked in by Thomas Doerfler <Thomas.Doerfler@…>, on 09/18/09 at 08:05:40

Changes throughout.

  • Property mode set to 100644
File size: 2.8 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup bsp_interrupt
5 *
6 * @brief LPC24XX interrupt support.
7 */
8
9/*
10 * Copyright (c) 2008, 2009
11 * embedded brains GmbH
12 * Obere Lagerstr. 30
13 * D-82178 Puchheim
14 * Germany
15 * rtems@embedded-brains.de
16 *
17 * The license and distribution terms for this file may be found in the file
18 * LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
19 */
20
21#include <bsp.h>
22#include <bsp/irq.h>
23#include <bsp/irq-generic.h>
24#include <bsp/lpc24xx.h>
25
26static inline bool lpc24xx_irq_is_valid( rtems_vector_number vector)
27{
28  return vector <= BSP_INTERRUPT_VECTOR_MAX;
29}
30
31void lpc24xx_irq_set_priority( rtems_vector_number vector, unsigned priority)
32{
33  if (lpc24xx_irq_is_valid( vector)) {
34    if (priority > LPC24XX_IRQ_PRIORITY_VALUE_MAX) {
35      priority = LPC24XX_IRQ_PRIORITY_VALUE_MAX;
36    }
37
38    VICVectPriorityBase [vector] = priority;
39  }
40}
41
42unsigned lpc24xx_irq_priority( rtems_vector_number vector)
43{
44  if (lpc24xx_irq_is_valid( vector)) {
45    return VICVectPriorityBase [vector];
46  } else {
47    return LPC24XX_IRQ_PRIORITY_VALUE_MIN - 1U;
48  }
49}
50
51void bsp_interrupt_dispatch( void)
52{
53  /* Read current vector number */
54  rtems_vector_number vector = VICVectAddr;
55
56  /* Enable interrupts in program status register */
57  uint32_t psr = arm_status_irq_enable();
58
59  /* Dispatch interrupt handlers */
60  bsp_interrupt_handler_dispatch( vector);
61
62  /* Restore program status register */
63  arm_status_restore( psr);
64
65  /* Acknowledge interrupt */
66  VICVectAddr = 0;
67}
68
69rtems_status_code bsp_interrupt_vector_enable( rtems_vector_number vector)
70{
71  if (lpc24xx_irq_is_valid( vector)) {
72    VICIntEnable = 1U << vector;
73  }
74
75  return RTEMS_SUCCESSFUL;
76}
77
78rtems_status_code bsp_interrupt_vector_disable( rtems_vector_number vector)
79{
80  if (lpc24xx_irq_is_valid( vector)) {
81    VICIntEnClear = 1U << vector;
82  }
83
84  return RTEMS_SUCCESSFUL;
85}
86
87/* FIXME */
88void arm_exc_interrupt( void);
89
90rtems_status_code bsp_interrupt_facility_initialize( void)
91{
92  volatile uint32_t *addr = VICVectAddrBase;
93  volatile uint32_t *prio = VICVectPriorityBase;
94  rtems_vector_number i = 0;
95
96  /* Disable all interrupts */
97  VICIntEnClear = 0xffffffff;
98
99  /* Clear all software interrupts */
100  VICSoftIntClear = 0xffffffff;
101
102  /* Use IRQ category */
103  VICIntSelect = 0;
104
105  for (i = BSP_INTERRUPT_VECTOR_MIN; i <= BSP_INTERRUPT_VECTOR_MAX; ++i) {
106    /* Use the vector address register to store the vector number */
107    addr [i] = i;
108
109    /* Give vector lowest priority */
110    prio [i] = 15;
111  }
112
113  /* Reset priority mask register */
114  VICSWPrioMask = 0xffff;
115
116  /* Acknowledge interrupt */
117  VICVectAddr = 0;
118
119  /* Install the IRQ exception handler */
120  _CPU_ISR_install_vector( ARM_EXCEPTION_IRQ, arm_exc_interrupt, NULL);
121
122  return RTEMS_SUCCESSFUL;
123}
124
125void bsp_interrupt_handler_default( rtems_vector_number vector)
126{
127  printk( "spurious interrupt: %u\n", vector);
128}
Note: See TracBrowser for help on using the repository browser.