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