source: rtems/c/src/lib/libbsp/arm/shared/armv7m/irq/armv7m-irq.c @ ce3ac00

5
Last change on this file since ce3ac00 was ce3ac00, checked in by Christian Mauderer <Christian.Mauderer@…>, on 06/06/17 at 13:41:48

bsps/arm: Fix ARMv7-M interrupt suppport

Enable/disable vector routines now check for a valid vector. Without
these guards, the enable/disable vector routines will not work with the
interrupt server.

  • Property mode set to 100644
File size: 1.7 KB
Line 
1/*
2 * Copyright (c) 2011-2012 Sebastian Huber.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Obere Lagerstr. 30
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * The license and distribution terms for this file may be
11 * found in the file LICENSE in this distribution or at
12 * http://www.rtems.org/license/LICENSE.
13 */
14
15#include <rtems/score/armv7m.h>
16
17#include <bsp.h>
18#include <bsp/irq.h>
19#include <bsp/irq-generic.h>
20#include <bsp/linker-symbols.h>
21#include <bsp/armv7m-irq.h>
22
23#ifdef ARM_MULTILIB_ARCH_V7M
24
25rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
26{
27  if (bsp_interrupt_is_valid_vector(vector)) {
28    _ARMV7M_NVIC_Set_enable((int) vector);
29  }
30
31  return RTEMS_SUCCESSFUL;
32}
33
34rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
35{
36  if (bsp_interrupt_is_valid_vector(vector)) {
37    _ARMV7M_NVIC_Clear_enable((int) vector);
38  }
39
40  return RTEMS_SUCCESSFUL;
41}
42
43rtems_status_code bsp_interrupt_facility_initialize(void)
44{
45  int i;
46  ARMV7M_Exception_handler *vector_table =
47    (ARMV7M_Exception_handler *) bsp_vector_table_begin;
48
49  if (bsp_vector_table_begin != bsp_start_vector_table_begin) {
50    memcpy(
51      vector_table,
52      bsp_start_vector_table_begin,
53      (size_t) bsp_vector_table_size
54    );
55  }
56
57  _ARMV7M_SCB->icsr = ARMV7M_SCB_ICSR_PENDSVCLR | ARMV7M_SCB_ICSR_PENDSTCLR;
58
59  for (i = BSP_INTERRUPT_VECTOR_MIN; i <= BSP_INTERRUPT_VECTOR_MAX; ++i) {
60    vector_table [ARMV7M_VECTOR_IRQ(i)] = _ARMV7M_NVIC_Interrupt_dispatch;
61    _ARMV7M_NVIC_Clear_enable(i);
62    _ARMV7M_NVIC_Clear_pending(i);
63    _ARMV7M_NVIC_Set_priority(i, BSP_ARMV7M_IRQ_PRIORITY_DEFAULT);
64  }
65
66  _ARMV7M_SCB->vtor = vector_table;
67
68  return RTEMS_SUCCESSFUL;
69}
70
71#endif /* ARM_MULTILIB_ARCH_V7M */
Note: See TracBrowser for help on using the repository browser.