t

Fork of mbed-dev by mbed official

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?

UserRevisionLine numberNew contents of line
mbed_official 107:414e9c822e99 1 /**
mbed_official 107:414e9c822e99 2 * \file
mbed_official 107:414e9c822e99 3 *
mbed_official 107:414e9c822e99 4 * \brief Parallel Input/Output (PIO) Controller driver for SAM.
mbed_official 107:414e9c822e99 5 *
mbed_official 107:414e9c822e99 6 * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved.
mbed_official 107:414e9c822e99 7 *
mbed_official 107:414e9c822e99 8 * \asf_license_start
mbed_official 107:414e9c822e99 9 *
mbed_official 107:414e9c822e99 10 * \page License
mbed_official 107:414e9c822e99 11 *
mbed_official 107:414e9c822e99 12 * Redistribution and use in source and binary forms, with or without
mbed_official 107:414e9c822e99 13 * modification, are permitted provided that the following conditions are met:
mbed_official 107:414e9c822e99 14 *
mbed_official 107:414e9c822e99 15 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 107:414e9c822e99 16 * this list of conditions and the following disclaimer.
mbed_official 107:414e9c822e99 17 *
mbed_official 107:414e9c822e99 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 107:414e9c822e99 19 * this list of conditions and the following disclaimer in the documentation
mbed_official 107:414e9c822e99 20 * and/or other materials provided with the distribution.
mbed_official 107:414e9c822e99 21 *
mbed_official 107:414e9c822e99 22 * 3. The name of Atmel may not be used to endorse or promote products derived
mbed_official 107:414e9c822e99 23 * from this software without specific prior written permission.
mbed_official 107:414e9c822e99 24 *
mbed_official 107:414e9c822e99 25 * 4. This software may only be redistributed and used in connection with an
mbed_official 107:414e9c822e99 26 * Atmel microcontroller product.
mbed_official 107:414e9c822e99 27 *
mbed_official 107:414e9c822e99 28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
mbed_official 107:414e9c822e99 29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
mbed_official 107:414e9c822e99 30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
mbed_official 107:414e9c822e99 31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
mbed_official 107:414e9c822e99 32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 107:414e9c822e99 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
mbed_official 107:414e9c822e99 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
mbed_official 107:414e9c822e99 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
mbed_official 107:414e9c822e99 36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
mbed_official 107:414e9c822e99 37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 107:414e9c822e99 38 * POSSIBILITY OF SUCH DAMAGE.
mbed_official 107:414e9c822e99 39 *
mbed_official 107:414e9c822e99 40 * \asf_license_stop
mbed_official 107:414e9c822e99 41 *
mbed_official 107:414e9c822e99 42 */
mbed_official 107:414e9c822e99 43 /*
mbed_official 107:414e9c822e99 44 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
mbed_official 107:414e9c822e99 45 */
mbed_official 107:414e9c822e99 46
mbed_official 107:414e9c822e99 47 #include "pio.h"
mbed_official 107:414e9c822e99 48
mbed_official 107:414e9c822e99 49 #ifndef PIO_WPMR_WPKEY_PASSWD
mbed_official 107:414e9c822e99 50 # define PIO_WPMR_WPKEY_PASSWD PIO_WPMR_WPKEY(0x50494Fu)
mbed_official 107:414e9c822e99 51 #endif
mbed_official 107:414e9c822e99 52
mbed_official 107:414e9c822e99 53 /**
mbed_official 107:414e9c822e99 54 * \defgroup sam_drivers_pio_group Peripheral Parallel Input/Output (PIO) Controller
mbed_official 107:414e9c822e99 55 *
mbed_official 107:414e9c822e99 56 * \par Purpose
mbed_official 107:414e9c822e99 57 *
mbed_official 107:414e9c822e99 58 * The Parallel Input/Output Controller (PIO) manages up to 32 fully
mbed_official 107:414e9c822e99 59 * programmable input/output lines. Each I/O line may be dedicated as a
mbed_official 107:414e9c822e99 60 * general-purpose I/O or be assigned to a function of an embedded peripheral.
mbed_official 107:414e9c822e99 61 * This assures effective optimization of the pins of a product.
mbed_official 107:414e9c822e99 62 *
mbed_official 107:414e9c822e99 63 * @{
mbed_official 107:414e9c822e99 64 */
mbed_official 107:414e9c822e99 65
mbed_official 107:414e9c822e99 66 #ifndef FREQ_SLOW_CLOCK_EXT
mbed_official 107:414e9c822e99 67 /* External slow clock frequency (hz) */
mbed_official 107:414e9c822e99 68 #define FREQ_SLOW_CLOCK_EXT 32768
mbed_official 107:414e9c822e99 69 #endif
mbed_official 107:414e9c822e99 70
mbed_official 107:414e9c822e99 71 /**
mbed_official 107:414e9c822e99 72 * \brief Configure PIO internal pull-up.
mbed_official 107:414e9c822e99 73 *
mbed_official 107:414e9c822e99 74 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 75 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 76 * \param ul_pull_up_enable Indicates if the pin(s) internal pull-up shall be
mbed_official 107:414e9c822e99 77 * configured.
mbed_official 107:414e9c822e99 78 */
mbed_official 107:414e9c822e99 79 void pio_pull_up(Pio *p_pio, const uint32_t ul_mask,
mbed_official 107:414e9c822e99 80 const uint32_t ul_pull_up_enable)
mbed_official 107:414e9c822e99 81 {
mbed_official 107:414e9c822e99 82 /* Enable the pull-up(s) if necessary */
mbed_official 107:414e9c822e99 83 if (ul_pull_up_enable) {
mbed_official 107:414e9c822e99 84 p_pio->PIO_PUER = ul_mask;
mbed_official 107:414e9c822e99 85 } else {
mbed_official 107:414e9c822e99 86 p_pio->PIO_PUDR = ul_mask;
mbed_official 107:414e9c822e99 87 }
mbed_official 107:414e9c822e99 88 }
mbed_official 107:414e9c822e99 89
mbed_official 107:414e9c822e99 90 /**
mbed_official 107:414e9c822e99 91 * \brief Configure Glitch or Debouncing filter for the specified input(s).
mbed_official 107:414e9c822e99 92 *
mbed_official 107:414e9c822e99 93 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 94 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 95 * \param ul_cut_off Cuts off frequency for debouncing filter.
mbed_official 107:414e9c822e99 96 */
mbed_official 107:414e9c822e99 97 void pio_set_debounce_filter(Pio *p_pio, const uint32_t ul_mask,
mbed_official 107:414e9c822e99 98 const uint32_t ul_cut_off)
mbed_official 107:414e9c822e99 99 {
mbed_official 107:414e9c822e99 100 #if (SAM3S || SAM3N || SAM4S || SAM4E || SAM4N || SAM4C || SAMG || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 101 /* Set Debouncing, 0 bit field no effect */
mbed_official 107:414e9c822e99 102 p_pio->PIO_IFSCER = ul_mask;
mbed_official 107:414e9c822e99 103 #elif (SAM3XA || SAM3U)
mbed_official 107:414e9c822e99 104 /* Set Debouncing, 0 bit field no effect */
mbed_official 107:414e9c822e99 105 p_pio->PIO_DIFSR = ul_mask;
mbed_official 107:414e9c822e99 106 #else
mbed_official 107:414e9c822e99 107 #error "Unsupported device"
mbed_official 107:414e9c822e99 108 #endif
mbed_official 107:414e9c822e99 109
mbed_official 107:414e9c822e99 110 /*
mbed_official 107:414e9c822e99 111 * The debouncing filter can filter a pulse of less than 1/2 Period of a
mbed_official 107:414e9c822e99 112 * programmable Divided Slow Clock:
mbed_official 107:414e9c822e99 113 * Tdiv_slclk = ((DIV+1)*2).Tslow_clock
mbed_official 107:414e9c822e99 114 */
mbed_official 107:414e9c822e99 115 p_pio->PIO_SCDR = PIO_SCDR_DIV((FREQ_SLOW_CLOCK_EXT /
mbed_official 107:414e9c822e99 116 (2 * (ul_cut_off))) - 1);
mbed_official 107:414e9c822e99 117 }
mbed_official 107:414e9c822e99 118
mbed_official 107:414e9c822e99 119 /**
mbed_official 107:414e9c822e99 120 * \brief Set a high output level on all the PIOs defined in ul_mask.
mbed_official 107:414e9c822e99 121 * This has no immediate effects on PIOs that are not output, but the PIO
mbed_official 107:414e9c822e99 122 * controller will save the value if they are changed to outputs.
mbed_official 107:414e9c822e99 123 *
mbed_official 107:414e9c822e99 124 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 125 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 126 */
mbed_official 107:414e9c822e99 127 void pio_set(Pio *p_pio, const uint32_t ul_mask)
mbed_official 107:414e9c822e99 128 {
mbed_official 107:414e9c822e99 129 p_pio->PIO_SODR = ul_mask;
mbed_official 107:414e9c822e99 130 }
mbed_official 107:414e9c822e99 131
mbed_official 107:414e9c822e99 132 /**
mbed_official 107:414e9c822e99 133 * \brief Set a low output level on all the PIOs defined in ul_mask.
mbed_official 107:414e9c822e99 134 * This has no immediate effects on PIOs that are not output, but the PIO
mbed_official 107:414e9c822e99 135 * controller will save the value if they are changed to outputs.
mbed_official 107:414e9c822e99 136 *
mbed_official 107:414e9c822e99 137 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 138 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 139 */
mbed_official 107:414e9c822e99 140 void pio_clear(Pio *p_pio, const uint32_t ul_mask)
mbed_official 107:414e9c822e99 141 {
mbed_official 107:414e9c822e99 142 p_pio->PIO_CODR = ul_mask;
mbed_official 107:414e9c822e99 143 }
mbed_official 107:414e9c822e99 144
mbed_official 107:414e9c822e99 145 /**
mbed_official 107:414e9c822e99 146 * \brief Return 1 if one or more PIOs of the given Pin instance currently have
mbed_official 107:414e9c822e99 147 * a high level; otherwise returns 0. This method returns the actual value that
mbed_official 107:414e9c822e99 148 * is being read on the pin. To return the supposed output value of a pin, use
mbed_official 107:414e9c822e99 149 * pio_get_output_data_status() instead.
mbed_official 107:414e9c822e99 150 *
mbed_official 107:414e9c822e99 151 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 152 * \param ul_type PIO type.
mbed_official 107:414e9c822e99 153 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 154 *
mbed_official 107:414e9c822e99 155 * \retval 1 at least one PIO currently has a high level.
mbed_official 107:414e9c822e99 156 * \retval 0 all PIOs have a low level.
mbed_official 107:414e9c822e99 157 */
mbed_official 107:414e9c822e99 158 uint32_t pio_get(Pio *p_pio, const pio_type_t ul_type,
mbed_official 107:414e9c822e99 159 const uint32_t ul_mask)
mbed_official 107:414e9c822e99 160 {
mbed_official 107:414e9c822e99 161 uint32_t ul_reg;
mbed_official 107:414e9c822e99 162
mbed_official 107:414e9c822e99 163 if ((ul_type == PIO_OUTPUT_0) || (ul_type == PIO_OUTPUT_1)) {
mbed_official 107:414e9c822e99 164 ul_reg = p_pio->PIO_ODSR;
mbed_official 107:414e9c822e99 165 } else {
mbed_official 107:414e9c822e99 166 ul_reg = p_pio->PIO_PDSR;
mbed_official 107:414e9c822e99 167 }
mbed_official 107:414e9c822e99 168
mbed_official 107:414e9c822e99 169 if ((ul_reg & ul_mask) == 0) {
mbed_official 107:414e9c822e99 170 return 0;
mbed_official 107:414e9c822e99 171 } else {
mbed_official 107:414e9c822e99 172 return 1;
mbed_official 107:414e9c822e99 173 }
mbed_official 107:414e9c822e99 174 }
mbed_official 107:414e9c822e99 175
mbed_official 107:414e9c822e99 176 /**
mbed_official 107:414e9c822e99 177 * \brief Configure IO of a PIO controller as being controlled by a specific
mbed_official 107:414e9c822e99 178 * peripheral.
mbed_official 107:414e9c822e99 179 *
mbed_official 107:414e9c822e99 180 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 181 * \param ul_type PIO type.
mbed_official 107:414e9c822e99 182 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 183 */
mbed_official 107:414e9c822e99 184 void pio_set_peripheral(Pio *p_pio, const pio_type_t ul_type,
mbed_official 107:414e9c822e99 185 const uint32_t ul_mask)
mbed_official 107:414e9c822e99 186 {
mbed_official 107:414e9c822e99 187 uint32_t ul_sr;
mbed_official 107:414e9c822e99 188
mbed_official 107:414e9c822e99 189 /* Disable interrupts on the pin(s) */
mbed_official 107:414e9c822e99 190 p_pio->PIO_IDR = ul_mask;
mbed_official 107:414e9c822e99 191
mbed_official 107:414e9c822e99 192 #if (SAM3S || SAM3N || SAM4S || SAM4E || SAM4N || SAM4C || SAMG || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 193 switch (ul_type) {
mbed_official 107:414e9c822e99 194 case PIO_PERIPH_A:
mbed_official 107:414e9c822e99 195 ul_sr = p_pio->PIO_ABCDSR[0];
mbed_official 107:414e9c822e99 196 p_pio->PIO_ABCDSR[0] &= (~ul_mask & ul_sr);
mbed_official 107:414e9c822e99 197
mbed_official 107:414e9c822e99 198 ul_sr = p_pio->PIO_ABCDSR[1];
mbed_official 107:414e9c822e99 199 p_pio->PIO_ABCDSR[1] &= (~ul_mask & ul_sr);
mbed_official 107:414e9c822e99 200 break;
mbed_official 107:414e9c822e99 201 case PIO_PERIPH_B:
mbed_official 107:414e9c822e99 202 ul_sr = p_pio->PIO_ABCDSR[0];
mbed_official 107:414e9c822e99 203 p_pio->PIO_ABCDSR[0] = (ul_mask | ul_sr);
mbed_official 107:414e9c822e99 204
mbed_official 107:414e9c822e99 205 ul_sr = p_pio->PIO_ABCDSR[1];
mbed_official 107:414e9c822e99 206 p_pio->PIO_ABCDSR[1] &= (~ul_mask & ul_sr);
mbed_official 107:414e9c822e99 207 break;
mbed_official 107:414e9c822e99 208 #if (!SAMG)
mbed_official 107:414e9c822e99 209 case PIO_PERIPH_C:
mbed_official 107:414e9c822e99 210 ul_sr = p_pio->PIO_ABCDSR[0];
mbed_official 107:414e9c822e99 211 p_pio->PIO_ABCDSR[0] &= (~ul_mask & ul_sr);
mbed_official 107:414e9c822e99 212
mbed_official 107:414e9c822e99 213 ul_sr = p_pio->PIO_ABCDSR[1];
mbed_official 107:414e9c822e99 214 p_pio->PIO_ABCDSR[1] = (ul_mask | ul_sr);
mbed_official 107:414e9c822e99 215 break;
mbed_official 107:414e9c822e99 216 case PIO_PERIPH_D:
mbed_official 107:414e9c822e99 217 ul_sr = p_pio->PIO_ABCDSR[0];
mbed_official 107:414e9c822e99 218 p_pio->PIO_ABCDSR[0] = (ul_mask | ul_sr);
mbed_official 107:414e9c822e99 219
mbed_official 107:414e9c822e99 220 ul_sr = p_pio->PIO_ABCDSR[1];
mbed_official 107:414e9c822e99 221 p_pio->PIO_ABCDSR[1] = (ul_mask | ul_sr);
mbed_official 107:414e9c822e99 222 break;
mbed_official 107:414e9c822e99 223 #endif
mbed_official 107:414e9c822e99 224 /* Other types are invalid in this function */
mbed_official 107:414e9c822e99 225 case PIO_INPUT:
mbed_official 107:414e9c822e99 226 case PIO_OUTPUT_0:
mbed_official 107:414e9c822e99 227 case PIO_OUTPUT_1:
mbed_official 107:414e9c822e99 228 case PIO_NOT_A_PIN:
mbed_official 107:414e9c822e99 229 return;
mbed_official 107:414e9c822e99 230 }
mbed_official 107:414e9c822e99 231 #elif (SAM3XA|| SAM3U)
mbed_official 107:414e9c822e99 232 switch (ul_type) {
mbed_official 107:414e9c822e99 233 case PIO_PERIPH_A:
mbed_official 107:414e9c822e99 234 ul_sr = p_pio->PIO_ABSR;
mbed_official 107:414e9c822e99 235 p_pio->PIO_ABSR &= (~ul_mask & ul_sr);
mbed_official 107:414e9c822e99 236 break;
mbed_official 107:414e9c822e99 237
mbed_official 107:414e9c822e99 238 case PIO_PERIPH_B:
mbed_official 107:414e9c822e99 239 ul_sr = p_pio->PIO_ABSR;
mbed_official 107:414e9c822e99 240 p_pio->PIO_ABSR = (ul_mask | ul_sr);
mbed_official 107:414e9c822e99 241 break;
mbed_official 107:414e9c822e99 242
mbed_official 107:414e9c822e99 243 // other types are invalid in this function
mbed_official 107:414e9c822e99 244 case PIO_INPUT:
mbed_official 107:414e9c822e99 245 case PIO_OUTPUT_0:
mbed_official 107:414e9c822e99 246 case PIO_OUTPUT_1:
mbed_official 107:414e9c822e99 247 case PIO_NOT_A_PIN:
mbed_official 107:414e9c822e99 248 return;
mbed_official 107:414e9c822e99 249 }
mbed_official 107:414e9c822e99 250 #else
mbed_official 107:414e9c822e99 251 #error "Unsupported device"
mbed_official 107:414e9c822e99 252 #endif
mbed_official 107:414e9c822e99 253
mbed_official 107:414e9c822e99 254 /* Remove the pins from under the control of PIO */
mbed_official 107:414e9c822e99 255 p_pio->PIO_PDR = ul_mask;
mbed_official 107:414e9c822e99 256 }
mbed_official 107:414e9c822e99 257
mbed_official 107:414e9c822e99 258 /**
mbed_official 107:414e9c822e99 259 * \brief Configure one or more pin(s) or a PIO controller as inputs.
mbed_official 107:414e9c822e99 260 * Optionally, the corresponding internal pull-up(s) and glitch filter(s) can
mbed_official 107:414e9c822e99 261 * be enabled.
mbed_official 107:414e9c822e99 262 *
mbed_official 107:414e9c822e99 263 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 264 * \param ul_mask Bitmask indicating which pin(s) to configure as input(s).
mbed_official 107:414e9c822e99 265 * \param ul_attribute PIO attribute(s).
mbed_official 107:414e9c822e99 266 */
mbed_official 107:414e9c822e99 267 void pio_set_input(Pio *p_pio, const uint32_t ul_mask,
mbed_official 107:414e9c822e99 268 const uint32_t ul_attribute)
mbed_official 107:414e9c822e99 269 {
mbed_official 107:414e9c822e99 270 pio_disable_interrupt(p_pio, ul_mask);
mbed_official 107:414e9c822e99 271 pio_pull_up(p_pio, ul_mask, ul_attribute & PIO_PULLUP);
mbed_official 107:414e9c822e99 272
mbed_official 107:414e9c822e99 273 /* Enable Input Filter if necessary */
mbed_official 107:414e9c822e99 274 if (ul_attribute & (PIO_DEGLITCH | PIO_DEBOUNCE)) {
mbed_official 107:414e9c822e99 275 p_pio->PIO_IFER = ul_mask;
mbed_official 107:414e9c822e99 276 } else {
mbed_official 107:414e9c822e99 277 p_pio->PIO_IFDR = ul_mask;
mbed_official 107:414e9c822e99 278 }
mbed_official 107:414e9c822e99 279
mbed_official 107:414e9c822e99 280 #if (SAM3S || SAM3N || SAM4S || SAM4E || SAM4N || SAM4C || SAMG || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 281 /* Enable de-glitch or de-bounce if necessary */
mbed_official 107:414e9c822e99 282 if (ul_attribute & PIO_DEGLITCH) {
mbed_official 107:414e9c822e99 283 p_pio->PIO_IFSCDR = ul_mask;
mbed_official 107:414e9c822e99 284 } else {
mbed_official 107:414e9c822e99 285 if (ul_attribute & PIO_DEBOUNCE) {
mbed_official 107:414e9c822e99 286 p_pio->PIO_IFSCER = ul_mask;
mbed_official 107:414e9c822e99 287 }
mbed_official 107:414e9c822e99 288 }
mbed_official 107:414e9c822e99 289 #elif (SAM3XA|| SAM3U)
mbed_official 107:414e9c822e99 290 /* Enable de-glitch or de-bounce if necessary */
mbed_official 107:414e9c822e99 291 if (ul_attribute & PIO_DEGLITCH) {
mbed_official 107:414e9c822e99 292 p_pio->PIO_SCIFSR = ul_mask;
mbed_official 107:414e9c822e99 293 } else {
mbed_official 107:414e9c822e99 294 if (ul_attribute & PIO_DEBOUNCE) {
mbed_official 107:414e9c822e99 295 p_pio->PIO_DIFSR = ul_mask;
mbed_official 107:414e9c822e99 296 }
mbed_official 107:414e9c822e99 297 }
mbed_official 107:414e9c822e99 298 #else
mbed_official 107:414e9c822e99 299 #error "Unsupported device"
mbed_official 107:414e9c822e99 300 #endif
mbed_official 107:414e9c822e99 301
mbed_official 107:414e9c822e99 302 /* Configure pin as input */
mbed_official 107:414e9c822e99 303 p_pio->PIO_ODR = ul_mask;
mbed_official 107:414e9c822e99 304 p_pio->PIO_PER = ul_mask;
mbed_official 107:414e9c822e99 305 }
mbed_official 107:414e9c822e99 306
mbed_official 107:414e9c822e99 307 /**
mbed_official 107:414e9c822e99 308 * \brief Configure one or more pin(s) of a PIO controller as outputs, with
mbed_official 107:414e9c822e99 309 * the given default value. Optionally, the multi-drive feature can be enabled
mbed_official 107:414e9c822e99 310 * on the pin(s).
mbed_official 107:414e9c822e99 311 *
mbed_official 107:414e9c822e99 312 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 313 * \param ul_mask Bitmask indicating which pin(s) to configure.
mbed_official 107:414e9c822e99 314 * \param ul_default_level Default level on the pin(s).
mbed_official 107:414e9c822e99 315 * \param ul_multidrive_enable Indicates if the pin(s) shall be configured as
mbed_official 107:414e9c822e99 316 * open-drain.
mbed_official 107:414e9c822e99 317 * \param ul_pull_up_enable Indicates if the pin shall have its pull-up
mbed_official 107:414e9c822e99 318 * activated.
mbed_official 107:414e9c822e99 319 */
mbed_official 107:414e9c822e99 320 void pio_set_output(Pio *p_pio, const uint32_t ul_mask,
mbed_official 107:414e9c822e99 321 const uint32_t ul_default_level,
mbed_official 107:414e9c822e99 322 const uint32_t ul_multidrive_enable,
mbed_official 107:414e9c822e99 323 const uint32_t ul_pull_up_enable)
mbed_official 107:414e9c822e99 324 {
mbed_official 107:414e9c822e99 325 pio_disable_interrupt(p_pio, ul_mask);
mbed_official 107:414e9c822e99 326 pio_pull_up(p_pio, ul_mask, ul_pull_up_enable);
mbed_official 107:414e9c822e99 327
mbed_official 107:414e9c822e99 328 /* Enable multi-drive if necessary */
mbed_official 107:414e9c822e99 329 if (ul_multidrive_enable) {
mbed_official 107:414e9c822e99 330 p_pio->PIO_MDER = ul_mask;
mbed_official 107:414e9c822e99 331 } else {
mbed_official 107:414e9c822e99 332 p_pio->PIO_MDDR = ul_mask;
mbed_official 107:414e9c822e99 333 }
mbed_official 107:414e9c822e99 334
mbed_official 107:414e9c822e99 335 /* Set default value */
mbed_official 107:414e9c822e99 336 if (ul_default_level) {
mbed_official 107:414e9c822e99 337 p_pio->PIO_SODR = ul_mask;
mbed_official 107:414e9c822e99 338 } else {
mbed_official 107:414e9c822e99 339 p_pio->PIO_CODR = ul_mask;
mbed_official 107:414e9c822e99 340 }
mbed_official 107:414e9c822e99 341
mbed_official 107:414e9c822e99 342 /* Configure pin(s) as output(s) */
mbed_official 107:414e9c822e99 343 p_pio->PIO_OER = ul_mask;
mbed_official 107:414e9c822e99 344 p_pio->PIO_PER = ul_mask;
mbed_official 107:414e9c822e99 345 }
mbed_official 107:414e9c822e99 346
mbed_official 107:414e9c822e99 347 /**
mbed_official 107:414e9c822e99 348 * \brief Perform complete pin(s) configuration; general attributes and PIO init
mbed_official 107:414e9c822e99 349 * if necessary.
mbed_official 107:414e9c822e99 350 *
mbed_official 107:414e9c822e99 351 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 352 * \param ul_type PIO type.
mbed_official 107:414e9c822e99 353 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 354 * \param ul_attribute Pins attributes.
mbed_official 107:414e9c822e99 355 *
mbed_official 107:414e9c822e99 356 * \return Whether the pin(s) have been configured properly.
mbed_official 107:414e9c822e99 357 */
mbed_official 107:414e9c822e99 358 uint32_t pio_configure(Pio *p_pio, const pio_type_t ul_type,
mbed_official 107:414e9c822e99 359 const uint32_t ul_mask, const uint32_t ul_attribute)
mbed_official 107:414e9c822e99 360 {
mbed_official 107:414e9c822e99 361 /* Configure pins */
mbed_official 107:414e9c822e99 362 switch (ul_type) {
mbed_official 107:414e9c822e99 363 case PIO_PERIPH_A:
mbed_official 107:414e9c822e99 364 case PIO_PERIPH_B:
mbed_official 107:414e9c822e99 365 #if (SAM3S || SAM3N || SAM4S || SAM4E || SAM4N || SAM4C || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 366 case PIO_PERIPH_C:
mbed_official 107:414e9c822e99 367 case PIO_PERIPH_D:
mbed_official 107:414e9c822e99 368 #endif
mbed_official 107:414e9c822e99 369 pio_set_peripheral(p_pio, ul_type, ul_mask);
mbed_official 107:414e9c822e99 370 pio_pull_up(p_pio, ul_mask, (ul_attribute & PIO_PULLUP));
mbed_official 107:414e9c822e99 371 break;
mbed_official 107:414e9c822e99 372
mbed_official 107:414e9c822e99 373 case PIO_INPUT:
mbed_official 107:414e9c822e99 374 pio_set_input(p_pio, ul_mask, ul_attribute);
mbed_official 107:414e9c822e99 375 break;
mbed_official 107:414e9c822e99 376
mbed_official 107:414e9c822e99 377 case PIO_OUTPUT_0:
mbed_official 107:414e9c822e99 378 case PIO_OUTPUT_1:
mbed_official 107:414e9c822e99 379 pio_set_output(p_pio, ul_mask, (ul_type == PIO_OUTPUT_1),
mbed_official 107:414e9c822e99 380 (ul_attribute & PIO_OPENDRAIN) ? 1 : 0,
mbed_official 107:414e9c822e99 381 (ul_attribute & PIO_PULLUP) ? 1 : 0);
mbed_official 107:414e9c822e99 382 break;
mbed_official 107:414e9c822e99 383
mbed_official 107:414e9c822e99 384 default:
mbed_official 107:414e9c822e99 385 return 0;
mbed_official 107:414e9c822e99 386 }
mbed_official 107:414e9c822e99 387
mbed_official 107:414e9c822e99 388 return 1;
mbed_official 107:414e9c822e99 389 }
mbed_official 107:414e9c822e99 390
mbed_official 107:414e9c822e99 391 /**
mbed_official 107:414e9c822e99 392 * \brief Return 1 if one or more PIOs of the given Pin are configured to
mbed_official 107:414e9c822e99 393 * output a high level (even if they are not output).
mbed_official 107:414e9c822e99 394 * To get the actual value of the pin, use PIO_Get() instead.
mbed_official 107:414e9c822e99 395 *
mbed_official 107:414e9c822e99 396 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 397 * \param ul_mask Bitmask of one or more pin(s).
mbed_official 107:414e9c822e99 398 *
mbed_official 107:414e9c822e99 399 * \retval 1 At least one PIO is configured to output a high level.
mbed_official 107:414e9c822e99 400 * \retval 0 All PIOs are configured to output a low level.
mbed_official 107:414e9c822e99 401 */
mbed_official 107:414e9c822e99 402 uint32_t pio_get_output_data_status(const Pio *p_pio,
mbed_official 107:414e9c822e99 403 const uint32_t ul_mask)
mbed_official 107:414e9c822e99 404 {
mbed_official 107:414e9c822e99 405 if ((p_pio->PIO_ODSR & ul_mask) == 0) {
mbed_official 107:414e9c822e99 406 return 0;
mbed_official 107:414e9c822e99 407 } else {
mbed_official 107:414e9c822e99 408 return 1;
mbed_official 107:414e9c822e99 409 }
mbed_official 107:414e9c822e99 410 }
mbed_official 107:414e9c822e99 411
mbed_official 107:414e9c822e99 412 /**
mbed_official 107:414e9c822e99 413 * \brief Configure PIO pin multi-driver.
mbed_official 107:414e9c822e99 414 *
mbed_official 107:414e9c822e99 415 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 416 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 417 * \param ul_multi_driver_enable Indicates if the pin(s) multi-driver shall be
mbed_official 107:414e9c822e99 418 * configured.
mbed_official 107:414e9c822e99 419 */
mbed_official 107:414e9c822e99 420 void pio_set_multi_driver(Pio *p_pio, const uint32_t ul_mask,
mbed_official 107:414e9c822e99 421 const uint32_t ul_multi_driver_enable)
mbed_official 107:414e9c822e99 422 {
mbed_official 107:414e9c822e99 423 /* Enable the multi-driver if necessary */
mbed_official 107:414e9c822e99 424 if (ul_multi_driver_enable) {
mbed_official 107:414e9c822e99 425 p_pio->PIO_MDER = ul_mask;
mbed_official 107:414e9c822e99 426 } else {
mbed_official 107:414e9c822e99 427 p_pio->PIO_MDDR = ul_mask;
mbed_official 107:414e9c822e99 428 }
mbed_official 107:414e9c822e99 429 }
mbed_official 107:414e9c822e99 430
mbed_official 107:414e9c822e99 431 /**
mbed_official 107:414e9c822e99 432 * \brief Get multi-driver status.
mbed_official 107:414e9c822e99 433 *
mbed_official 107:414e9c822e99 434 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 435 *
mbed_official 107:414e9c822e99 436 * \return The multi-driver mask value.
mbed_official 107:414e9c822e99 437 */
mbed_official 107:414e9c822e99 438 uint32_t pio_get_multi_driver_status(const Pio *p_pio)
mbed_official 107:414e9c822e99 439 {
mbed_official 107:414e9c822e99 440 return p_pio->PIO_MDSR;
mbed_official 107:414e9c822e99 441 }
mbed_official 107:414e9c822e99 442
mbed_official 107:414e9c822e99 443
mbed_official 107:414e9c822e99 444 #if (SAM3S || SAM3N || SAM4S || SAM4E || SAM4N || SAM4C || SAMG || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 445 /**
mbed_official 107:414e9c822e99 446 * \brief Configure PIO pin internal pull-down.
mbed_official 107:414e9c822e99 447 *
mbed_official 107:414e9c822e99 448 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 449 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 450 * \param ul_pull_down_enable Indicates if the pin(s) internal pull-down shall
mbed_official 107:414e9c822e99 451 * be configured.
mbed_official 107:414e9c822e99 452 */
mbed_official 107:414e9c822e99 453 void pio_pull_down(Pio *p_pio, const uint32_t ul_mask,
mbed_official 107:414e9c822e99 454 const uint32_t ul_pull_down_enable)
mbed_official 107:414e9c822e99 455 {
mbed_official 107:414e9c822e99 456 /* Enable the pull-down if necessary */
mbed_official 107:414e9c822e99 457 if (ul_pull_down_enable) {
mbed_official 107:414e9c822e99 458 p_pio->PIO_PPDER = ul_mask;
mbed_official 107:414e9c822e99 459 } else {
mbed_official 107:414e9c822e99 460 p_pio->PIO_PPDDR = ul_mask;
mbed_official 107:414e9c822e99 461 }
mbed_official 107:414e9c822e99 462 }
mbed_official 107:414e9c822e99 463 #endif
mbed_official 107:414e9c822e99 464
mbed_official 107:414e9c822e99 465 /**
mbed_official 107:414e9c822e99 466 * \brief Enable PIO output write for synchronous data output.
mbed_official 107:414e9c822e99 467 *
mbed_official 107:414e9c822e99 468 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 469 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 470 */
mbed_official 107:414e9c822e99 471 void pio_enable_output_write(Pio *p_pio, const uint32_t ul_mask)
mbed_official 107:414e9c822e99 472 {
mbed_official 107:414e9c822e99 473 p_pio->PIO_OWER = ul_mask;
mbed_official 107:414e9c822e99 474 }
mbed_official 107:414e9c822e99 475
mbed_official 107:414e9c822e99 476 /**
mbed_official 107:414e9c822e99 477 * \brief Disable PIO output write.
mbed_official 107:414e9c822e99 478 *
mbed_official 107:414e9c822e99 479 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 480 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 481 */
mbed_official 107:414e9c822e99 482 void pio_disable_output_write(Pio *p_pio, const uint32_t ul_mask)
mbed_official 107:414e9c822e99 483 {
mbed_official 107:414e9c822e99 484 p_pio->PIO_OWDR = ul_mask;
mbed_official 107:414e9c822e99 485 }
mbed_official 107:414e9c822e99 486
mbed_official 107:414e9c822e99 487 /**
mbed_official 107:414e9c822e99 488 * \brief Read PIO output write status.
mbed_official 107:414e9c822e99 489 *
mbed_official 107:414e9c822e99 490 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 491 *
mbed_official 107:414e9c822e99 492 * \return The output write mask value.
mbed_official 107:414e9c822e99 493 */
mbed_official 107:414e9c822e99 494 uint32_t pio_get_output_write_status(const Pio *p_pio)
mbed_official 107:414e9c822e99 495 {
mbed_official 107:414e9c822e99 496 return p_pio->PIO_OWSR;
mbed_official 107:414e9c822e99 497 }
mbed_official 107:414e9c822e99 498
mbed_official 107:414e9c822e99 499 /**
mbed_official 107:414e9c822e99 500 * \brief Synchronously write on output pins.
mbed_official 107:414e9c822e99 501 * \note Only bits unmasked by PIO_OWSR (Output Write Status Register) are
mbed_official 107:414e9c822e99 502 * written.
mbed_official 107:414e9c822e99 503 *
mbed_official 107:414e9c822e99 504 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 505 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 506 */
mbed_official 107:414e9c822e99 507 void pio_sync_output_write(Pio *p_pio, const uint32_t ul_mask)
mbed_official 107:414e9c822e99 508 {
mbed_official 107:414e9c822e99 509 p_pio->PIO_ODSR = ul_mask;
mbed_official 107:414e9c822e99 510 }
mbed_official 107:414e9c822e99 511
mbed_official 107:414e9c822e99 512 #if (SAM3S || SAM3N || SAM4S || SAM4E || SAM4N || SAM4C || SAMG || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 513 /**
mbed_official 107:414e9c822e99 514 * \brief Configure PIO pin schmitt trigger. By default the Schmitt trigger is
mbed_official 107:414e9c822e99 515 * active.
mbed_official 107:414e9c822e99 516 * Disabling the Schmitt Trigger is requested when using the QTouch Library.
mbed_official 107:414e9c822e99 517 *
mbed_official 107:414e9c822e99 518 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 519 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 520 */
mbed_official 107:414e9c822e99 521 void pio_set_schmitt_trigger(Pio *p_pio, const uint32_t ul_mask)
mbed_official 107:414e9c822e99 522 {
mbed_official 107:414e9c822e99 523 p_pio->PIO_SCHMITT = ul_mask;
mbed_official 107:414e9c822e99 524 }
mbed_official 107:414e9c822e99 525
mbed_official 107:414e9c822e99 526 /**
mbed_official 107:414e9c822e99 527 * \brief Get PIO pin schmitt trigger status.
mbed_official 107:414e9c822e99 528 *
mbed_official 107:414e9c822e99 529 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 530 *
mbed_official 107:414e9c822e99 531 * \return The schmitt trigger mask value.
mbed_official 107:414e9c822e99 532 */
mbed_official 107:414e9c822e99 533 uint32_t pio_get_schmitt_trigger(const Pio *p_pio)
mbed_official 107:414e9c822e99 534 {
mbed_official 107:414e9c822e99 535 return p_pio->PIO_SCHMITT;
mbed_official 107:414e9c822e99 536 }
mbed_official 107:414e9c822e99 537 #endif
mbed_official 107:414e9c822e99 538
mbed_official 107:414e9c822e99 539 /**
mbed_official 107:414e9c822e99 540 * \brief Configure the given interrupt source.
mbed_official 107:414e9c822e99 541 * Interrupt can be configured to trigger on rising edge, falling edge,
mbed_official 107:414e9c822e99 542 * high level, low level or simply on level change.
mbed_official 107:414e9c822e99 543 *
mbed_official 107:414e9c822e99 544 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 545 * \param ul_mask Interrupt source bit map.
mbed_official 107:414e9c822e99 546 * \param ul_attr Interrupt source attributes.
mbed_official 107:414e9c822e99 547 */
mbed_official 107:414e9c822e99 548 void pio_configure_interrupt(Pio *p_pio, const uint32_t ul_mask,
mbed_official 107:414e9c822e99 549 const uint32_t ul_attr)
mbed_official 107:414e9c822e99 550 {
mbed_official 107:414e9c822e99 551 /* Configure additional interrupt mode registers. */
mbed_official 107:414e9c822e99 552 if (ul_attr & PIO_IT_AIME) {
mbed_official 107:414e9c822e99 553 /* Enable additional interrupt mode. */
mbed_official 107:414e9c822e99 554 p_pio->PIO_AIMER = ul_mask;
mbed_official 107:414e9c822e99 555
mbed_official 107:414e9c822e99 556 /* If bit field of the selected pin is 1, set as
mbed_official 107:414e9c822e99 557 Rising Edge/High level detection event. */
mbed_official 107:414e9c822e99 558 if (ul_attr & PIO_IT_RE_OR_HL) {
mbed_official 107:414e9c822e99 559 /* Rising Edge or High Level */
mbed_official 107:414e9c822e99 560 p_pio->PIO_REHLSR = ul_mask;
mbed_official 107:414e9c822e99 561 } else {
mbed_official 107:414e9c822e99 562 /* Falling Edge or Low Level */
mbed_official 107:414e9c822e99 563 p_pio->PIO_FELLSR = ul_mask;
mbed_official 107:414e9c822e99 564 }
mbed_official 107:414e9c822e99 565
mbed_official 107:414e9c822e99 566 /* If bit field of the selected pin is 1, set as
mbed_official 107:414e9c822e99 567 edge detection source. */
mbed_official 107:414e9c822e99 568 if (ul_attr & PIO_IT_EDGE) {
mbed_official 107:414e9c822e99 569 /* Edge select */
mbed_official 107:414e9c822e99 570 p_pio->PIO_ESR = ul_mask;
mbed_official 107:414e9c822e99 571 } else {
mbed_official 107:414e9c822e99 572 /* Level select */
mbed_official 107:414e9c822e99 573 p_pio->PIO_LSR = ul_mask;
mbed_official 107:414e9c822e99 574 }
mbed_official 107:414e9c822e99 575 } else {
mbed_official 107:414e9c822e99 576 /* Disable additional interrupt mode. */
mbed_official 107:414e9c822e99 577 p_pio->PIO_AIMDR = ul_mask;
mbed_official 107:414e9c822e99 578 }
mbed_official 107:414e9c822e99 579 }
mbed_official 107:414e9c822e99 580
mbed_official 107:414e9c822e99 581 /**
mbed_official 107:414e9c822e99 582 * \brief Enable the given interrupt source.
mbed_official 107:414e9c822e99 583 * The PIO must be configured as an NVIC interrupt source as well.
mbed_official 107:414e9c822e99 584 * The status register of the corresponding PIO controller is cleared
mbed_official 107:414e9c822e99 585 * prior to enabling the interrupt.
mbed_official 107:414e9c822e99 586 *
mbed_official 107:414e9c822e99 587 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 588 * \param ul_mask Interrupt sources bit map.
mbed_official 107:414e9c822e99 589 */
mbed_official 107:414e9c822e99 590 void pio_enable_interrupt(Pio *p_pio, const uint32_t ul_mask)
mbed_official 107:414e9c822e99 591 {
mbed_official 107:414e9c822e99 592 p_pio->PIO_ISR;
mbed_official 107:414e9c822e99 593 p_pio->PIO_IER = ul_mask;
mbed_official 107:414e9c822e99 594 }
mbed_official 107:414e9c822e99 595
mbed_official 107:414e9c822e99 596 /**
mbed_official 107:414e9c822e99 597 * \brief Disable a given interrupt source, with no added side effects.
mbed_official 107:414e9c822e99 598 *
mbed_official 107:414e9c822e99 599 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 600 * \param ul_mask Interrupt sources bit map.
mbed_official 107:414e9c822e99 601 */
mbed_official 107:414e9c822e99 602 void pio_disable_interrupt(Pio *p_pio, const uint32_t ul_mask)
mbed_official 107:414e9c822e99 603 {
mbed_official 107:414e9c822e99 604 p_pio->PIO_IDR = ul_mask;
mbed_official 107:414e9c822e99 605 }
mbed_official 107:414e9c822e99 606
mbed_official 107:414e9c822e99 607 /**
mbed_official 107:414e9c822e99 608 * \brief Read PIO interrupt status.
mbed_official 107:414e9c822e99 609 *
mbed_official 107:414e9c822e99 610 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 611 *
mbed_official 107:414e9c822e99 612 * \return The interrupt status mask value.
mbed_official 107:414e9c822e99 613 */
mbed_official 107:414e9c822e99 614 uint32_t pio_get_interrupt_status(const Pio *p_pio)
mbed_official 107:414e9c822e99 615 {
mbed_official 107:414e9c822e99 616 return p_pio->PIO_ISR;
mbed_official 107:414e9c822e99 617 }
mbed_official 107:414e9c822e99 618
mbed_official 107:414e9c822e99 619 /**
mbed_official 107:414e9c822e99 620 * \brief Read PIO interrupt mask.
mbed_official 107:414e9c822e99 621 *
mbed_official 107:414e9c822e99 622 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 623 *
mbed_official 107:414e9c822e99 624 * \return The interrupt mask value.
mbed_official 107:414e9c822e99 625 */
mbed_official 107:414e9c822e99 626 uint32_t pio_get_interrupt_mask(const Pio *p_pio)
mbed_official 107:414e9c822e99 627 {
mbed_official 107:414e9c822e99 628 return p_pio->PIO_IMR;
mbed_official 107:414e9c822e99 629 }
mbed_official 107:414e9c822e99 630
mbed_official 107:414e9c822e99 631 /**
mbed_official 107:414e9c822e99 632 * \brief Set additional interrupt mode.
mbed_official 107:414e9c822e99 633 *
mbed_official 107:414e9c822e99 634 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 635 * \param ul_mask Interrupt sources bit map.
mbed_official 107:414e9c822e99 636 * \param ul_attribute Pin(s) attributes.
mbed_official 107:414e9c822e99 637 */
mbed_official 107:414e9c822e99 638 void pio_set_additional_interrupt_mode(Pio *p_pio,
mbed_official 107:414e9c822e99 639 const uint32_t ul_mask, const uint32_t ul_attribute)
mbed_official 107:414e9c822e99 640 {
mbed_official 107:414e9c822e99 641 /* Enables additional interrupt mode if needed */
mbed_official 107:414e9c822e99 642 if (ul_attribute & PIO_IT_AIME) {
mbed_official 107:414e9c822e99 643 /* Enables additional interrupt mode */
mbed_official 107:414e9c822e99 644 p_pio->PIO_AIMER = ul_mask;
mbed_official 107:414e9c822e99 645
mbed_official 107:414e9c822e99 646 /* Configures the Polarity of the event detection */
mbed_official 107:414e9c822e99 647 /* (Rising/Falling Edge or High/Low Level) */
mbed_official 107:414e9c822e99 648 if (ul_attribute & PIO_IT_RE_OR_HL) {
mbed_official 107:414e9c822e99 649 /* Rising Edge or High Level */
mbed_official 107:414e9c822e99 650 p_pio->PIO_REHLSR = ul_mask;
mbed_official 107:414e9c822e99 651 } else {
mbed_official 107:414e9c822e99 652 /* Falling Edge or Low Level */
mbed_official 107:414e9c822e99 653 p_pio->PIO_FELLSR = ul_mask;
mbed_official 107:414e9c822e99 654 }
mbed_official 107:414e9c822e99 655
mbed_official 107:414e9c822e99 656 /* Configures the type of event detection (Edge or Level) */
mbed_official 107:414e9c822e99 657 if (ul_attribute & PIO_IT_EDGE) {
mbed_official 107:414e9c822e99 658 /* Edge select */
mbed_official 107:414e9c822e99 659 p_pio->PIO_ESR = ul_mask;
mbed_official 107:414e9c822e99 660 } else {
mbed_official 107:414e9c822e99 661 /* Level select */
mbed_official 107:414e9c822e99 662 p_pio->PIO_LSR = ul_mask;
mbed_official 107:414e9c822e99 663 }
mbed_official 107:414e9c822e99 664 } else {
mbed_official 107:414e9c822e99 665 /* Disable additional interrupt mode */
mbed_official 107:414e9c822e99 666 p_pio->PIO_AIMDR = ul_mask;
mbed_official 107:414e9c822e99 667 }
mbed_official 107:414e9c822e99 668 }
mbed_official 107:414e9c822e99 669
mbed_official 107:414e9c822e99 670 #ifndef PIO_WPMR_WPKEY_PASSWD
mbed_official 107:414e9c822e99 671 #define PIO_WPMR_WPKEY_PASSWD PIO_WPMR_WPKEY(0x50494FU)
mbed_official 107:414e9c822e99 672 #endif
mbed_official 107:414e9c822e99 673
mbed_official 107:414e9c822e99 674 /**
mbed_official 107:414e9c822e99 675 * \brief Enable or disable write protect of PIO registers.
mbed_official 107:414e9c822e99 676 *
mbed_official 107:414e9c822e99 677 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 678 * \param ul_enable 1 to enable, 0 to disable.
mbed_official 107:414e9c822e99 679 */
mbed_official 107:414e9c822e99 680 void pio_set_writeprotect(Pio *p_pio, const uint32_t ul_enable)
mbed_official 107:414e9c822e99 681 {
mbed_official 107:414e9c822e99 682 p_pio->PIO_WPMR = PIO_WPMR_WPKEY_PASSWD | (ul_enable & PIO_WPMR_WPEN);
mbed_official 107:414e9c822e99 683 }
mbed_official 107:414e9c822e99 684
mbed_official 107:414e9c822e99 685 /**
mbed_official 107:414e9c822e99 686 * \brief Read write protect status.
mbed_official 107:414e9c822e99 687 *
mbed_official 107:414e9c822e99 688 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 689 *
mbed_official 107:414e9c822e99 690 * \return Return write protect status.
mbed_official 107:414e9c822e99 691 */
mbed_official 107:414e9c822e99 692 uint32_t pio_get_writeprotect_status(const Pio *p_pio)
mbed_official 107:414e9c822e99 693 {
mbed_official 107:414e9c822e99 694 return p_pio->PIO_WPSR;
mbed_official 107:414e9c822e99 695 }
mbed_official 107:414e9c822e99 696
mbed_official 107:414e9c822e99 697 /**
mbed_official 107:414e9c822e99 698 * \brief Return the value of a pin.
mbed_official 107:414e9c822e99 699 *
mbed_official 107:414e9c822e99 700 * \param ul_pin The pin number.
mbed_official 107:414e9c822e99 701 *
mbed_official 107:414e9c822e99 702 * \return The pin value.
mbed_official 107:414e9c822e99 703 *
mbed_official 107:414e9c822e99 704 * \note If pin is output: a pull-up or pull-down could hide the actual value.
mbed_official 107:414e9c822e99 705 * The function \ref pio_get can be called to get the actual pin output
mbed_official 107:414e9c822e99 706 * level.
mbed_official 107:414e9c822e99 707 * \note If pin is input: PIOx must be clocked to sample the signal.
mbed_official 107:414e9c822e99 708 * See PMC driver.
mbed_official 107:414e9c822e99 709 */
mbed_official 107:414e9c822e99 710 uint32_t pio_get_pin_value(uint32_t ul_pin)
mbed_official 107:414e9c822e99 711 {
mbed_official 107:414e9c822e99 712 Pio *p_pio = pio_get_pin_group(ul_pin);
mbed_official 107:414e9c822e99 713
mbed_official 107:414e9c822e99 714 return (p_pio->PIO_PDSR >> (ul_pin & 0x1F)) & 1;
mbed_official 107:414e9c822e99 715 }
mbed_official 107:414e9c822e99 716
mbed_official 107:414e9c822e99 717 /**
mbed_official 107:414e9c822e99 718 * \brief Drive a GPIO pin to 1.
mbed_official 107:414e9c822e99 719 *
mbed_official 107:414e9c822e99 720 * \param ul_pin The pin index.
mbed_official 107:414e9c822e99 721 *
mbed_official 107:414e9c822e99 722 * \note The function \ref pio_configure_pin must be called beforehand.
mbed_official 107:414e9c822e99 723 */
mbed_official 107:414e9c822e99 724 void pio_set_pin_high(uint32_t ul_pin)
mbed_official 107:414e9c822e99 725 {
mbed_official 107:414e9c822e99 726 Pio *p_pio = pio_get_pin_group(ul_pin);
mbed_official 107:414e9c822e99 727
mbed_official 107:414e9c822e99 728 /* Value to be driven on the I/O line: 1. */
mbed_official 107:414e9c822e99 729 p_pio->PIO_SODR = 1 << (ul_pin & 0x1F);
mbed_official 107:414e9c822e99 730 }
mbed_official 107:414e9c822e99 731
mbed_official 107:414e9c822e99 732 /**
mbed_official 107:414e9c822e99 733 * \brief Drive a GPIO pin to 0.
mbed_official 107:414e9c822e99 734 *
mbed_official 107:414e9c822e99 735 * \param ul_pin The pin index.
mbed_official 107:414e9c822e99 736 *
mbed_official 107:414e9c822e99 737 * \note The function \ref pio_configure_pin must be called before.
mbed_official 107:414e9c822e99 738 */
mbed_official 107:414e9c822e99 739 void pio_set_pin_low(uint32_t ul_pin)
mbed_official 107:414e9c822e99 740 {
mbed_official 107:414e9c822e99 741 Pio *p_pio = pio_get_pin_group(ul_pin);
mbed_official 107:414e9c822e99 742
mbed_official 107:414e9c822e99 743 /* Value to be driven on the I/O line: 0. */
mbed_official 107:414e9c822e99 744 p_pio->PIO_CODR = 1 << (ul_pin & 0x1F);
mbed_official 107:414e9c822e99 745 }
mbed_official 107:414e9c822e99 746
mbed_official 107:414e9c822e99 747 /**
mbed_official 107:414e9c822e99 748 * \brief Toggle a GPIO pin.
mbed_official 107:414e9c822e99 749 *
mbed_official 107:414e9c822e99 750 * \param ul_pin The pin index.
mbed_official 107:414e9c822e99 751 *
mbed_official 107:414e9c822e99 752 * \note The function \ref pio_configure_pin must be called before.
mbed_official 107:414e9c822e99 753 */
mbed_official 107:414e9c822e99 754 void pio_toggle_pin(uint32_t ul_pin)
mbed_official 107:414e9c822e99 755 {
mbed_official 107:414e9c822e99 756 Pio *p_pio = pio_get_pin_group(ul_pin);
mbed_official 107:414e9c822e99 757
mbed_official 107:414e9c822e99 758 if (p_pio->PIO_ODSR & (1 << (ul_pin & 0x1F))) {
mbed_official 107:414e9c822e99 759 /* Value to be driven on the I/O line: 0. */
mbed_official 107:414e9c822e99 760 p_pio->PIO_CODR = 1 << (ul_pin & 0x1F);
mbed_official 107:414e9c822e99 761 } else {
mbed_official 107:414e9c822e99 762 /* Value to be driven on the I/O line: 1. */
mbed_official 107:414e9c822e99 763 p_pio->PIO_SODR = 1 << (ul_pin & 0x1F);
mbed_official 107:414e9c822e99 764 }
mbed_official 107:414e9c822e99 765 }
mbed_official 107:414e9c822e99 766
mbed_official 107:414e9c822e99 767 /**
mbed_official 107:414e9c822e99 768 * \brief Perform complete pin(s) configuration; general attributes and PIO init
mbed_official 107:414e9c822e99 769 * if necessary.
mbed_official 107:414e9c822e99 770 *
mbed_official 107:414e9c822e99 771 * \param ul_pin Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 772 * \param ul_flags Pins attributes.
mbed_official 107:414e9c822e99 773 *
mbed_official 107:414e9c822e99 774 * \return Whether the pin(s) have been configured properly.
mbed_official 107:414e9c822e99 775 */
mbed_official 107:414e9c822e99 776 uint32_t pio_configure_pin(uint32_t ul_pin, const uint32_t ul_flags)
mbed_official 107:414e9c822e99 777 {
mbed_official 107:414e9c822e99 778 Pio *p_pio = pio_get_pin_group(ul_pin);
mbed_official 107:414e9c822e99 779
mbed_official 107:414e9c822e99 780 /* Configure pins */
mbed_official 107:414e9c822e99 781 switch (ul_flags & PIO_TYPE_Msk) {
mbed_official 107:414e9c822e99 782 case PIO_TYPE_PIO_PERIPH_A:
mbed_official 107:414e9c822e99 783 pio_set_peripheral(p_pio, PIO_PERIPH_A, (1 << (ul_pin & 0x1F)));
mbed_official 107:414e9c822e99 784 pio_pull_up(p_pio, (1 << (ul_pin & 0x1F)),
mbed_official 107:414e9c822e99 785 (ul_flags & PIO_PULLUP));
mbed_official 107:414e9c822e99 786 break;
mbed_official 107:414e9c822e99 787 case PIO_TYPE_PIO_PERIPH_B:
mbed_official 107:414e9c822e99 788 pio_set_peripheral(p_pio, PIO_PERIPH_B, (1 << (ul_pin & 0x1F)));
mbed_official 107:414e9c822e99 789 pio_pull_up(p_pio, (1 << (ul_pin & 0x1F)),
mbed_official 107:414e9c822e99 790 (ul_flags & PIO_PULLUP));
mbed_official 107:414e9c822e99 791 break;
mbed_official 107:414e9c822e99 792 #if (SAM3S || SAM3N || SAM4S || SAM4E || SAM4N || SAM4C || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 793 case PIO_TYPE_PIO_PERIPH_C:
mbed_official 107:414e9c822e99 794 pio_set_peripheral(p_pio, PIO_PERIPH_C, (1 << (ul_pin & 0x1F)));
mbed_official 107:414e9c822e99 795 pio_pull_up(p_pio, (1 << (ul_pin & 0x1F)),
mbed_official 107:414e9c822e99 796 (ul_flags & PIO_PULLUP));
mbed_official 107:414e9c822e99 797 break;
mbed_official 107:414e9c822e99 798 case PIO_TYPE_PIO_PERIPH_D:
mbed_official 107:414e9c822e99 799 pio_set_peripheral(p_pio, PIO_PERIPH_D, (1 << (ul_pin & 0x1F)));
mbed_official 107:414e9c822e99 800 pio_pull_up(p_pio, (1 << (ul_pin & 0x1F)),
mbed_official 107:414e9c822e99 801 (ul_flags & PIO_PULLUP));
mbed_official 107:414e9c822e99 802 break;
mbed_official 107:414e9c822e99 803 #endif
mbed_official 107:414e9c822e99 804
mbed_official 107:414e9c822e99 805 case PIO_TYPE_PIO_INPUT:
mbed_official 107:414e9c822e99 806 pio_set_input(p_pio, (1 << (ul_pin & 0x1F)), ul_flags);
mbed_official 107:414e9c822e99 807 break;
mbed_official 107:414e9c822e99 808
mbed_official 107:414e9c822e99 809 case PIO_TYPE_PIO_OUTPUT_0:
mbed_official 107:414e9c822e99 810 case PIO_TYPE_PIO_OUTPUT_1:
mbed_official 107:414e9c822e99 811 pio_set_output(p_pio, (1 << (ul_pin & 0x1F)),
mbed_official 107:414e9c822e99 812 ((ul_flags & PIO_TYPE_PIO_OUTPUT_1)
mbed_official 107:414e9c822e99 813 == PIO_TYPE_PIO_OUTPUT_1) ? 1 : 0,
mbed_official 107:414e9c822e99 814 (ul_flags & PIO_OPENDRAIN) ? 1 : 0,
mbed_official 107:414e9c822e99 815 (ul_flags & PIO_PULLUP) ? 1 : 0);
mbed_official 107:414e9c822e99 816 break;
mbed_official 107:414e9c822e99 817
mbed_official 107:414e9c822e99 818 default:
mbed_official 107:414e9c822e99 819 return 0;
mbed_official 107:414e9c822e99 820 }
mbed_official 107:414e9c822e99 821
mbed_official 107:414e9c822e99 822 return 1;
mbed_official 107:414e9c822e99 823 }
mbed_official 107:414e9c822e99 824
mbed_official 107:414e9c822e99 825 /**
mbed_official 107:414e9c822e99 826 * \brief Drive a GPIO port to 1.
mbed_official 107:414e9c822e99 827 *
mbed_official 107:414e9c822e99 828 * \param p_pio Base address of the PIO port.
mbed_official 107:414e9c822e99 829 * \param ul_mask Bitmask of one or more pin(s) to toggle.
mbed_official 107:414e9c822e99 830 */
mbed_official 107:414e9c822e99 831 void pio_set_pin_group_high(Pio *p_pio, uint32_t ul_mask)
mbed_official 107:414e9c822e99 832 {
mbed_official 107:414e9c822e99 833 /* Value to be driven on the I/O line: 1. */
mbed_official 107:414e9c822e99 834 p_pio->PIO_SODR = ul_mask;
mbed_official 107:414e9c822e99 835 }
mbed_official 107:414e9c822e99 836
mbed_official 107:414e9c822e99 837 /**
mbed_official 107:414e9c822e99 838 * \brief Drive a GPIO port to 0.
mbed_official 107:414e9c822e99 839 *
mbed_official 107:414e9c822e99 840 * \param p_pio Base address of the PIO port.
mbed_official 107:414e9c822e99 841 * \param ul_mask Bitmask of one or more pin(s) to toggle.
mbed_official 107:414e9c822e99 842 */
mbed_official 107:414e9c822e99 843 void pio_set_pin_group_low(Pio *p_pio, uint32_t ul_mask)
mbed_official 107:414e9c822e99 844 {
mbed_official 107:414e9c822e99 845 /* Value to be driven on the I/O line: 0. */
mbed_official 107:414e9c822e99 846 p_pio->PIO_CODR = ul_mask;
mbed_official 107:414e9c822e99 847 }
mbed_official 107:414e9c822e99 848
mbed_official 107:414e9c822e99 849 /**
mbed_official 107:414e9c822e99 850 * \brief Toggle a GPIO group.
mbed_official 107:414e9c822e99 851 *
mbed_official 107:414e9c822e99 852 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 853 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 854 */
mbed_official 107:414e9c822e99 855 void pio_toggle_pin_group(Pio *p_pio, uint32_t ul_mask)
mbed_official 107:414e9c822e99 856 {
mbed_official 107:414e9c822e99 857 if (p_pio->PIO_ODSR & ul_mask) {
mbed_official 107:414e9c822e99 858 /* Value to be driven on the I/O line: 0. */
mbed_official 107:414e9c822e99 859 p_pio->PIO_CODR = ul_mask;
mbed_official 107:414e9c822e99 860 } else {
mbed_official 107:414e9c822e99 861 /* Value to be driven on the I/O line: 1. */
mbed_official 107:414e9c822e99 862 p_pio->PIO_SODR = ul_mask;
mbed_official 107:414e9c822e99 863 }
mbed_official 107:414e9c822e99 864 }
mbed_official 107:414e9c822e99 865
mbed_official 107:414e9c822e99 866 /**
mbed_official 107:414e9c822e99 867 * \brief Perform complete pin(s) configuration; general attributes and PIO init
mbed_official 107:414e9c822e99 868 * if necessary.
mbed_official 107:414e9c822e99 869 *
mbed_official 107:414e9c822e99 870 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 871 * \param ul_mask Bitmask of one or more pin(s) to configure.
mbed_official 107:414e9c822e99 872 * \param ul_flags Pin(s) attributes.
mbed_official 107:414e9c822e99 873 *
mbed_official 107:414e9c822e99 874 * \return Whether the pin(s) have been configured properly.
mbed_official 107:414e9c822e99 875 */
mbed_official 107:414e9c822e99 876 uint32_t pio_configure_pin_group(Pio *p_pio,
mbed_official 107:414e9c822e99 877 uint32_t ul_mask, const uint32_t ul_flags)
mbed_official 107:414e9c822e99 878 {
mbed_official 107:414e9c822e99 879 /* Configure pins */
mbed_official 107:414e9c822e99 880 switch (ul_flags & PIO_TYPE_Msk) {
mbed_official 107:414e9c822e99 881 case PIO_TYPE_PIO_PERIPH_A:
mbed_official 107:414e9c822e99 882 pio_set_peripheral(p_pio, PIO_PERIPH_A, ul_mask);
mbed_official 107:414e9c822e99 883 pio_pull_up(p_pio, ul_mask, (ul_flags & PIO_PULLUP));
mbed_official 107:414e9c822e99 884 break;
mbed_official 107:414e9c822e99 885 case PIO_TYPE_PIO_PERIPH_B:
mbed_official 107:414e9c822e99 886 pio_set_peripheral(p_pio, PIO_PERIPH_B, ul_mask);
mbed_official 107:414e9c822e99 887 pio_pull_up(p_pio, ul_mask, (ul_flags & PIO_PULLUP));
mbed_official 107:414e9c822e99 888 break;
mbed_official 107:414e9c822e99 889 #if (SAM3S || SAM3N || SAM4S || SAM4E || SAM4N || SAM4C || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 890 case PIO_TYPE_PIO_PERIPH_C:
mbed_official 107:414e9c822e99 891 pio_set_peripheral(p_pio, PIO_PERIPH_C, ul_mask);
mbed_official 107:414e9c822e99 892 pio_pull_up(p_pio, ul_mask, (ul_flags & PIO_PULLUP));
mbed_official 107:414e9c822e99 893 break;
mbed_official 107:414e9c822e99 894 case PIO_TYPE_PIO_PERIPH_D:
mbed_official 107:414e9c822e99 895 pio_set_peripheral(p_pio, PIO_PERIPH_D, ul_mask);
mbed_official 107:414e9c822e99 896 pio_pull_up(p_pio, ul_mask, (ul_flags & PIO_PULLUP));
mbed_official 107:414e9c822e99 897 break;
mbed_official 107:414e9c822e99 898 #endif
mbed_official 107:414e9c822e99 899
mbed_official 107:414e9c822e99 900 case PIO_TYPE_PIO_INPUT:
mbed_official 107:414e9c822e99 901 pio_set_input(p_pio, ul_mask, ul_flags);
mbed_official 107:414e9c822e99 902 break;
mbed_official 107:414e9c822e99 903
mbed_official 107:414e9c822e99 904 case PIO_TYPE_PIO_OUTPUT_0:
mbed_official 107:414e9c822e99 905 case PIO_TYPE_PIO_OUTPUT_1:
mbed_official 107:414e9c822e99 906 pio_set_output(p_pio, ul_mask,
mbed_official 107:414e9c822e99 907 ((ul_flags & PIO_TYPE_PIO_OUTPUT_1)
mbed_official 107:414e9c822e99 908 == PIO_TYPE_PIO_OUTPUT_1) ? 1 : 0,
mbed_official 107:414e9c822e99 909 (ul_flags & PIO_OPENDRAIN) ? 1 : 0,
mbed_official 107:414e9c822e99 910 (ul_flags & PIO_PULLUP) ? 1 : 0);
mbed_official 107:414e9c822e99 911 break;
mbed_official 107:414e9c822e99 912
mbed_official 107:414e9c822e99 913 default:
mbed_official 107:414e9c822e99 914 return 0;
mbed_official 107:414e9c822e99 915 }
mbed_official 107:414e9c822e99 916
mbed_official 107:414e9c822e99 917 return 1;
mbed_official 107:414e9c822e99 918 }
mbed_official 107:414e9c822e99 919
mbed_official 107:414e9c822e99 920 /**
mbed_official 107:414e9c822e99 921 * \brief Enable interrupt for a GPIO pin.
mbed_official 107:414e9c822e99 922 *
mbed_official 107:414e9c822e99 923 * \param ul_pin The pin index.
mbed_official 107:414e9c822e99 924 *
mbed_official 107:414e9c822e99 925 * \note The function \ref gpio_configure_pin must be called before.
mbed_official 107:414e9c822e99 926 */
mbed_official 107:414e9c822e99 927 void pio_enable_pin_interrupt(uint32_t ul_pin)
mbed_official 107:414e9c822e99 928 {
mbed_official 107:414e9c822e99 929 Pio *p_pio = pio_get_pin_group(ul_pin);
mbed_official 107:414e9c822e99 930
mbed_official 107:414e9c822e99 931 p_pio->PIO_IER = 1 << (ul_pin & 0x1F);
mbed_official 107:414e9c822e99 932 }
mbed_official 107:414e9c822e99 933
mbed_official 107:414e9c822e99 934
mbed_official 107:414e9c822e99 935 /**
mbed_official 107:414e9c822e99 936 * \brief Disable interrupt for a GPIO pin.
mbed_official 107:414e9c822e99 937 *
mbed_official 107:414e9c822e99 938 * \param ul_pin The pin index.
mbed_official 107:414e9c822e99 939 *
mbed_official 107:414e9c822e99 940 * \note The function \ref gpio_configure_pin must be called before.
mbed_official 107:414e9c822e99 941 */
mbed_official 107:414e9c822e99 942 void pio_disable_pin_interrupt(uint32_t ul_pin)
mbed_official 107:414e9c822e99 943 {
mbed_official 107:414e9c822e99 944 Pio *p_pio = pio_get_pin_group(ul_pin);
mbed_official 107:414e9c822e99 945
mbed_official 107:414e9c822e99 946 p_pio->PIO_IDR = 1 << (ul_pin & 0x1F);
mbed_official 107:414e9c822e99 947 }
mbed_official 107:414e9c822e99 948
mbed_official 107:414e9c822e99 949
mbed_official 107:414e9c822e99 950 /**
mbed_official 107:414e9c822e99 951 * \brief Return GPIO port for a GPIO pin.
mbed_official 107:414e9c822e99 952 *
mbed_official 107:414e9c822e99 953 * \param ul_pin The pin index.
mbed_official 107:414e9c822e99 954 *
mbed_official 107:414e9c822e99 955 * \return Pointer to \ref Pio struct for GPIO port.
mbed_official 107:414e9c822e99 956 */
mbed_official 107:414e9c822e99 957 Pio *pio_get_pin_group(uint32_t ul_pin)
mbed_official 107:414e9c822e99 958 {
mbed_official 107:414e9c822e99 959 Pio *p_pio;
mbed_official 107:414e9c822e99 960
mbed_official 107:414e9c822e99 961 #if (SAM4C || SAM4CP)
mbed_official 107:414e9c822e99 962 # ifdef ID_PIOD
mbed_official 107:414e9c822e99 963 if (ul_pin > PIO_PC9_IDX) {
mbed_official 107:414e9c822e99 964 p_pio = PIOD;
mbed_official 107:414e9c822e99 965 } else if (ul_pin > PIO_PB31_IDX) {
mbed_official 107:414e9c822e99 966 # else
mbed_official 107:414e9c822e99 967 if (ul_pin > PIO_PB31_IDX) {
mbed_official 107:414e9c822e99 968 # endif
mbed_official 107:414e9c822e99 969 p_pio = PIOC;
mbed_official 107:414e9c822e99 970 } else {
mbed_official 107:414e9c822e99 971 p_pio = (Pio *)((uint32_t)PIOA + (PIO_DELTA * (ul_pin >> 5)));
mbed_official 107:414e9c822e99 972 }
mbed_official 107:414e9c822e99 973 #elif (SAM4CM)
mbed_official 107:414e9c822e99 974 if (ul_pin > PIO_PB21_IDX) {
mbed_official 107:414e9c822e99 975 p_pio = PIOC;
mbed_official 107:414e9c822e99 976 } else {
mbed_official 107:414e9c822e99 977 p_pio = (Pio *)((uint32_t)PIOA + (PIO_DELTA * (ul_pin >> 5)));
mbed_official 107:414e9c822e99 978 }
mbed_official 107:414e9c822e99 979 #else
mbed_official 107:414e9c822e99 980 p_pio = (Pio *)((uint32_t)PIOA + (PIO_DELTA * (ul_pin >> 5)));
mbed_official 107:414e9c822e99 981 #endif
mbed_official 107:414e9c822e99 982 return p_pio;
mbed_official 107:414e9c822e99 983 }
mbed_official 107:414e9c822e99 984
mbed_official 107:414e9c822e99 985 /**
mbed_official 107:414e9c822e99 986 * \brief Return GPIO port peripheral ID for a GPIO pin.
mbed_official 107:414e9c822e99 987 *
mbed_official 107:414e9c822e99 988 * \param ul_pin The pin index.
mbed_official 107:414e9c822e99 989 *
mbed_official 107:414e9c822e99 990 * \return GPIO port peripheral ID.
mbed_official 107:414e9c822e99 991 */
mbed_official 107:414e9c822e99 992 uint32_t pio_get_pin_group_id(uint32_t ul_pin)
mbed_official 107:414e9c822e99 993 {
mbed_official 107:414e9c822e99 994 uint32_t ul_id;
mbed_official 107:414e9c822e99 995
mbed_official 107:414e9c822e99 996 #if (SAM4C || SAM4CP)
mbed_official 107:414e9c822e99 997 # ifdef ID_PIOD
mbed_official 107:414e9c822e99 998 if (ul_pin > PIO_PC9_IDX) {
mbed_official 107:414e9c822e99 999 ul_id = ID_PIOD;
mbed_official 107:414e9c822e99 1000 } else if (ul_pin > PIO_PB31_IDX) {
mbed_official 107:414e9c822e99 1001 # else
mbed_official 107:414e9c822e99 1002 if (ul_pin > PIO_PB31_IDX) {
mbed_official 107:414e9c822e99 1003 # endif
mbed_official 107:414e9c822e99 1004 ul_id = ID_PIOC;
mbed_official 107:414e9c822e99 1005 } else {
mbed_official 107:414e9c822e99 1006 ul_id = ID_PIOA + (ul_pin >> 5);
mbed_official 107:414e9c822e99 1007 }
mbed_official 107:414e9c822e99 1008 #elif (SAM4CM)
mbed_official 107:414e9c822e99 1009 if (ul_pin > PIO_PB21_IDX) {
mbed_official 107:414e9c822e99 1010 ul_id = ID_PIOC;
mbed_official 107:414e9c822e99 1011 } else {
mbed_official 107:414e9c822e99 1012 ul_id = ID_PIOA + (ul_pin >> 5);
mbed_official 107:414e9c822e99 1013 }
mbed_official 107:414e9c822e99 1014 #else
mbed_official 107:414e9c822e99 1015 ul_id = ID_PIOA + (ul_pin >> 5);
mbed_official 107:414e9c822e99 1016 #endif
mbed_official 107:414e9c822e99 1017 return ul_id;
mbed_official 107:414e9c822e99 1018 }
mbed_official 107:414e9c822e99 1019
mbed_official 107:414e9c822e99 1020
mbed_official 107:414e9c822e99 1021 /**
mbed_official 107:414e9c822e99 1022 * \brief Return GPIO port pin mask for a GPIO pin.
mbed_official 107:414e9c822e99 1023 *
mbed_official 107:414e9c822e99 1024 * \param ul_pin The pin index.
mbed_official 107:414e9c822e99 1025 *
mbed_official 107:414e9c822e99 1026 * \return GPIO port pin mask.
mbed_official 107:414e9c822e99 1027 */
mbed_official 107:414e9c822e99 1028 uint32_t pio_get_pin_group_mask(uint32_t ul_pin)
mbed_official 107:414e9c822e99 1029 {
mbed_official 107:414e9c822e99 1030 uint32_t ul_mask = 1 << (ul_pin & 0x1F);
mbed_official 107:414e9c822e99 1031 return ul_mask;
mbed_official 107:414e9c822e99 1032 }
mbed_official 107:414e9c822e99 1033
mbed_official 107:414e9c822e99 1034 #if (SAM3S || SAM4S || SAM4E || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 1035 /* Capture mode enable flag */
mbed_official 107:414e9c822e99 1036 uint32_t pio_capture_enable_flag;
mbed_official 107:414e9c822e99 1037
mbed_official 107:414e9c822e99 1038 /**
mbed_official 107:414e9c822e99 1039 * \brief Configure PIO capture mode.
mbed_official 107:414e9c822e99 1040 * \note PIO capture mode will be disabled automatically.
mbed_official 107:414e9c822e99 1041 *
mbed_official 107:414e9c822e99 1042 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1043 * \param ul_mode Bitmask of one or more modes.
mbed_official 107:414e9c822e99 1044 */
mbed_official 107:414e9c822e99 1045 void pio_capture_set_mode(Pio *p_pio, uint32_t ul_mode)
mbed_official 107:414e9c822e99 1046 {
mbed_official 107:414e9c822e99 1047 ul_mode &= (~PIO_PCMR_PCEN); /* Disable PIO capture mode */
mbed_official 107:414e9c822e99 1048 p_pio->PIO_PCMR = ul_mode;
mbed_official 107:414e9c822e99 1049 }
mbed_official 107:414e9c822e99 1050
mbed_official 107:414e9c822e99 1051 /**
mbed_official 107:414e9c822e99 1052 * \brief Enable PIO capture mode.
mbed_official 107:414e9c822e99 1053 *
mbed_official 107:414e9c822e99 1054 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1055 */
mbed_official 107:414e9c822e99 1056 void pio_capture_enable(Pio *p_pio)
mbed_official 107:414e9c822e99 1057 {
mbed_official 107:414e9c822e99 1058 p_pio->PIO_PCMR |= PIO_PCMR_PCEN;
mbed_official 107:414e9c822e99 1059 pio_capture_enable_flag = true;
mbed_official 107:414e9c822e99 1060 }
mbed_official 107:414e9c822e99 1061
mbed_official 107:414e9c822e99 1062 /**
mbed_official 107:414e9c822e99 1063 * \brief Disable PIO capture mode.
mbed_official 107:414e9c822e99 1064 *
mbed_official 107:414e9c822e99 1065 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1066 */
mbed_official 107:414e9c822e99 1067 void pio_capture_disable(Pio *p_pio)
mbed_official 107:414e9c822e99 1068 {
mbed_official 107:414e9c822e99 1069 p_pio->PIO_PCMR &= (~PIO_PCMR_PCEN);
mbed_official 107:414e9c822e99 1070 pio_capture_enable_flag = false;
mbed_official 107:414e9c822e99 1071 }
mbed_official 107:414e9c822e99 1072
mbed_official 107:414e9c822e99 1073 /**
mbed_official 107:414e9c822e99 1074 * \brief Read from Capture Reception Holding Register.
mbed_official 107:414e9c822e99 1075 * \note Data presence should be tested before any read attempt.
mbed_official 107:414e9c822e99 1076 *
mbed_official 107:414e9c822e99 1077 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1078 * \param pul_data Pointer to store the data.
mbed_official 107:414e9c822e99 1079 *
mbed_official 107:414e9c822e99 1080 * \retval 0 Success.
mbed_official 107:414e9c822e99 1081 * \retval 1 I/O Failure, Capture data is not ready.
mbed_official 107:414e9c822e99 1082 */
mbed_official 107:414e9c822e99 1083 uint32_t pio_capture_read(const Pio *p_pio, uint32_t *pul_data)
mbed_official 107:414e9c822e99 1084 {
mbed_official 107:414e9c822e99 1085 /* Check if the data is ready */
mbed_official 107:414e9c822e99 1086 if ((p_pio->PIO_PCISR & PIO_PCISR_DRDY) == 0) {
mbed_official 107:414e9c822e99 1087 return 1;
mbed_official 107:414e9c822e99 1088 }
mbed_official 107:414e9c822e99 1089
mbed_official 107:414e9c822e99 1090 /* Read data */
mbed_official 107:414e9c822e99 1091 *pul_data = p_pio->PIO_PCRHR;
mbed_official 107:414e9c822e99 1092 return 0;
mbed_official 107:414e9c822e99 1093 }
mbed_official 107:414e9c822e99 1094
mbed_official 107:414e9c822e99 1095 /**
mbed_official 107:414e9c822e99 1096 * \brief Enable the given interrupt source of PIO capture. The status
mbed_official 107:414e9c822e99 1097 * register of the corresponding PIO capture controller is cleared prior
mbed_official 107:414e9c822e99 1098 * to enabling the interrupt.
mbed_official 107:414e9c822e99 1099 *
mbed_official 107:414e9c822e99 1100 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1101 * \param ul_mask Interrupt sources bit map.
mbed_official 107:414e9c822e99 1102 */
mbed_official 107:414e9c822e99 1103 void pio_capture_enable_interrupt(Pio *p_pio, const uint32_t ul_mask)
mbed_official 107:414e9c822e99 1104 {
mbed_official 107:414e9c822e99 1105 p_pio->PIO_PCISR;
mbed_official 107:414e9c822e99 1106 p_pio->PIO_PCIER = ul_mask;
mbed_official 107:414e9c822e99 1107 }
mbed_official 107:414e9c822e99 1108
mbed_official 107:414e9c822e99 1109 /**
mbed_official 107:414e9c822e99 1110 * \brief Disable a given interrupt source of PIO capture.
mbed_official 107:414e9c822e99 1111 *
mbed_official 107:414e9c822e99 1112 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1113 * \param ul_mask Interrupt sources bit map.
mbed_official 107:414e9c822e99 1114 */
mbed_official 107:414e9c822e99 1115 void pio_capture_disable_interrupt(Pio *p_pio, const uint32_t ul_mask)
mbed_official 107:414e9c822e99 1116 {
mbed_official 107:414e9c822e99 1117 p_pio->PIO_PCIDR = ul_mask;
mbed_official 107:414e9c822e99 1118 }
mbed_official 107:414e9c822e99 1119
mbed_official 107:414e9c822e99 1120 /**
mbed_official 107:414e9c822e99 1121 * \brief Read PIO interrupt status of PIO capture.
mbed_official 107:414e9c822e99 1122 *
mbed_official 107:414e9c822e99 1123 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1124 *
mbed_official 107:414e9c822e99 1125 * \return The interrupt status mask value.
mbed_official 107:414e9c822e99 1126 */
mbed_official 107:414e9c822e99 1127 uint32_t pio_capture_get_interrupt_status(const Pio *p_pio)
mbed_official 107:414e9c822e99 1128 {
mbed_official 107:414e9c822e99 1129 return p_pio->PIO_PCISR;
mbed_official 107:414e9c822e99 1130 }
mbed_official 107:414e9c822e99 1131
mbed_official 107:414e9c822e99 1132 /**
mbed_official 107:414e9c822e99 1133 * \brief Read PIO interrupt mask of PIO capture.
mbed_official 107:414e9c822e99 1134 *
mbed_official 107:414e9c822e99 1135 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1136 *
mbed_official 107:414e9c822e99 1137 * \return The interrupt mask value.
mbed_official 107:414e9c822e99 1138 */
mbed_official 107:414e9c822e99 1139 uint32_t pio_capture_get_interrupt_mask(const Pio *p_pio)
mbed_official 107:414e9c822e99 1140 {
mbed_official 107:414e9c822e99 1141 return p_pio->PIO_PCIMR;
mbed_official 107:414e9c822e99 1142 }
mbed_official 107:414e9c822e99 1143 #if !(SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 1144 /**
mbed_official 107:414e9c822e99 1145 * \brief Get PDC registers base address.
mbed_official 107:414e9c822e99 1146 *
mbed_official 107:414e9c822e99 1147 * \param p_pio Pointer to an PIO peripheral.
mbed_official 107:414e9c822e99 1148 *
mbed_official 107:414e9c822e99 1149 * \return PIOA PDC register base address.
mbed_official 107:414e9c822e99 1150 */
mbed_official 107:414e9c822e99 1151 Pdc *pio_capture_get_pdc_base(const Pio *p_pio)
mbed_official 107:414e9c822e99 1152 {
mbed_official 107:414e9c822e99 1153 UNUSED(p_pio); /* Stop warning */
mbed_official 107:414e9c822e99 1154 return PDC_PIOA;
mbed_official 107:414e9c822e99 1155 }
mbed_official 107:414e9c822e99 1156 #endif
mbed_official 107:414e9c822e99 1157 #endif
mbed_official 107:414e9c822e99 1158
mbed_official 107:414e9c822e99 1159 #if (SAM4C || SAM4CP || SAM4CM || SAMG55)
mbed_official 107:414e9c822e99 1160 /**
mbed_official 107:414e9c822e99 1161 * \brief Set PIO IO drive.
mbed_official 107:414e9c822e99 1162 *
mbed_official 107:414e9c822e99 1163 * \param p_pio Pointer to an PIO peripheral.
mbed_official 107:414e9c822e99 1164 * \param ul_line Line index (0..31).
mbed_official 107:414e9c822e99 1165 * \param mode IO drive mode.
mbed_official 107:414e9c822e99 1166 */
mbed_official 107:414e9c822e99 1167 void pio_set_io_drive(Pio *p_pio, uint32_t ul_line,
mbed_official 107:414e9c822e99 1168 enum pio_io_drive_mode mode)
mbed_official 107:414e9c822e99 1169 {
mbed_official 107:414e9c822e99 1170 p_pio->PIO_DRIVER &= ~(1 << ul_line);
mbed_official 107:414e9c822e99 1171 p_pio->PIO_DRIVER |= mode << ul_line;
mbed_official 107:414e9c822e99 1172 }
mbed_official 107:414e9c822e99 1173 #endif
mbed_official 107:414e9c822e99 1174
mbed_official 107:414e9c822e99 1175 #if (SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 1176 /**
mbed_official 107:414e9c822e99 1177 * \brief Enable PIO keypad controller.
mbed_official 107:414e9c822e99 1178 *
mbed_official 107:414e9c822e99 1179 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1180 */
mbed_official 107:414e9c822e99 1181 void pio_keypad_enable(Pio *p_pio)
mbed_official 107:414e9c822e99 1182 {
mbed_official 107:414e9c822e99 1183 p_pio->PIO_KER |= PIO_KER_KCE;
mbed_official 107:414e9c822e99 1184 }
mbed_official 107:414e9c822e99 1185
mbed_official 107:414e9c822e99 1186 /**
mbed_official 107:414e9c822e99 1187 * \brief Disable PIO keypad controller.
mbed_official 107:414e9c822e99 1188 *
mbed_official 107:414e9c822e99 1189 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1190 */
mbed_official 107:414e9c822e99 1191 void pio_keypad_disable(Pio *p_pio)
mbed_official 107:414e9c822e99 1192 {
mbed_official 107:414e9c822e99 1193 p_pio->PIO_KER &= (~PIO_KER_KCE);
mbed_official 107:414e9c822e99 1194 }
mbed_official 107:414e9c822e99 1195
mbed_official 107:414e9c822e99 1196 /**
mbed_official 107:414e9c822e99 1197 * \brief Set PIO keypad controller row number.
mbed_official 107:414e9c822e99 1198 *
mbed_official 107:414e9c822e99 1199 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1200 * \param num Number of row of the keypad matrix.
mbed_official 107:414e9c822e99 1201 */
mbed_official 107:414e9c822e99 1202 void pio_keypad_set_row_num(Pio *p_pio, uint8_t num)
mbed_official 107:414e9c822e99 1203 {
mbed_official 107:414e9c822e99 1204 p_pio->PIO_KRCR &= (~PIO_KRCR_NBR_Msk);
mbed_official 107:414e9c822e99 1205 p_pio->PIO_KRCR |= PIO_KRCR_NBR(num);
mbed_official 107:414e9c822e99 1206 }
mbed_official 107:414e9c822e99 1207
mbed_official 107:414e9c822e99 1208 /**
mbed_official 107:414e9c822e99 1209 * \brief Get PIO keypad controller row number.
mbed_official 107:414e9c822e99 1210 *
mbed_official 107:414e9c822e99 1211 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1212 *
mbed_official 107:414e9c822e99 1213 * \return Number of row of the keypad matrix.
mbed_official 107:414e9c822e99 1214 */
mbed_official 107:414e9c822e99 1215 uint8_t pio_keypad_get_row_num(const Pio *p_pio)
mbed_official 107:414e9c822e99 1216 {
mbed_official 107:414e9c822e99 1217 return ((p_pio->PIO_KRCR & PIO_KRCR_NBR_Msk) >> PIO_KRCR_NBR_Pos);
mbed_official 107:414e9c822e99 1218 }
mbed_official 107:414e9c822e99 1219
mbed_official 107:414e9c822e99 1220 /**
mbed_official 107:414e9c822e99 1221 * \brief Set PIO keypad controller column number.
mbed_official 107:414e9c822e99 1222 *
mbed_official 107:414e9c822e99 1223 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1224 * \param num Number of column of the keypad matrix.
mbed_official 107:414e9c822e99 1225 */
mbed_official 107:414e9c822e99 1226 void pio_keypad_set_column_num(Pio *p_pio, uint8_t num)
mbed_official 107:414e9c822e99 1227 {
mbed_official 107:414e9c822e99 1228 p_pio->PIO_KRCR &= (~PIO_KRCR_NBC_Msk);
mbed_official 107:414e9c822e99 1229 p_pio->PIO_KRCR |= PIO_KRCR_NBC(num);
mbed_official 107:414e9c822e99 1230 }
mbed_official 107:414e9c822e99 1231
mbed_official 107:414e9c822e99 1232 /**
mbed_official 107:414e9c822e99 1233 * \brief Get PIO keypad controller column number.
mbed_official 107:414e9c822e99 1234 *
mbed_official 107:414e9c822e99 1235 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1236 *
mbed_official 107:414e9c822e99 1237 * \return Number of column of the keypad matrix.
mbed_official 107:414e9c822e99 1238 */
mbed_official 107:414e9c822e99 1239 uint8_t pio_keypad_get_column_num(const Pio *p_pio)
mbed_official 107:414e9c822e99 1240 {
mbed_official 107:414e9c822e99 1241 return ((p_pio->PIO_KRCR & PIO_KRCR_NBC_Msk) >> PIO_KRCR_NBC_Pos);
mbed_official 107:414e9c822e99 1242 }
mbed_official 107:414e9c822e99 1243
mbed_official 107:414e9c822e99 1244 /**
mbed_official 107:414e9c822e99 1245 * \brief Set PIO keypad matrix debouncing value.
mbed_official 107:414e9c822e99 1246 *
mbed_official 107:414e9c822e99 1247 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1248 * \param num Number of debouncing value.
mbed_official 107:414e9c822e99 1249 */
mbed_official 107:414e9c822e99 1250 void pio_keypad_set_debouncing_value(Pio *p_pio, uint16_t value)
mbed_official 107:414e9c822e99 1251 {
mbed_official 107:414e9c822e99 1252 p_pio->PIO_KDR = PIO_KDR_DBC(value);
mbed_official 107:414e9c822e99 1253 }
mbed_official 107:414e9c822e99 1254
mbed_official 107:414e9c822e99 1255 /**
mbed_official 107:414e9c822e99 1256 * \brief Get PIO keypad matrix debouncing value.
mbed_official 107:414e9c822e99 1257 *
mbed_official 107:414e9c822e99 1258 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1259 *
mbed_official 107:414e9c822e99 1260 * \return The keypad debouncing value.
mbed_official 107:414e9c822e99 1261 */
mbed_official 107:414e9c822e99 1262 uint16_t pio_keypad_get_debouncing_value(const Pio *p_pio)
mbed_official 107:414e9c822e99 1263 {
mbed_official 107:414e9c822e99 1264 return ((p_pio->PIO_KDR & PIO_KDR_DBC_Msk) >> PIO_KDR_DBC_Pos);
mbed_official 107:414e9c822e99 1265 }
mbed_official 107:414e9c822e99 1266
mbed_official 107:414e9c822e99 1267 /**
mbed_official 107:414e9c822e99 1268 * \brief Enable the interrupt source of PIO keypad.
mbed_official 107:414e9c822e99 1269 *
mbed_official 107:414e9c822e99 1270 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1271 * \param ul_mask Interrupt sources bit map.
mbed_official 107:414e9c822e99 1272 */
mbed_official 107:414e9c822e99 1273 void pio_keypad_enable_interrupt(Pio *p_pio, uint32_t ul_mask)
mbed_official 107:414e9c822e99 1274 {
mbed_official 107:414e9c822e99 1275 p_pio->PIO_KIER = ul_mask;
mbed_official 107:414e9c822e99 1276 }
mbed_official 107:414e9c822e99 1277
mbed_official 107:414e9c822e99 1278 /**
mbed_official 107:414e9c822e99 1279 * \brief Disable the interrupt source of PIO keypad.
mbed_official 107:414e9c822e99 1280 *
mbed_official 107:414e9c822e99 1281 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1282 * \param ul_mask Interrupt sources bit map.
mbed_official 107:414e9c822e99 1283 */
mbed_official 107:414e9c822e99 1284 void pio_keypad_disable_interrupt(Pio *p_pio, uint32_t ul_mask)
mbed_official 107:414e9c822e99 1285 {
mbed_official 107:414e9c822e99 1286 p_pio->PIO_KIDR = ul_mask;
mbed_official 107:414e9c822e99 1287 }
mbed_official 107:414e9c822e99 1288
mbed_official 107:414e9c822e99 1289 /**
mbed_official 107:414e9c822e99 1290 * \brief Get interrupt mask of PIO keypad.
mbed_official 107:414e9c822e99 1291 *
mbed_official 107:414e9c822e99 1292 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1293 *
mbed_official 107:414e9c822e99 1294 * \return The interrupt mask value.
mbed_official 107:414e9c822e99 1295 */
mbed_official 107:414e9c822e99 1296 uint32_t pio_keypad_get_interrupt_mask(const Pio *p_pio)
mbed_official 107:414e9c822e99 1297 {
mbed_official 107:414e9c822e99 1298 return p_pio->PIO_KIMR;
mbed_official 107:414e9c822e99 1299 }
mbed_official 107:414e9c822e99 1300
mbed_official 107:414e9c822e99 1301 /**
mbed_official 107:414e9c822e99 1302 * \brief Get key press status of PIO keypad.
mbed_official 107:414e9c822e99 1303 *
mbed_official 107:414e9c822e99 1304 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1305 *
mbed_official 107:414e9c822e99 1306 * \return The status of key press.
mbed_official 107:414e9c822e99 1307 * 0: No key press has been detected.
mbed_official 107:414e9c822e99 1308 * 1: At least one key press has been detected.
mbed_official 107:414e9c822e99 1309 */
mbed_official 107:414e9c822e99 1310 uint32_t pio_keypad_get_press_status(const Pio *p_pio)
mbed_official 107:414e9c822e99 1311 {
mbed_official 107:414e9c822e99 1312 if (p_pio->PIO_KSR & PIO_KSR_KPR) {
mbed_official 107:414e9c822e99 1313 return 1;
mbed_official 107:414e9c822e99 1314 } else {
mbed_official 107:414e9c822e99 1315 return 0;
mbed_official 107:414e9c822e99 1316 }
mbed_official 107:414e9c822e99 1317 }
mbed_official 107:414e9c822e99 1318
mbed_official 107:414e9c822e99 1319 /**
mbed_official 107:414e9c822e99 1320 * \brief Get key release status of PIO keypad.
mbed_official 107:414e9c822e99 1321 *
mbed_official 107:414e9c822e99 1322 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1323 *
mbed_official 107:414e9c822e99 1324 * \return The status of key release.
mbed_official 107:414e9c822e99 1325 * 0 No key release has been detected.
mbed_official 107:414e9c822e99 1326 * 1 At least one key release has been detected.
mbed_official 107:414e9c822e99 1327 */
mbed_official 107:414e9c822e99 1328 uint32_t pio_keypad_get_release_status(const Pio *p_pio)
mbed_official 107:414e9c822e99 1329 {
mbed_official 107:414e9c822e99 1330 if (p_pio->PIO_KSR & PIO_KSR_KRL) {
mbed_official 107:414e9c822e99 1331 return 1;
mbed_official 107:414e9c822e99 1332 } else {
mbed_official 107:414e9c822e99 1333 return 0;
mbed_official 107:414e9c822e99 1334 }
mbed_official 107:414e9c822e99 1335 }
mbed_official 107:414e9c822e99 1336
mbed_official 107:414e9c822e99 1337 /**
mbed_official 107:414e9c822e99 1338 * \brief Get simultaneous key press number of PIO keypad.
mbed_official 107:414e9c822e99 1339 *
mbed_official 107:414e9c822e99 1340 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1341 *
mbed_official 107:414e9c822e99 1342 * \return The number of simultaneous key press.
mbed_official 107:414e9c822e99 1343 */
mbed_official 107:414e9c822e99 1344 uint8_t pio_keypad_get_simult_press_num(const Pio *p_pio)
mbed_official 107:414e9c822e99 1345 {
mbed_official 107:414e9c822e99 1346 return ((p_pio->PIO_KSR & PIO_KSR_NBKPR_Msk) >> PIO_KSR_NBKPR_Pos);
mbed_official 107:414e9c822e99 1347 }
mbed_official 107:414e9c822e99 1348
mbed_official 107:414e9c822e99 1349 /**
mbed_official 107:414e9c822e99 1350 * \brief Get simultaneous key release number of PIO keypad.
mbed_official 107:414e9c822e99 1351 *
mbed_official 107:414e9c822e99 1352 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1353 *
mbed_official 107:414e9c822e99 1354 * \return The number of simultaneous key release.
mbed_official 107:414e9c822e99 1355 */
mbed_official 107:414e9c822e99 1356 uint8_t pio_keypad_get_simult_release_num(const Pio *p_pio)
mbed_official 107:414e9c822e99 1357 {
mbed_official 107:414e9c822e99 1358 return ((p_pio->PIO_KSR & PIO_KSR_NBKRL_Msk) >> PIO_KSR_NBKRL_Pos);
mbed_official 107:414e9c822e99 1359 }
mbed_official 107:414e9c822e99 1360
mbed_official 107:414e9c822e99 1361 /**
mbed_official 107:414e9c822e99 1362 * \brief Get detected key press row index of PIO keypad.
mbed_official 107:414e9c822e99 1363 *
mbed_official 107:414e9c822e99 1364 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1365 * \param queue The queue of key press row
mbed_official 107:414e9c822e99 1366 *
mbed_official 107:414e9c822e99 1367 * \return The index of detected key press row.
mbed_official 107:414e9c822e99 1368 */
mbed_official 107:414e9c822e99 1369 uint8_t pio_keypad_get_press_row_index(const Pio *p_pio, uint8_t queue)
mbed_official 107:414e9c822e99 1370 {
mbed_official 107:414e9c822e99 1371 switch (queue) {
mbed_official 107:414e9c822e99 1372 case 0:
mbed_official 107:414e9c822e99 1373 return ((p_pio->PIO_KKPR & PIO_KKPR_KEY0ROW_Msk) >> PIO_KKPR_KEY0ROW_Pos);
mbed_official 107:414e9c822e99 1374 case 1:
mbed_official 107:414e9c822e99 1375 return ((p_pio->PIO_KKPR & PIO_KKPR_KEY1ROW_Msk) >> PIO_KKPR_KEY1ROW_Pos);
mbed_official 107:414e9c822e99 1376 case 2:
mbed_official 107:414e9c822e99 1377 return ((p_pio->PIO_KKPR & PIO_KKPR_KEY2ROW_Msk) >> PIO_KKPR_KEY2ROW_Pos);
mbed_official 107:414e9c822e99 1378 case 3:
mbed_official 107:414e9c822e99 1379 return ((p_pio->PIO_KKPR & PIO_KKPR_KEY3ROW_Msk) >> PIO_KKPR_KEY3ROW_Pos);
mbed_official 107:414e9c822e99 1380 default:
mbed_official 107:414e9c822e99 1381 return 0;
mbed_official 107:414e9c822e99 1382 }
mbed_official 107:414e9c822e99 1383 }
mbed_official 107:414e9c822e99 1384
mbed_official 107:414e9c822e99 1385 /**
mbed_official 107:414e9c822e99 1386 * \brief Get detected key press column index of PIO keypad.
mbed_official 107:414e9c822e99 1387 *
mbed_official 107:414e9c822e99 1388 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1389 * \param queue The queue of key press column
mbed_official 107:414e9c822e99 1390 *
mbed_official 107:414e9c822e99 1391 * \return The index of detected key press column.
mbed_official 107:414e9c822e99 1392 */
mbed_official 107:414e9c822e99 1393 uint8_t pio_keypad_get_press_column_index(const Pio *p_pio, uint8_t queue)
mbed_official 107:414e9c822e99 1394 {
mbed_official 107:414e9c822e99 1395 switch (queue) {
mbed_official 107:414e9c822e99 1396 case 0:
mbed_official 107:414e9c822e99 1397 return ((p_pio->PIO_KKPR & PIO_KKPR_KEY0COL_Msk) >> PIO_KKPR_KEY0COL_Pos);
mbed_official 107:414e9c822e99 1398 case 1:
mbed_official 107:414e9c822e99 1399 return ((p_pio->PIO_KKPR & PIO_KKPR_KEY1COL_Msk) >> PIO_KKPR_KEY1COL_Pos);
mbed_official 107:414e9c822e99 1400 case 2:
mbed_official 107:414e9c822e99 1401 return ((p_pio->PIO_KKPR & PIO_KKPR_KEY2COL_Msk) >> PIO_KKPR_KEY2COL_Pos);
mbed_official 107:414e9c822e99 1402 case 3:
mbed_official 107:414e9c822e99 1403 return ((p_pio->PIO_KKPR & PIO_KKPR_KEY3COL_Msk) >> PIO_KKPR_KEY3COL_Pos);
mbed_official 107:414e9c822e99 1404 default:
mbed_official 107:414e9c822e99 1405 return 0;
mbed_official 107:414e9c822e99 1406 }
mbed_official 107:414e9c822e99 1407 }
mbed_official 107:414e9c822e99 1408
mbed_official 107:414e9c822e99 1409 /**
mbed_official 107:414e9c822e99 1410 * \brief Get detected key release row index of PIO keypad.
mbed_official 107:414e9c822e99 1411 *
mbed_official 107:414e9c822e99 1412 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1413 * \param queue The queue of key release row
mbed_official 107:414e9c822e99 1414 *
mbed_official 107:414e9c822e99 1415 * \return The index of detected key release row.
mbed_official 107:414e9c822e99 1416 */
mbed_official 107:414e9c822e99 1417 uint8_t pio_keypad_get_release_row_index(const Pio *p_pio, uint8_t queue)
mbed_official 107:414e9c822e99 1418 {
mbed_official 107:414e9c822e99 1419 switch (queue) {
mbed_official 107:414e9c822e99 1420 case 0:
mbed_official 107:414e9c822e99 1421 return ((p_pio->PIO_KKRR & PIO_KKRR_KEY0ROW_Msk) >> PIO_KKRR_KEY0ROW_Pos);
mbed_official 107:414e9c822e99 1422 case 1:
mbed_official 107:414e9c822e99 1423 return ((p_pio->PIO_KKRR & PIO_KKRR_KEY1ROW_Msk) >> PIO_KKRR_KEY1ROW_Pos);
mbed_official 107:414e9c822e99 1424 case 2:
mbed_official 107:414e9c822e99 1425 return ((p_pio->PIO_KKRR & PIO_KKRR_KEY2ROW_Msk) >> PIO_KKRR_KEY2ROW_Pos);
mbed_official 107:414e9c822e99 1426 case 3:
mbed_official 107:414e9c822e99 1427 return ((p_pio->PIO_KKRR & PIO_KKRR_KEY3ROW_Msk) >> PIO_KKRR_KEY3ROW_Pos);
mbed_official 107:414e9c822e99 1428 default:
mbed_official 107:414e9c822e99 1429 return 0;
mbed_official 107:414e9c822e99 1430 }
mbed_official 107:414e9c822e99 1431 }
mbed_official 107:414e9c822e99 1432
mbed_official 107:414e9c822e99 1433 /**
mbed_official 107:414e9c822e99 1434 * \brief Get detected key release column index of PIO keypad.
mbed_official 107:414e9c822e99 1435 *
mbed_official 107:414e9c822e99 1436 * \param p_pio Pointer to a PIO instance.
mbed_official 107:414e9c822e99 1437 * \param queue The queue of key release column
mbed_official 107:414e9c822e99 1438 *
mbed_official 107:414e9c822e99 1439 * \return The index of detected key release column.
mbed_official 107:414e9c822e99 1440 */
mbed_official 107:414e9c822e99 1441 uint8_t pio_keypad_get_release_column_index(const Pio *p_pio, uint8_t queue)
mbed_official 107:414e9c822e99 1442 {
mbed_official 107:414e9c822e99 1443 switch (queue) {
mbed_official 107:414e9c822e99 1444 case 0:
mbed_official 107:414e9c822e99 1445 return ((p_pio->PIO_KKRR & PIO_KKRR_KEY0COL_Msk) >> PIO_KKRR_KEY0COL_Pos);
mbed_official 107:414e9c822e99 1446 case 1:
mbed_official 107:414e9c822e99 1447 return ((p_pio->PIO_KKRR & PIO_KKRR_KEY1COL_Msk) >> PIO_KKRR_KEY1COL_Pos);
mbed_official 107:414e9c822e99 1448 case 2:
mbed_official 107:414e9c822e99 1449 return ((p_pio->PIO_KKRR & PIO_KKRR_KEY2COL_Msk) >> PIO_KKRR_KEY2COL_Pos);
mbed_official 107:414e9c822e99 1450 case 3:
mbed_official 107:414e9c822e99 1451 return ((p_pio->PIO_KKRR & PIO_KKRR_KEY3COL_Msk) >> PIO_KKRR_KEY3COL_Pos);
mbed_official 107:414e9c822e99 1452 default:
mbed_official 107:414e9c822e99 1453 return 0;
mbed_official 107:414e9c822e99 1454 }
mbed_official 107:414e9c822e99 1455 }
mbed_official 107:414e9c822e99 1456
mbed_official 107:414e9c822e99 1457 #endif
mbed_official 107:414e9c822e99 1458
mbed_official 107:414e9c822e99 1459 //@}
mbed_official 107:414e9c822e99 1460