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

4.115
Last change on this file since 0f31fddc was 0f31fddc, checked in by Sebastian Huber <sebastian.huber@…>, on 03/24/12 at 21:01:08

bsps: Add shared default IRQ handler

  • Property mode set to 100644
File size: 3.5 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup bsp_interrupt
5 *
6 * @brief LPC24XX interrupt support.
7 */
8
9/*
10 * Copyright (c) 2008-2012 embedded brains GmbH.  All rights reserved.
11 *
12 *  embedded brains GmbH
13 *  Obere Lagerstr. 30
14 *  82178 Puchheim
15 *  Germany
16 *  <rtems@embedded-brains.de>
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.com/license/LICENSE.
21 */
22
23#include <rtems/score/armv7m.h>
24
25#include <bsp.h>
26#include <bsp/irq.h>
27#include <bsp/irq-generic.h>
28#include <bsp/lpc24xx.h>
29#include <bsp/linker-symbols.h>
30
31static inline bool lpc24xx_irq_is_valid(rtems_vector_number vector)
32{
33  return vector <= BSP_INTERRUPT_VECTOR_MAX;
34}
35
36void lpc24xx_irq_set_priority(rtems_vector_number vector, unsigned priority)
37{
38  if (lpc24xx_irq_is_valid(vector)) {
39    if (priority > LPC24XX_IRQ_PRIORITY_VALUE_MAX) {
40      priority = LPC24XX_IRQ_PRIORITY_VALUE_MAX;
41    }
42
43    #ifdef ARM_MULTILIB_ARCH_V4
44      VICVectPriorityBase [vector] = priority;
45    #else
46      _ARMV7M_NVIC_Set_priority((int) vector, (int) (priority << 3));
47    #endif
48  }
49}
50
51unsigned lpc24xx_irq_get_priority(rtems_vector_number vector)
52{
53  if (lpc24xx_irq_is_valid(vector)) {
54    #ifdef ARM_MULTILIB_ARCH_V4
55      return VICVectPriorityBase [vector];
56    #else
57      return (unsigned) (_ARMV7M_NVIC_Get_priority((int) vector) >> 3);
58    #endif
59  } else {
60    return LPC24XX_IRQ_PRIORITY_VALUE_MIN - 1U;
61  }
62}
63
64rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
65{
66  #ifdef ARM_MULTILIB_ARCH_V4
67    VICIntEnable = 1U << vector;
68  #else
69    _ARMV7M_NVIC_Set_enable((int) vector);
70  #endif
71
72  return RTEMS_SUCCESSFUL;
73}
74
75rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
76{
77  #ifdef ARM_MULTILIB_ARCH_V4
78    VICIntEnClear = 1U << vector;
79  #else
80    _ARMV7M_NVIC_Clear_enable((int) vector);
81  #endif
82
83  return RTEMS_SUCCESSFUL;
84}
85
86rtems_status_code bsp_interrupt_facility_initialize(void)
87{
88  #ifdef ARM_MULTILIB_ARCH_V4
89    volatile uint32_t *addr = VICVectAddrBase;
90    volatile uint32_t *prio = VICVectPriorityBase;
91    rtems_vector_number i = 0;
92
93    /* Disable all interrupts */
94    VICIntEnClear = 0xffffffff;
95
96    /* Clear all software interrupts */
97    VICSoftIntClear = 0xffffffff;
98
99    /* Use IRQ category */
100    VICIntSelect = 0;
101
102    for (i = BSP_INTERRUPT_VECTOR_MIN; i <= BSP_INTERRUPT_VECTOR_MAX; ++i) {
103      /* Use the vector address register to store the vector number */
104      addr [i] = i;
105
106      /* Give vector lowest priority */
107      prio [i] = 15;
108    }
109
110    /* Reset priority mask register */
111    VICSWPrioMask = 0xffff;
112
113    /* Acknowledge interrupts for all priorities */
114    for (
115      i = LPC24XX_IRQ_PRIORITY_VALUE_MIN;
116      i <= LPC24XX_IRQ_PRIORITY_VALUE_MAX;
117      ++i
118    ) {
119      VICVectAddr = 0;
120    }
121
122    /* Install the IRQ exception handler */
123    _CPU_ISR_install_vector(ARM_EXCEPTION_IRQ, arm_exc_interrupt, NULL);
124  #else
125    rtems_vector_number i = 0;
126    ARMV7M_Exception_handler *vector_table =
127      (ARMV7M_Exception_handler *) bsp_vector_table_begin;
128
129    memcpy(
130      vector_table,
131      bsp_start_vector_table_begin,
132      (size_t) bsp_vector_table_size
133    );
134
135    for (i = BSP_INTERRUPT_VECTOR_MIN; i <= BSP_INTERRUPT_VECTOR_MAX; ++i) {
136      vector_table [ARMV7M_VECTOR_IRQ(i)] = bsp_interrupt_dispatch;
137      _ARMV7M_NVIC_Clear_enable(i);
138      _ARMV7M_NVIC_Clear_pending(i);
139      lpc24xx_irq_set_priority(i, LPC24XX_IRQ_PRIORITY_VALUE_MAX - 1);
140    }
141
142    _ARMV7M_SCB->vtor = vector_table;
143  #endif
144
145  return RTEMS_SUCCESSFUL;
146}
Note: See TracBrowser for help on using the repository browser.