1 /**
2 * \file
3 *
4 * \brief SAM External Interrupt Driver
5 *
6 * Copyright (C) 2012-2016 Atmel Corporation. All rights reserved.
7 *
8 * \asf_license_start
9 *
10 * \page License
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions are met:
14 *
15 * 1. Redistributions of source code must retain the above copyright notice,
16 * this list of conditions and the following disclaimer.
17 *
18 * 2. Redistributions in binary form must reproduce the above copyright notice,
19 * this list of conditions and the following disclaimer in the documentation
20 * and/or other materials provided with the distribution.
21 *
22 * 3. The name of Atmel may not be used to endorse or promote products derived
23 * from this software without specific prior written permission.
24 *
25 * 4. This software may only be redistributed and used in connection with an
26 * Atmel microcontroller product.
27 *
28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38 * POSSIBILITY OF SUCH DAMAGE.
39 *
40 * \asf_license_stop
41 *
42 */
43 /*
44 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
45 */
46 #ifndef EXTINT_H_INCLUDED
47 #define EXTINT_H_INCLUDED
48
49 /**
50 * \defgroup asfdoc_sam0_extint_group SAM External Interrupt (EXTINT) Driver
51 *
52 * This driver for Atmel® | SMART ARM®-based microcontrollers provides
53 * an interface for the configuration and management of external interrupts
54 * generated by the physical device pins, including edge detection.
55 * The following driver API modes are covered by this
56 * manual:
57 *
58 * - Polled APIs
59 * \if EXTINT_CALLBACK_MODE
60 * - Callback APIs
61 * \endif
62 *
63 * The following peripheral is used by this module:
64 * - EIC (External Interrupt Controller)
65 *
66 * The following devices can use this module:
67 * - Atmel | SMART SAM D20/D21
68 * - Atmel | SMART SAM R21
69 * - Atmel | SMART SAM D09/D10/D11
70 * - Atmel | SMART SAM L21/L22
71 * - Atmel | SMART SAM DA1
72 * - Atmel | SMART SAM C20/C21
73 * - Atmel | SMART SAM HA1
74 *
75 * The outline of this documentation is as follows:
76 * - \ref asfdoc_sam0_extint_prerequisites
77 * - \ref asfdoc_sam0_extint_module_overview
78 * - \ref asfdoc_sam0_extint_special_considerations
79 * - \ref asfdoc_sam0_extint_extra_info
80 * - \ref asfdoc_sam0_extint_examples
81 * - \ref asfdoc_sam0_extint_api_overview
82 *
83 *
84 * \section asfdoc_sam0_extint_prerequisites Prerequisites
85 *
86 * There are no prerequisites for this module.
87 *
88 *
89 * \section asfdoc_sam0_extint_module_overview Module Overview
90 *
91 * The External Interrupt (EXTINT) module provides a method of asynchronously
92 * detecting rising edge, falling edge, or specific level detection on individual
93 * I/O pins of a device. This detection can then be used to trigger a software
94 * interrupt or event, or polled for later use if required. External interrupts
95 * can also optionally be used to automatically wake up the device from sleep
96 * mode, allowing the device to conserve power while still being able to react
97 * to an external stimulus in a timely manner.
98 *
99 * \subsection asfdoc_sam0_extint_logical_channels Logical Channels
100 * The External Interrupt module contains a number of logical channels, each of
101 * which is capable of being individually configured for a given pin routing,
102 * detection mode, and filtering/wake up characteristics.
103 *
104 * Each individual logical external interrupt channel may be routed to a single
105 * physical device I/O pin in order to detect a particular edge or level of the
106 * incoming signal.
107 *
108 * \subsection asfdoc_sam0_extint_module_overview_nmi_chanel NMI Channels
109 *
110 * One or more Non Maskable Interrupt (NMI) channels are provided within each
111 * physical External Interrupt Controller module, allowing a single physical pin
112 * of the device to fire a single NMI interrupt in response to a particular
113 * edge or level stimulus. An NMI cannot, as the name suggests, be disabled in
114 * firmware and will take precedence over any in-progress interrupt sources.
115 *
116 * NMIs can be used to implement critical device features such as forced
117 * software reset or other functionality where the action should be executed in
118 * preference to all other running code with a minimum amount of latency.
119 *
120 * \subsection asfdoc_sam0_extint_module_overview_filtering Input Filtering and Detection
121 *
122 * To reduce the possibility of noise or other transient signals causing
123 * unwanted device wake-ups, interrupts, and/or events via an external interrupt
124 * channel. A hardware signal filter can be enabled on individual channels. This
125 * filter provides a Majority-of-Three voter filter on the incoming signal, so
126 * that the input state is considered to be the majority vote of three
127 * subsequent samples of the pin input buffer. The possible sampled input and
128 * resulting filtered output when the filter is enabled is shown in
129 * \ref asfdoc_sam0_extint_filter_table "the table below".
130 *
131 * \anchor asfdoc_sam0_extint_filter_table
132 * <table>
133 * <caption>Sampled Input and Resulting Filtered Output</caption>
134 * <tr>
135 * <th>Input Sample 1</th>
136 * <th>Input Sample 2</th>
137 * <th>Input Sample 3</th>
138 * <th>Filtered Output</th>
139 * </tr>
140 * <tr>
141 * <td>0</td> <td>0</td> <td>0</td> <td>0</td>
142 * </tr>
143 * <tr>
144 * <td>0</td> <td>0</td> <td>1</td> <td>0</td>
145 * </tr>
146 * <tr>
147 * <td>0</td> <td>1</td> <td>0</td> <td>0</td>
148 * </tr>
149 * <tr>
150 * <td>0</td> <td>1</td> <td>1</td> <td>1</td>
151 * </tr>
152 * <tr>
153 * <td>1</td> <td>0</td> <td>0</td> <td>0</td>
154 * </tr>
155 * <tr>
156 * <td>1</td> <td>0</td> <td>1</td> <td>1</td>
157 * </tr>
158 * <tr>
159 * <td>1</td> <td>1</td> <td>0</td> <td>1</td>
160 * </tr>
161 * <tr>
162 * <td>1</td> <td>1</td> <td>1</td> <td>1</td>
163 * </tr>
164 * </table>
165 *
166 * \subsection asfdoc_sam0_extint_module_overview_events Events and Interrupts
167 *
168 * Channel detection states may be polled inside the application for synchronous
169 * detection, or events and interrupts may be used for asynchronous behavior.
170 * Each channel can be configured to give an asynchronous hardware event (which
171 * may in turn trigger actions in other hardware modules) or an asynchronous
172 * software interrupt.
173 *
174 * \note The connection of events between modules requires the use of the
175 * \ref asfdoc_sam0_events_group "SAM Event System Driver (EVENTS)"
176 * to route output event of one module to the input event of another.
177 * For more information on event routing, refer to the event driver
178 * documentation.
179 *
180 * \subsection asfdoc_sam0_extint_module_overview_physical Physical Connection
181 *
182 * \ref asfdoc_sam0_extint_int_connections "The diagram below" shows how this
183 * module is interconnected within the device.
184 *
185 * \anchor asfdoc_sam0_extint_int_connections
186 * \dot
187 * digraph overview {
188 * node [label="Port Pad" shape=square] pad;
189 *
190 * subgraph driver {
191 * node [label="Peripheral MUX" shape=trapezium] pinmux;
192 * node [label="EIC Module" shape=ellipse] eic;
193 * node [label="Other Peripheral Modules" shape=ellipse style=filled fillcolor=lightgray] peripherals;
194 * }
195 *
196 * pinmux -> eic;
197 * pad -> pinmux;
198 * pinmux -> peripherals;
199 * }
200 * \enddot
201 *
202 * \section asfdoc_sam0_extint_special_considerations Special Considerations
203 *
204 * Not all devices support disabling of the NMI channel(s) detection mode - see
205 * your device datasheet.
206 *
207 *
208 * \section asfdoc_sam0_extint_extra_info Extra Information
209 *
210 * For extra information, see \ref asfdoc_sam0_extint_extra. This includes:
211 * - \ref asfdoc_sam0_extint_extra_acronyms
212 * - \ref asfdoc_sam0_extint_extra_dependencies
213 * - \ref asfdoc_sam0_extint_extra_errata
214 * - \ref asfdoc_sam0_extint_extra_history
215 *
216 *
217 * \section asfdoc_sam0_extint_examples Examples
218 *
219 * For a list of examples related to this driver, see
220 * \ref asfdoc_sam0_extint_exqsg.
221 *
222 *
223 * \section asfdoc_sam0_extint_api_overview API Overview
224 * @{
225 */
226
227 #include <compiler.h>
228 #include <pinmux.h>
229
230 #ifdef __cplusplus
231 extern "C" {
232 #endif
233
234 /**
235 * \brief External interrupt edge detection configuration enum.
236 *
237 * Enum for the possible signal edge detection modes of the External
238 * Interrupt Controller module.
239 */
240 enum extint_detect {
241 /** No edge detection. Not allowed as a NMI detection mode on some
242 * devices. */
243 EXTINT_DETECT_NONE = 0,
244 /** Detect rising signal edges */
245 EXTINT_DETECT_RISING = 1,
246 /** Detect falling signal edges */
247 EXTINT_DETECT_FALLING = 2,
248 /** Detect both signal edges */
249 EXTINT_DETECT_BOTH = 3,
250 /** Detect high signal levels */
251 EXTINT_DETECT_HIGH = 4,
252 /** Detect low signal levels */
253 EXTINT_DETECT_LOW = 5,
254 };
255
256 /**
257 * \brief External interrupt internal pull configuration enum.
258 *
259 * Enum for the possible pin internal pull configurations.
260 *
261 * \note Disabling the internal pull resistor is not recommended if the driver
262 * is used in interrupt (callback) mode, due the possibility of floating
263 * inputs generating continuous interrupts.
264 */
265 enum extint_pull {
266 /** Internal pull-up resistor is enabled on the pin */
267 EXTINT_PULL_UP = SYSTEM_PINMUX_PIN_PULL_UP,
268 /** Internal pull-down resistor is enabled on the pin */
269 EXTINT_PULL_DOWN = SYSTEM_PINMUX_PIN_PULL_DOWN,
270 /** Internal pull resistor is disconnected from the pin */
271 EXTINT_PULL_NONE = SYSTEM_PINMUX_PIN_PULL_NONE,
272 };
273
274 /** The EIC is clocked by GCLK_EIC. */
275 #define EXTINT_CLK_GCLK 0
276 /** The EIC is clocked by CLK_ULP32K. */
277 #define EXTINT_CLK_ULP32K 1
278
279 /**
280 * \brief External Interrupt Controller channel configuration structure.
281 *
282 * Configuration structure for the edge detection mode of an external
283 * interrupt channel.
284 */
285 struct extint_chan_conf {
286 /** GPIO pin the NMI should be connected to */
287 uint32_t gpio_pin;
288 /** MUX position the GPIO pin should be configured to */
289 uint32_t gpio_pin_mux;
290 /** Internal pull to enable on the input pin */
291 enum extint_pull gpio_pin_pull;
292 #if (SAML21) || (SAML22) || (SAMC20) || (SAMC21) || (SAMR30)
293 /** Enable asynchronous edge detection. */
294 bool enable_async_edge_detection;
295 #else
296 /** Wake up the device if the channel interrupt fires during sleep mode */
297 bool wake_if_sleeping;
298 #endif
299 /** Filter the raw input signal to prevent noise from triggering an
300 * interrupt accidentally, using a three sample majority filter */
301 bool filter_input_signal;
302 /** Edge detection mode to use */
303 enum extint_detect detection_criteria;
304 };
305
306 /**
307 * \brief External Interrupt event enable/disable structure.
308 *
309 * Event flags for the \ref extint_enable_events() and
310 * \ref extint_disable_events().
311 */
312 struct extint_events {
313 /** If \c true, an event will be generated when an external interrupt
314 * channel detection state changes */
315 bool generate_event_on_detect[32 * EIC_INST_NUM];
316 };
317
318 /**
319 * \brief External Interrupt Controller NMI configuration structure.
320 *
321 * Configuration structure for the edge detection mode of an external
322 * interrupt NMI channel.
323 */
324 struct extint_nmi_conf {
325 /** GPIO pin the NMI should be connected to */
326 uint32_t gpio_pin;
327 /** MUX position the GPIO pin should be configured to */
328 uint32_t gpio_pin_mux;
329 /** Internal pull to enable on the input pin */
330 enum extint_pull gpio_pin_pull;
331 /** Filter the raw input signal to prevent noise from triggering an
332 * interrupt accidentally, using a three sample majority filter */
333 bool filter_input_signal;
334 /** Edge detection mode to use. Not all devices support all possible
335 * detection modes for NMIs.
336 */
337 enum extint_detect detection_criteria;
338 #if (SAML21) || (SAML22) || (SAMC20) || (SAMC21) || (SAMR30)
339 /** Enable asynchronous edge detection. */
340 bool enable_async_edge_detection;
341 #endif
342 };
343
344 #if EXTINT_CALLBACK_MODE == true
345 /** Type definition for an EXTINT module callback function */
346 typedef void (*extint_callback_t)(void);
347
348 #ifndef EIC_NUMBER_OF_INTERRUPTS
349 # define EIC_NUMBER_OF_INTERRUPTS 16
350 #endif
351 #endif
352
353 #if !defined(__DOXYGEN__)
354 /** \internal
355 * Internal EXTINT module device instance structure definition.
356 */
357 struct _extint_module
358 {
359 # if EXTINT_CALLBACK_MODE == true
360 /** Asynchronous channel callback table, for user-registered handlers */
361 extint_callback_t callbacks[EIC_NUMBER_OF_INTERRUPTS];
362 # else
363 /** Dummy value to ensure the struct has at least one member */
364 uint8_t _dummy;
365 # endif
366 };
367
368 /**
369 * \brief Retrieves the base EIC module address from a given channel number.
370 *
371 * Retrieves the base address of a EIC hardware module associated with the
372 * given external interrupt channel.
373 *
374 * \param[in] channel External interrupt channel index to convert
375 *
376 * \return Base address of the associated EIC module.
377 */
_extint_get_eic_from_channel(const uint8_t channel)378 static inline Eic * _extint_get_eic_from_channel(
379 const uint8_t channel)
380 {
381 uint8_t eic_index = (channel / 32);
382
383 if (eic_index < EIC_INST_NUM) {
384 /* Array of available EICs */
385 Eic *const eics[EIC_INST_NUM] = EIC_INSTS;
386
387 return eics[eic_index];
388 } else {
389 Assert(false);
390 return NULL;
391 }
392 }
393
394 /**
395 * \brief Retrieves the base EIC module address from a given NMI channel number.
396 *
397 * Retrieves the base address of a EIC hardware module associated with the
398 * given non-maskable external interrupt channel.
399 *
400 * \param[in] nmi_channel Non-Maskable interrupt channel index to convert
401 *
402 * \return Base address of the associated EIC module.
403 */
_extint_get_eic_from_nmi(const uint8_t nmi_channel)404 static inline Eic * _extint_get_eic_from_nmi(
405 const uint8_t nmi_channel)
406 {
407 uint8_t eic_index = nmi_channel;
408
409 if (eic_index < EIC_INST_NUM) {
410 /* Array of available EICs */
411 Eic *const eics[EIC_INST_NUM] = EIC_INSTS;
412
413 return eics[eic_index];
414 } else {
415 Assert(false);
416 return NULL;
417 }
418 }
419 #endif
420
421 /** \name Event Management
422 * @{
423 */
424
425 void extint_enable_events(
426 struct extint_events *const events);
427
428 void extint_disable_events(
429 struct extint_events *const events);
430
431 /** @} */
432
433 /** \name Configuration and Initialization (Channel)
434 * @{
435 */
436
437 void extint_chan_get_config_defaults(
438 struct extint_chan_conf *const config);
439
440 void extint_chan_set_config(
441 const uint8_t channel,
442 const struct extint_chan_conf *const config);
443
444 /** @} */
445
446 /** \name Configuration and Initialization (NMI)
447 * @{
448 */
449
450 /**
451 * \brief Initializes an External Interrupt NMI channel configuration structure to defaults.
452 *
453 * Initializes a given External Interrupt NMI channel configuration structure
454 * to a set of known default values. This function should be called on all new
455 * instances of these configuration structures before being modified by the
456 * user application.
457 *
458 * The default configuration is as follows:
459 * \li Input filtering disabled
460 * \li Detect falling edges of a signal
461 * \li Asynchronous edge detection is disabled
462 *
463 * \param[out] config Configuration structure to initialize to default values
464 */
extint_nmi_get_config_defaults(struct extint_nmi_conf * const config)465 static inline void extint_nmi_get_config_defaults(
466 struct extint_nmi_conf *const config)
467 {
468 /* Sanity check arguments */
469 Assert(config);
470
471 /* Default configuration values */
472 config->gpio_pin = 0;
473 config->gpio_pin_mux = 0;
474 config->gpio_pin_pull = EXTINT_PULL_UP;
475 config->filter_input_signal = false;
476 config->detection_criteria = EXTINT_DETECT_FALLING;
477 #if (SAML21) || (SAML22) || (SAMC20) || (SAMC21) || (SAMR30)
478 config->enable_async_edge_detection = false;
479 #endif
480
481 }
482
483 enum status_code extint_nmi_set_config(
484 const uint8_t nmi_channel,
485 const struct extint_nmi_conf *const config);
486
487 /** @} */
488
489 /** \name Detection testing and clearing (channel)
490 * @{
491 */
492
493 /**
494 * \brief Retrieves the edge detection state of a configured channel.
495 *
496 * Reads the current state of a configured channel, and determines
497 * if the detection criteria of the channel has been met.
498 *
499 * \param[in] channel External Interrupt channel index to check
500 *
501 * \return Status of the requested channel's edge detection state.
502 * \retval true If the channel's edge/level detection criteria was met
503 * \retval false If the channel has not detected its configured criteria
504 */
extint_chan_is_detected(const uint8_t channel)505 static inline bool extint_chan_is_detected(
506 const uint8_t channel)
507 {
508 Eic *const eic_module = _extint_get_eic_from_channel(channel);
509 uint32_t eic_mask = (1UL << (channel % 32));
510
511 return (eic_module->INTFLAG.reg & eic_mask);
512 }
513
514 /**
515 * \brief Clears the edge detection state of a configured channel.
516 *
517 * Clears the current state of a configured channel, readying it for
518 * the next level or edge detection.
519 *
520 * \param[in] channel External Interrupt channel index to check
521 */
extint_chan_clear_detected(const uint8_t channel)522 static inline void extint_chan_clear_detected(
523 const uint8_t channel)
524 {
525 Eic *const eic_module = _extint_get_eic_from_channel(channel);
526 uint32_t eic_mask = (1UL << (channel % 32));
527
528 eic_module->INTFLAG.reg = eic_mask;
529 }
530
531 /** @} */
532
533 /** \name Detection Testing and Clearing (NMI)
534 * @{
535 */
536
537 /**
538 * \brief Retrieves the edge detection state of a configured NMI channel.
539 *
540 * Reads the current state of a configured NMI channel, and determines
541 * if the detection criteria of the NMI channel has been met.
542 *
543 * \param[in] nmi_channel External Interrupt NMI channel index to check
544 *
545 * \return Status of the requested NMI channel's edge detection state.
546 * \retval true If the NMI channel's edge/level detection criteria was met
547 * \retval false If the NMI channel has not detected its configured criteria
548 */
extint_nmi_is_detected(const uint8_t nmi_channel)549 static inline bool extint_nmi_is_detected(
550 const uint8_t nmi_channel)
551 {
552 Eic *const eic_module = _extint_get_eic_from_nmi(nmi_channel);
553
554 return (eic_module->NMIFLAG.reg & EIC_NMIFLAG_NMI);
555 }
556
557 /**
558 * \brief Clears the edge detection state of a configured NMI channel.
559 *
560 * Clears the current state of a configured NMI channel, readying it for
561 * the next level or edge detection.
562 *
563 * \param[in] nmi_channel External Interrupt NMI channel index to check
564 */
extint_nmi_clear_detected(const uint8_t nmi_channel)565 static inline void extint_nmi_clear_detected(
566 const uint8_t nmi_channel)
567 {
568 Eic *const eic_module = _extint_get_eic_from_nmi(nmi_channel);
569
570 eic_module->NMIFLAG.reg = EIC_NMIFLAG_NMI;
571 }
572
573 /** @} */
574
575 #ifdef __cplusplus
576 }
577 #endif
578
579 /** @} */
580
581 #if EXTINT_CALLBACK_MODE == true
582 # include "extint_callback.h"
583 #endif
584
585 /**
586 * \page asfdoc_sam0_extint_extra Extra Information for EXTINT Driver
587 *
588 * \section asfdoc_sam0_extint_extra_acronyms Acronyms
589 * The table below presents the acronyms used in this module:
590 *
591 * <table>
592 * <tr>
593 * <th>Acronym</th>
594 * <th>Description</th>
595 * </tr>
596 * <tr>
597 * <td>EIC</td>
598 * <td>External Interrupt Controller</td>
599 * </tr>
600 * <tr>
601 * <td>MUX</td>
602 * <td>Multiplexer</td>
603 * </tr>
604 * <tr>
605 * <td>NMI</td>
606 * <td>Non-Maskable Interrupt</td>
607 * </tr>
608 * </table>
609 *
610 *
611 * \section asfdoc_sam0_extint_extra_dependencies Dependencies
612 * This driver has the following dependencies:
613 *
614 * - \ref asfdoc_sam0_system_pinmux_group "System Pin Multiplexer Driver"
615 *
616 *
617 * \section asfdoc_sam0_extint_extra_errata Errata
618 * There are no errata related to this driver.
619 *
620 *
621 * \section asfdoc_sam0_extint_extra_history Module History
622 * An overview of the module history is presented in the table below, with
623 * details on the enhancements and fixes made to the module since its first
624 * release. The current version of this corresponds to the newest version in
625 * the table.
626 *
627 * <table>
628 * <tr>
629 * <th>Changelog</th>
630 * </tr>
631 * <tr>
632 * <td>
633 * \li Driver updated to follow driver type convention
634 * \li Removed \c %extint_reset(), \c %extint_disable() and
635 * \c extint_enable() functions. Added internal function
636 * \c %_system_extint_init().
637 * \li Added configuration EXTINT_CLOCK_SOURCE in conf_extint.h
638 * \li Removed configuration EXTINT_CALLBACKS_MAX in conf_extint.h, and
639 * added channel parameter in the register functions
640 * \c %extint_register_callback() and \c %extint_unregister_callback()
641 * </td>
642 * </tr>
643 * <tr>
644 * <td>Updated interrupt handler to clear interrupt flag before calling
645 * callback function</td>
646 * </tr>
647 * <tr>
648 * <td>Updated initialization function to also enable the digital interface
649 * clock to the module if it is disabled</td>
650 * </tr>
651 * <tr>
652 * <td>Initial Release</td>
653 * </tr>
654 * </table>
655 */
656
657 /**
658 * \page asfdoc_sam0_extint_exqsg Examples for EXTINT Driver
659 *
660 * This is a list of the available Quick Start guides (QSGs) and example
661 * applications for \ref asfdoc_sam0_extint_group.
662 * QSGs are simple examples with step-by-step instructions to configure and
663 * use this driver in a selection of use cases. Note that a QSG can be compiled
664 * as a standalone application or be added to the user application.
665 *
666 * - \subpage asfdoc_sam0_extint_basic_use_case
667 * \if EXTINT_CALLBACK_MODE
668 * - \subpage asfdoc_sam0_extint_callback_use_case
669 * \endif
670 *
671 * \page asfdoc_sam0_extint_document_revision_history Document Revision History
672 *
673 * <table>
674 * <tr>
675 * <th>Doc. Rev.</th>
676 * <th>Date</th>
677 * <th>Comments</th>
678 * </tr>
679 * <tr>
680 * <td>42112E</td>
681 * <td>12/2015</td>
682 * <td>Added support for SAM L21/L22, SAM C21, SAM D09, and SAM DA1</td>
683 * </tr>
684 * <tr>
685 * <td>42112D</td>
686 * <td>12/2014</td>
687 * <td>Added support for SAM R21 and SAM D10/D11</td>
688 * </tr>
689 * <tr>
690 * <td>42112C</td>
691 * <td>01/2014</td>
692 * <td>Added support for SAM D21</td>
693 * </tr>
694 * <tr>
695 * <td>42112B</td>
696 * <td>06/2013</td>
697 * <td>Added additional documentation on the event system. Corrected
698 * documentation typos.</td>
699 * </tr>
700 * <tr>
701 * <td>42112A</td>
702 * <td>06/2013</td>
703 * <td>Initial release</td>
704 * </tr>
705 * </table>
706 */
707
708 #endif
709