summaryrefslogtreecommitdiffhomepage
path: root/digital/zigbit/bitcloud/stack/Components/HAL/avr/common/src/irq.c
blob: c681ba7421cd6af0fcab601bc4eeadfeb6678d4e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/**************************************************************************//**
  \file  irq.c

  \brief Implementation of IRQ interface.

  \author
      Atmel Corporation: http://www.atmel.com \n
      Support email: avr@atmel.com

    Copyright (c) 2008-2011, Atmel Corporation. All rights reserved.
    Licensed under Atmel's Limited License Agreement (BitCloudTM).

  \internal
    History:
      5/12/07 A. Khromykh - Created
   ******************************************************************************/
/******************************************************************************
 *   WARNING: CHANGING THIS FILE MAY AFFECT CORE FUNCTIONALITY OF THE STACK.  *
 *   EXPERT USERS SHOULD PROCEED WITH CAUTION.                                *
 ******************************************************************************/

/******************************************************************************
                   Includes section
******************************************************************************/
#include <halIrq.h>

/******************************************************************************
                   External global variables section
******************************************************************************/
extern IrqCallback_t IrqCallbackList[HAL_NUM_IRQ_LINES];

/******************************************************************************
                   Implementations section
******************************************************************************/
/******************************************************************************
 Registers user's irqNumber interrupt
 Parameters:
   irqNumber - IRQ number
   irqMode   - Interrupt sence control
   f         - user's interrupt handler. Handler must be executed less than 100 us.
 Returns:
  -1 - if irqNumber is out of range, not valid irq mode, invalid interrupt handler
       or such interrupt has been already registered.
   0 - otherwise.
******************************************************************************/
int HAL_RegisterIrq(HAL_IrqNumber_t irqNumber, HAL_IrqMode_t irqMode, void (*f)(void))
{
  uint8_t irqOffsetNumber = irqNumber - HAL_FIRST_VALID_IRQ;

  // irqNumber is out of range
  if (irqOffsetNumber >= HAL_NUM_IRQ_LINES)
    return -1;
  // Such interrupt has been already register
  if (NULL != IrqCallbackList[irqOffsetNumber])
    return -1;
  // not valid irq mode
  if (IRQ_HIGH_LEVEL == irqMode)
    return -1;
  // invalid interrupt handler
  if (NULL == f)
    return -1;

  /* type HAL_IrqMode_t has not valid IRQ_HIGH_LEVEL state,
   * because for saving to register all states need decrement after IRQ_LOW_LEVEL state. */
  if (IRQ_LOW_LEVEL == irqMode)
    halSetIrqConfig(irqNumber, irqMode);
  else
    halSetIrqConfig(irqNumber, irqMode - 1);

  IrqCallbackList[irqOffsetNumber] = f;
  return 0;
}

/******************************************************************************
 Enables irqNumber interrupt
 Parameters:
   irqNumber - IRQ number
 Returns:
   -1 - if irqNumber is out of range or has not been
             registered yet.
   0 - otherwise.
******************************************************************************/
int HAL_EnableIrq(HAL_IrqNumber_t irqNumber)
{
  uint8_t irqOffsetNumber = irqNumber - HAL_FIRST_VALID_IRQ;
  // irqNumber is out of range
  if (irqOffsetNumber >= HAL_NUM_IRQ_LINES)
    return -1;
  // Interrupt has not been opened yet
  if (NULL == IrqCallbackList[irqOffsetNumber])
    return -1;
  halEnableIrqInterrupt(irqNumber);
  return 0;
}

/******************************************************************************
 Disables irqNumber interrupt
 Parameters:
   irqNumber - IRQ number
 Returns:
   -1 - if irqNumber is out of range or has not been
             registered yet.
   0 - otherwise.
******************************************************************************/
int HAL_DisableIrq(HAL_IrqNumber_t irqNumber)
{
  uint8_t irqOffsetNumber = irqNumber - HAL_FIRST_VALID_IRQ;
  // irqNumber is out of range
  if (irqOffsetNumber >= HAL_NUM_IRQ_LINES)
    return -1;
  // Interrupt has not been opened yet
  if (NULL == IrqCallbackList[irqOffsetNumber])
    return -1;
  halDisableIrqInterrupt(irqNumber);
  return 0;
}

/******************************************************************************
 Unregisters user's irqNumber interrupt
 Parameters:
   irqNumber - IRQ number
 Returns:
   -1 - if irqNumber is out of range or has not been
             registered yet.
   0 - otherwise.
******************************************************************************/
int HAL_UnregisterIrq(HAL_IrqNumber_t irqNumber)
{
  uint8_t irqOffsetNumber = irqNumber - HAL_FIRST_VALID_IRQ;
  // irqNumber is out of range
  if (irqOffsetNumber >= HAL_NUM_IRQ_LINES)
    return -1;
  // Interrupt has not been opened yet
  if (NULL == IrqCallbackList[irqOffsetNumber])
    return -1;
  // Disable external interrupt request
  halDisableIrqInterrupt(irqNumber);
  halClrIrqConfig(irqNumber);
  IrqCallbackList[irqOffsetNumber] = NULL;
  return 0;
}

// eof irq.c