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

4.104.115
Last change on this file since 47adf3f was 47adf3f, checked in by Sebastian Huber <sebastian.huber@…>, on 04/30/10 at 13:49:15

2010-04-30 Sebastian Huber <sebastian.huber@…>

  • include/irq-config.h: Removed file.
  • Makefile.am, preinstall.am: Reflect change above.
  • irq/irq.c: Removed superfluous parameter checks.
  • 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_get_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  VICIntEnable = 1U << vector;
72
73  return RTEMS_SUCCESSFUL;
74}
75
76rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
77{
78  VICIntEnClear = 1U << vector;
79
80  return RTEMS_SUCCESSFUL;
81}
82
83rtems_status_code bsp_interrupt_facility_initialize(void)
84{
85  volatile uint32_t *addr = VICVectAddrBase;
86  volatile uint32_t *prio = VICVectPriorityBase;
87  rtems_vector_number i = 0;
88
89  /* Disable all interrupts */
90  VICIntEnClear = 0xffffffff;
91
92  /* Clear all software interrupts */
93  VICSoftIntClear = 0xffffffff;
94
95  /* Use IRQ category */
96  VICIntSelect = 0;
97
98  for (i = BSP_INTERRUPT_VECTOR_MIN; i <= BSP_INTERRUPT_VECTOR_MAX; ++i) {
99    /* Use the vector address register to store the vector number */
100    addr [i] = i;
101
102    /* Give vector lowest priority */
103    prio [i] = 15;
104  }
105
106  /* Reset priority mask register */
107  VICSWPrioMask = 0xffff;
108
109  /* Acknowledge interrupts for all priorities */
110  for (i = LPC24XX_IRQ_PRIORITY_VALUE_MIN; i <= LPC24XX_IRQ_PRIORITY_VALUE_MAX; ++i) {
111    VICVectAddr = 0;
112  }
113
114  /* Install the IRQ exception handler */
115  _CPU_ISR_install_vector(ARM_EXCEPTION_IRQ, arm_exc_interrupt, NULL);
116
117  return RTEMS_SUCCESSFUL;
118}
119
120void bsp_interrupt_handler_default(rtems_vector_number vector)
121{
122  printk("spurious interrupt: %u\n", vector);
123}
Note: See TracBrowser for help on using the repository browser.