source: rtems/bsps/arm/lpc24xx/irq/irq.c

Last change on this file was bcef89f2, checked in by Sebastian Huber <sebastian.huber@…>, on 05/19/23 at 06:18:25

Update company name

The embedded brains GmbH & Co. KG is the legal successor of embedded
brains GmbH.

  • Property mode set to 100644
File size: 4.8 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 * @file
5 *
6 * @ingroup RTEMSImplClassicIntr
7 *
8 * @brief LPC24XX interrupt support.
9 */
10
11/*
12 * Copyright (C) 2008, 2012 embedded brains GmbH & Co. KG
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 * 1. Redistributions of source code must retain the above copyright
18 *    notice, this list of conditions and the following disclaimer.
19 * 2. Redistributions in binary form must reproduce the above copyright
20 *    notice, this list of conditions and the following disclaimer in the
21 *    documentation and/or other materials provided with the distribution.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 */
35
36#include <rtems/score/armv4.h>
37#include <rtems/score/armv7m.h>
38
39#include <bsp.h>
40#include <bsp/irq.h>
41#include <bsp/irq-generic.h>
42#include <bsp/lpc24xx.h>
43#include <bsp/linker-symbols.h>
44
45static inline bool lpc24xx_irq_is_valid(rtems_vector_number vector)
46{
47  return vector < BSP_INTERRUPT_VECTOR_COUNT;
48}
49
50void lpc24xx_irq_set_priority(rtems_vector_number vector, unsigned priority)
51{
52  if (lpc24xx_irq_is_valid(vector)) {
53    if (priority > LPC24XX_IRQ_PRIORITY_VALUE_MAX) {
54      priority = LPC24XX_IRQ_PRIORITY_VALUE_MAX;
55    }
56
57    #ifdef ARM_MULTILIB_ARCH_V4
58      VICVectPriorityBase [vector] = priority;
59    #else
60      _ARMV7M_NVIC_Set_priority((int) vector, (int) (priority << 3));
61    #endif
62  }
63}
64
65unsigned lpc24xx_irq_get_priority(rtems_vector_number vector)
66{
67  if (lpc24xx_irq_is_valid(vector)) {
68    #ifdef ARM_MULTILIB_ARCH_V4
69      return VICVectPriorityBase [vector];
70    #else
71      return (unsigned) (_ARMV7M_NVIC_Get_priority((int) vector) >> 3);
72    #endif
73  } else {
74    return LPC24XX_IRQ_PRIORITY_VALUE_MIN - 1U;
75  }
76}
77
78#ifdef ARM_MULTILIB_ARCH_V4
79
80rtems_status_code bsp_interrupt_get_attributes(
81  rtems_vector_number         vector,
82  rtems_interrupt_attributes *attributes
83)
84{
85  return RTEMS_SUCCESSFUL;
86}
87
88rtems_status_code bsp_interrupt_is_pending(
89  rtems_vector_number vector,
90  bool               *pending
91)
92{
93  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
94  bsp_interrupt_assert(pending != NULL);
95  *pending = false;
96  return RTEMS_UNSATISFIED;
97}
98
99rtems_status_code bsp_interrupt_raise(rtems_vector_number vector)
100{
101  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
102  return RTEMS_UNSATISFIED;
103}
104
105rtems_status_code bsp_interrupt_clear(rtems_vector_number vector)
106{
107  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
108  return RTEMS_UNSATISFIED;
109}
110
111rtems_status_code bsp_interrupt_vector_is_enabled(
112  rtems_vector_number vector,
113  bool               *enabled
114)
115{
116  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
117  bsp_interrupt_assert(enabled != NULL);
118  *enabled = false;
119  return RTEMS_UNSATISFIED;
120}
121
122rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
123{
124  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
125  VICIntEnable = 1U << vector;
126  return RTEMS_SUCCESSFUL;
127}
128
129rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
130{
131  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
132  VICIntEnClear = 1U << vector;
133  return RTEMS_SUCCESSFUL;
134}
135
136void bsp_interrupt_facility_initialize(void)
137{
138  volatile uint32_t *addr = VICVectAddrBase;
139  volatile uint32_t *prio = VICVectPriorityBase;
140  rtems_vector_number i = 0;
141
142  /* Disable all interrupts */
143  VICIntEnClear = 0xffffffff;
144
145  /* Clear all software interrupts */
146  VICSoftIntClear = 0xffffffff;
147
148  /* Use IRQ category */
149  VICIntSelect = 0;
150
151  for (i = 0; i < BSP_INTERRUPT_VECTOR_COUNT; ++i) {
152    /* Use the vector address register to store the vector number */
153    addr [i] = i;
154
155    /* Give vector lowest priority */
156    prio [i] = 15;
157  }
158
159  /* Reset priority mask register */
160  VICSWPrioMask = 0xffff;
161
162  /* Acknowledge interrupts for all priorities */
163  for (
164    i = LPC24XX_IRQ_PRIORITY_VALUE_MIN;
165    i <= LPC24XX_IRQ_PRIORITY_VALUE_MAX;
166    ++i
167  ) {
168    VICVectAddr = 0;
169  }
170
171  /* Install the IRQ exception handler */
172  _CPU_ISR_install_vector(ARM_EXCEPTION_IRQ, _ARMV4_Exception_interrupt, NULL);
173}
174
175#endif /* ARM_MULTILIB_ARCH_V4 */
Note: See TracBrowser for help on using the repository browser.