source: rtems/bsps/arm/lpc24xx/irq/irq.c @ 32f5a195

Last change on this file since 32f5a195 was 32f5a195, checked in by Sebastian Huber <sebastian.huber@…>, on 06/29/21 at 12:06:03

bsps/irq: bsp_interrupt_vector_disable()

Return a status code for bsp_interrupt_vector_disable().

Update #3269.

  • Property mode set to 100644
File size: 3.8 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.org/license/LICENSE.
21 */
22
23#include <rtems/score/armv4.h>
24#include <rtems/score/armv7m.h>
25
26#include <bsp.h>
27#include <bsp/irq.h>
28#include <bsp/irq-generic.h>
29#include <bsp/lpc24xx.h>
30#include <bsp/linker-symbols.h>
31
32static inline bool lpc24xx_irq_is_valid(rtems_vector_number vector)
33{
34  return vector < BSP_INTERRUPT_VECTOR_COUNT;
35}
36
37void lpc24xx_irq_set_priority(rtems_vector_number vector, unsigned priority)
38{
39  if (lpc24xx_irq_is_valid(vector)) {
40    if (priority > LPC24XX_IRQ_PRIORITY_VALUE_MAX) {
41      priority = LPC24XX_IRQ_PRIORITY_VALUE_MAX;
42    }
43
44    #ifdef ARM_MULTILIB_ARCH_V4
45      VICVectPriorityBase [vector] = priority;
46    #else
47      _ARMV7M_NVIC_Set_priority((int) vector, (int) (priority << 3));
48    #endif
49  }
50}
51
52unsigned lpc24xx_irq_get_priority(rtems_vector_number vector)
53{
54  if (lpc24xx_irq_is_valid(vector)) {
55    #ifdef ARM_MULTILIB_ARCH_V4
56      return VICVectPriorityBase [vector];
57    #else
58      return (unsigned) (_ARMV7M_NVIC_Get_priority((int) vector) >> 3);
59    #endif
60  } else {
61    return LPC24XX_IRQ_PRIORITY_VALUE_MIN - 1U;
62  }
63}
64
65#ifdef ARM_MULTILIB_ARCH_V4
66
67rtems_status_code bsp_interrupt_get_attributes(
68  rtems_vector_number         vector,
69  rtems_interrupt_attributes *attributes
70)
71{
72  return RTEMS_SUCCESSFUL;
73}
74
75rtems_status_code bsp_interrupt_is_pending(
76  rtems_vector_number vector,
77  bool               *pending
78)
79{
80  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
81  bsp_interrupt_assert(pending != NULL);
82  *pending = false;
83  return RTEMS_UNSATISFIED;
84}
85
86rtems_status_code bsp_interrupt_raise(rtems_vector_number vector)
87{
88  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
89  return RTEMS_UNSATISFIED;
90}
91
92rtems_status_code bsp_interrupt_clear(rtems_vector_number vector)
93{
94  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
95  return RTEMS_UNSATISFIED;
96}
97
98rtems_status_code bsp_interrupt_vector_is_enabled(
99  rtems_vector_number vector,
100  bool               *enabled
101)
102{
103  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
104  bsp_interrupt_assert(enabled != NULL);
105  *enabled = false;
106  return RTEMS_UNSATISFIED;
107}
108
109rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
110{
111  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
112  VICIntEnable = 1U << vector;
113  return RTEMS_SUCCESSFUL;
114}
115
116rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
117{
118  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
119  VICIntEnClear = 1U << vector;
120  return RTEMS_SUCCESSFUL;
121}
122
123rtems_status_code bsp_interrupt_facility_initialize(void)
124{
125  volatile uint32_t *addr = VICVectAddrBase;
126  volatile uint32_t *prio = VICVectPriorityBase;
127  rtems_vector_number i = 0;
128
129  /* Disable all interrupts */
130  VICIntEnClear = 0xffffffff;
131
132  /* Clear all software interrupts */
133  VICSoftIntClear = 0xffffffff;
134
135  /* Use IRQ category */
136  VICIntSelect = 0;
137
138  for (i = 0; i < BSP_INTERRUPT_VECTOR_COUNT; ++i) {
139    /* Use the vector address register to store the vector number */
140    addr [i] = i;
141
142    /* Give vector lowest priority */
143    prio [i] = 15;
144  }
145
146  /* Reset priority mask register */
147  VICSWPrioMask = 0xffff;
148
149  /* Acknowledge interrupts for all priorities */
150  for (
151    i = LPC24XX_IRQ_PRIORITY_VALUE_MIN;
152    i <= LPC24XX_IRQ_PRIORITY_VALUE_MAX;
153    ++i
154  ) {
155    VICVectAddr = 0;
156  }
157
158  /* Install the IRQ exception handler */
159  _CPU_ISR_install_vector(ARM_EXCEPTION_IRQ, _ARMV4_Exception_interrupt, NULL);
160
161  return RTEMS_SUCCESSFUL;
162}
163
164#endif /* ARM_MULTILIB_ARCH_V4 */
Note: See TracBrowser for help on using the repository browser.