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&reg; | SMART ARM&reg;-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