summaryrefslogtreecommitdiffhomepage
path: root/digital/zigbit/bitcloud/stack/Components/HAL/include/irq.h
blob: bc2a36df883e291815e4f2da0d5a4d69d0fa036b (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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
/**************************************************************************//**
  \file  irq.h

  \brief The header file describes the 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.                                *
 ******************************************************************************/

#ifndef _IRQ_H
#define _IRQ_H

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

/******************************************************************************
                   Define(s) section
******************************************************************************/
/** \brief The low level generates an interrupt request. */
#define  IRQ_LOW_LEVEL        0
/** \brief The high level generates an interrupt request (valid only for arm and avr32). */
#define  IRQ_HIGH_LEVEL       1
/** \brief Any edge generates an interrupt request (valid only for avr and xmega). */
#define  IRQ_ANY_EDGE         2
/** \brief Falling edge generates an interrupt request. */
#define  IRQ_FALLING_EDGE     3
/** \brief Rising edge generates an interrupt request. */
#define  IRQ_RISING_EDGE      4
/** \brief interrupt is disabled. (valid only for xmega)*/
#define  IRQ_IS_DISABLED      5
/** \brief interrupt is not changed previous state. (valid only for xmega)*/
#define  IRQ_IS_NOT_CHANGED   6

/******************************************************************************
                   Types section
******************************************************************************/
/** \brief numbers of possible interrupt. */
typedef enum
{
#if defined(AT91SAM7X256) || defined(ATMEGA1281) || defined(ATMEGA2561) || defined(ATMEGA1284) || \
    defined(AT90USB1287) || defined(ATMEGA128RFA1) || defined(AT32UC3A0512)
/** \brief number of valid interrupt for arm and avr32. */
  IRQ_0 = 0,
/** \brief number of valid interrupt for arm and avr32. */
  IRQ_1 = 1,
/** \brief number of valid interrupt for avr32. */
  IRQ_2 = 2,
/** \brief number of valid interrupt for avr32. */
  IRQ_3 = 3,
/** \brief number of valid interrupt for avr32. */
  IRQ_4 = 4,
/** \brief number of valid interrupt for avr(only rcb platform) and  avr32. */
  IRQ_5 = 5,
/** \brief number of valid interrupt for avr and avr32. */
  IRQ_6 = 6,
/** \brief number of valid interrupt for avr and avr32. */
  IRQ_7 = 7,
#endif
#if defined(ATXMEGA128A1) || defined(ATXMEGA256A3) || defined(ATXMEGA256D3)
    IRQ_A0,
    IRQ_A1,
    IRQ_B0,
    IRQ_B1,
    IRQ_C0,
    IRQ_C1,
    IRQ_D0,
    IRQ_D1,
    IRQ_E0,
    IRQ_E1,
    IRQ_F0,
    IRQ_F1,
#if defined(ATXMEGA128A1)
    IRQ_H0,
    IRQ_H1,
    IRQ_J0,
    IRQ_J1,
    IRQ_K0,
    IRQ_K1,
#endif
#endif
#if defined(AT91SAM3S4C)
  IRQ_PORT_A,
  IRQ_PORT_B,
  IRQ_PORT_C,
#endif
  IRQ_LIMIT
} HAL_IrqNumber_t;

#if defined(AT91SAM7X256) || defined(ATMEGA1281) || defined(ATMEGA2561) || defined(ATMEGA1284) || \
    defined(AT90USB1287) || defined(ATMEGA128RFA1) || defined(AT32UC3A0512)
/** \brief interrupt activation condition. */
typedef uint8_t HAL_IrqMode_t;
#endif
#if defined(ATXMEGA128A1) || defined(ATXMEGA256A3) || defined(ATXMEGA256D3)
/** \brief interrupt activation condition. */
typedef struct
{
  uint32_t pin0 : 3;
  uint32_t pin1 : 3;
  uint32_t pin2 : 3;
  uint32_t pin3 : 3;
  uint32_t pin4 : 3;
  uint32_t pin5 : 3;
  uint32_t pin6 : 3;
  uint32_t pin7 : 3;
} HAL_IrqMode_t;
#endif
#if defined(AT91SAM3S4C)
typedef uint8_t HAL_IrqMode_t[32];
#endif

/******************************************************************************
                   Prototypes section
******************************************************************************/
/**************************************************************************//**
\brief Registers the user's irqNumber external interrupt

\param[in]
   irqNumber - IRQ number. Must be chosen from: \n
            IRQ_0 (for arm and avr32) \n
            IRQ_1 (for arm and avr32) \n
            IRQ_2 (for avr32) \n
            IRQ_3 (for avr32) \n
            IRQ_4 (for avr32) \n
            IRQ_5 (for avr (only rcb platform) and avr32) \n
            IRQ_6 (for avr and avr32) \n
            IRQ_7 (for avr and avr32) \n
            IRQ_PC (for xmega. P - port name, C - interrupt number. For example: IRQ_D1) \n
            IRQ_PORT_x (for cortex m3, x stands for port name) \n
\param[in]
   irqMode - Controls the sort of interrupt. For avr and arm must be chosen from: \n
            IRQ_LOW_LEVEL         // The low level generates an interrupt request. \n
            IRQ_HIGH_LEVEL        // The high level generates an interrupt request (valid for arm, avr32, cortex m3). \n
            IRQ_ANY_EDGE          // Any edge generates an interrupt request (valid for avr and cortex m3).  \n
            IRQ_FALLING_EDGE      // Falling edge generates an interrupt request. \n
            IRQ_RISING_EDGE       // Rising edge generates an interrupt request. \n

            irqMode is bit field for xmega . Bit field includes members pinX (X - pin number of selected port). \n
            All members that bit field must have value:

            IRQ_LOW_LEVEL         // The low level generates an interrupt request. \n
            IRQ_ANY_EDGE          // Any edge generates an interrupt request.  \n
            IRQ_FALLING_EDGE      // Falling edge generates an interrupt request. \n
            IRQ_RISING_EDGE       // Rising edge generates an interrupt request. \n
            IRQ_IS_DISABLED       // Pin is disabled for interrupt request. \n
            IRQ_IS_NOT_CHANGED    // Pin is not changed previous state.

\param[in]
   f         - user's interrupt handler. Handler must be executed less than 100 us.
\return
  -1 - if irqNumber is out of range, \n
       not valid irq mode, \n
       such interrupt has been already registered. \n
   0 - otherwise.
******************************************************************************/
int HAL_RegisterIrq(HAL_IrqNumber_t irqNumber, HAL_IrqMode_t irqMode, void (*f)(void));

/**************************************************************************//**
\brief Enables the irqNumber interrupt.
\param[in]
   irqNumber - IRQ number
\return
   -1 - if irqNumber is out of range or has not been registered yet. \n
    0 - otherwise.
******************************************************************************/
int HAL_EnableIrq(HAL_IrqNumber_t irqNumber);

/**************************************************************************//**
\brief Disables the irqNumber interrupt.
\param[in]
   irqNumber - IRQ number
\return
   -1 - if irqNumber is out of range or has not been registered yet. \n
    0 - otherwise.
******************************************************************************/
int HAL_DisableIrq(HAL_IrqNumber_t irqNumber);

/**************************************************************************//**
\brief Unregisters the user's irqNumber interrupt
\param[in]
   irqNumber - IRQ number
\return
   -1 - if irqNumber is out of range or has not been registered yet. \n
    0 - otherwise.
******************************************************************************/
int HAL_UnregisterIrq(HAL_IrqNumber_t irqNumber);

#endif /* _IRQ_H */
//eof irq.h