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

Last change on this file since ba619b7f was ba619b7f, checked in by Joel Sherrill <joel@…>, on 03/01/22 at 21:38:20

bsps/arm/: Scripted embedded brains header file clean up

Updates #4625.

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