Nordic stack and drivers for the mbed BLE API

Fork of nRF51822 by Nordic Semiconductor

Committer:
Vincent Coubard
Date:
Wed Sep 14 14:39:43 2016 +0100
Revision:
640:c90ae1400bf2
Sync with bdab10dc0f90748b6989c8b577771bb403ca6bd8 from ARMmbed/mbed-os.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vincent Coubard 640:c90ae1400bf2 1 /*
Vincent Coubard 640:c90ae1400bf2 2 * Copyright (c) Nordic Semiconductor ASA
Vincent Coubard 640:c90ae1400bf2 3 * All rights reserved.
Vincent Coubard 640:c90ae1400bf2 4 *
Vincent Coubard 640:c90ae1400bf2 5 * Redistribution and use in source and binary forms, with or without modification,
Vincent Coubard 640:c90ae1400bf2 6 * are permitted provided that the following conditions are met:
Vincent Coubard 640:c90ae1400bf2 7 *
Vincent Coubard 640:c90ae1400bf2 8 * 1. Redistributions of source code must retain the above copyright notice, this
Vincent Coubard 640:c90ae1400bf2 9 * list of conditions and the following disclaimer.
Vincent Coubard 640:c90ae1400bf2 10 *
Vincent Coubard 640:c90ae1400bf2 11 * 2. Redistributions in binary form must reproduce the above copyright notice, this
Vincent Coubard 640:c90ae1400bf2 12 * list of conditions and the following disclaimer in the documentation and/or
Vincent Coubard 640:c90ae1400bf2 13 * other materials provided with the distribution.
Vincent Coubard 640:c90ae1400bf2 14 *
Vincent Coubard 640:c90ae1400bf2 15 * 3. Neither the name of Nordic Semiconductor ASA nor the names of other
Vincent Coubard 640:c90ae1400bf2 16 * contributors to this software may be used to endorse or promote products
Vincent Coubard 640:c90ae1400bf2 17 * derived from this software without specific prior written permission.
Vincent Coubard 640:c90ae1400bf2 18 *
Vincent Coubard 640:c90ae1400bf2 19 *
Vincent Coubard 640:c90ae1400bf2 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
Vincent Coubard 640:c90ae1400bf2 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Vincent Coubard 640:c90ae1400bf2 22 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Vincent Coubard 640:c90ae1400bf2 23 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
Vincent Coubard 640:c90ae1400bf2 24 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
Vincent Coubard 640:c90ae1400bf2 25 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
Vincent Coubard 640:c90ae1400bf2 26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
Vincent Coubard 640:c90ae1400bf2 27 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Vincent Coubard 640:c90ae1400bf2 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Vincent Coubard 640:c90ae1400bf2 29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Vincent Coubard 640:c90ae1400bf2 30 *
Vincent Coubard 640:c90ae1400bf2 31 */
Vincent Coubard 640:c90ae1400bf2 32 #ifndef NRF_GPIO_H__
Vincent Coubard 640:c90ae1400bf2 33 #define NRF_GPIO_H__
Vincent Coubard 640:c90ae1400bf2 34
Vincent Coubard 640:c90ae1400bf2 35 #include "nrf.h"
Vincent Coubard 640:c90ae1400bf2 36 #include <stdbool.h>
Vincent Coubard 640:c90ae1400bf2 37
Vincent Coubard 640:c90ae1400bf2 38 /**
Vincent Coubard 640:c90ae1400bf2 39 * @defgroup nrf_gpio GPIO abstraction
Vincent Coubard 640:c90ae1400bf2 40 * @{
Vincent Coubard 640:c90ae1400bf2 41 * @ingroup nrf_drivers
Vincent Coubard 640:c90ae1400bf2 42 * @brief GPIO pin abstraction and port abstraction for reading and writing byte-wise to GPIO ports.
Vincent Coubard 640:c90ae1400bf2 43 *
Vincent Coubard 640:c90ae1400bf2 44 * Here, the GPIO ports are defined as follows:
Vincent Coubard 640:c90ae1400bf2 45 * - Port 0 -> pin 0-7
Vincent Coubard 640:c90ae1400bf2 46 * - Port 1 -> pin 8-15
Vincent Coubard 640:c90ae1400bf2 47 * - Port 2 -> pin 16-23
Vincent Coubard 640:c90ae1400bf2 48 * - Port 3 -> pin 24-31
Vincent Coubard 640:c90ae1400bf2 49 */
Vincent Coubard 640:c90ae1400bf2 50
Vincent Coubard 640:c90ae1400bf2 51 #define NUMBER_OF_PINS 32
Vincent Coubard 640:c90ae1400bf2 52
Vincent Coubard 640:c90ae1400bf2 53 /**
Vincent Coubard 640:c90ae1400bf2 54 * @brief Enumerator used for selecting between port 0 - 3.
Vincent Coubard 640:c90ae1400bf2 55 */
Vincent Coubard 640:c90ae1400bf2 56 typedef enum
Vincent Coubard 640:c90ae1400bf2 57 {
Vincent Coubard 640:c90ae1400bf2 58 NRF_GPIO_PORT_SELECT_PORT0 = 0, ///< Port 0 (GPIO pin 0-7)
Vincent Coubard 640:c90ae1400bf2 59 NRF_GPIO_PORT_SELECT_PORT1, ///< Port 1 (GPIO pin 8-15)
Vincent Coubard 640:c90ae1400bf2 60 NRF_GPIO_PORT_SELECT_PORT2, ///< Port 2 (GPIO pin 16-23)
Vincent Coubard 640:c90ae1400bf2 61 NRF_GPIO_PORT_SELECT_PORT3, ///< Port 3 (GPIO pin 24-31)
Vincent Coubard 640:c90ae1400bf2 62 } nrf_gpio_port_select_t;
Vincent Coubard 640:c90ae1400bf2 63
Vincent Coubard 640:c90ae1400bf2 64 /**
Vincent Coubard 640:c90ae1400bf2 65 * @brief Enumerator used for setting the direction of a GPIO port.
Vincent Coubard 640:c90ae1400bf2 66 */
Vincent Coubard 640:c90ae1400bf2 67 typedef enum
Vincent Coubard 640:c90ae1400bf2 68 {
Vincent Coubard 640:c90ae1400bf2 69 NRF_GPIO_PORT_DIR_OUTPUT, ///< Output
Vincent Coubard 640:c90ae1400bf2 70 NRF_GPIO_PORT_DIR_INPUT ///< Input
Vincent Coubard 640:c90ae1400bf2 71 } nrf_gpio_port_dir_t;
Vincent Coubard 640:c90ae1400bf2 72
Vincent Coubard 640:c90ae1400bf2 73 /**
Vincent Coubard 640:c90ae1400bf2 74 * @brief Pin direction definitions.
Vincent Coubard 640:c90ae1400bf2 75 */
Vincent Coubard 640:c90ae1400bf2 76 typedef enum
Vincent Coubard 640:c90ae1400bf2 77 {
Vincent Coubard 640:c90ae1400bf2 78 NRF_GPIO_PIN_DIR_INPUT = GPIO_PIN_CNF_DIR_Input, ///< Input
Vincent Coubard 640:c90ae1400bf2 79 NRF_GPIO_PIN_DIR_OUTPUT = GPIO_PIN_CNF_DIR_Output ///< Output
Vincent Coubard 640:c90ae1400bf2 80 } nrf_gpio_pin_dir_t;
Vincent Coubard 640:c90ae1400bf2 81
Vincent Coubard 640:c90ae1400bf2 82 /**
Vincent Coubard 640:c90ae1400bf2 83 * @brief Connection of input buffer
Vincent Coubard 640:c90ae1400bf2 84 */
Vincent Coubard 640:c90ae1400bf2 85 typedef enum
Vincent Coubard 640:c90ae1400bf2 86 {
Vincent Coubard 640:c90ae1400bf2 87 NRF_GPIO_PIN_INPUT_CONNECT = GPIO_PIN_CNF_INPUT_Connect, ///< Connect input buffer
Vincent Coubard 640:c90ae1400bf2 88 NRF_GPIO_PIN_INPUT_DISCONNECT = GPIO_PIN_CNF_INPUT_Disconnect ///< Disconnect input buffer
Vincent Coubard 640:c90ae1400bf2 89 } nrf_gpio_pin_input_t;
Vincent Coubard 640:c90ae1400bf2 90
Vincent Coubard 640:c90ae1400bf2 91 /**
Vincent Coubard 640:c90ae1400bf2 92 * @brief Enumerator used for selecting the pin to be pulled down or up at the time of pin configuration
Vincent Coubard 640:c90ae1400bf2 93 */
Vincent Coubard 640:c90ae1400bf2 94 typedef enum
Vincent Coubard 640:c90ae1400bf2 95 {
Vincent Coubard 640:c90ae1400bf2 96 NRF_GPIO_PIN_NOPULL = GPIO_PIN_CNF_PULL_Disabled, ///< Pin pullup resistor disabled
Vincent Coubard 640:c90ae1400bf2 97 NRF_GPIO_PIN_PULLDOWN = GPIO_PIN_CNF_PULL_Pulldown, ///< Pin pulldown resistor enabled
Vincent Coubard 640:c90ae1400bf2 98 NRF_GPIO_PIN_PULLUP = GPIO_PIN_CNF_PULL_Pullup, ///< Pin pullup resistor enabled
Vincent Coubard 640:c90ae1400bf2 99 } nrf_gpio_pin_pull_t;
Vincent Coubard 640:c90ae1400bf2 100
Vincent Coubard 640:c90ae1400bf2 101 /**
Vincent Coubard 640:c90ae1400bf2 102 * @brief Enumerator used for selecting output drive mode
Vincent Coubard 640:c90ae1400bf2 103 */
Vincent Coubard 640:c90ae1400bf2 104 typedef enum
Vincent Coubard 640:c90ae1400bf2 105 {
Vincent Coubard 640:c90ae1400bf2 106 NRF_GPIO_PIN_S0S1 = GPIO_PIN_CNF_DRIVE_S0S1, ///< !< Standard '0', standard '1'
Vincent Coubard 640:c90ae1400bf2 107 NRF_GPIO_PIN_H0S1 = GPIO_PIN_CNF_DRIVE_H0S1, ///< !< High drive '0', standard '1'
Vincent Coubard 640:c90ae1400bf2 108 NRF_GPIO_PIN_S0H1 = GPIO_PIN_CNF_DRIVE_S0H1, ///< !< Standard '0', high drive '1'
Vincent Coubard 640:c90ae1400bf2 109 NRF_GPIO_PIN_H0H1 = GPIO_PIN_CNF_DRIVE_H0H1, ///< !< High drive '0', high 'drive '1''
Vincent Coubard 640:c90ae1400bf2 110 NRF_GPIO_PIN_D0S1 = GPIO_PIN_CNF_DRIVE_D0S1, ///< !< Disconnect '0' standard '1'
Vincent Coubard 640:c90ae1400bf2 111 NRF_GPIO_PIN_D0H1 = GPIO_PIN_CNF_DRIVE_D0H1, ///< !< Disconnect '0', high drive '1'
Vincent Coubard 640:c90ae1400bf2 112 NRF_GPIO_PIN_S0D1 = GPIO_PIN_CNF_DRIVE_S0D1, ///< !< Standard '0'. disconnect '1'
Vincent Coubard 640:c90ae1400bf2 113 NRF_GPIO_PIN_H0D1 = GPIO_PIN_CNF_DRIVE_H0D1, ///< !< High drive '0', disconnect '1'
Vincent Coubard 640:c90ae1400bf2 114 } nrf_gpio_pin_drive_t;
Vincent Coubard 640:c90ae1400bf2 115
Vincent Coubard 640:c90ae1400bf2 116 /**
Vincent Coubard 640:c90ae1400bf2 117 * @brief Enumerator used for selecting the pin to sense high or low level on the pin input.
Vincent Coubard 640:c90ae1400bf2 118 */
Vincent Coubard 640:c90ae1400bf2 119 typedef enum
Vincent Coubard 640:c90ae1400bf2 120 {
Vincent Coubard 640:c90ae1400bf2 121 NRF_GPIO_PIN_NOSENSE = GPIO_PIN_CNF_SENSE_Disabled, ///< Pin sense level disabled.
Vincent Coubard 640:c90ae1400bf2 122 NRF_GPIO_PIN_SENSE_LOW = GPIO_PIN_CNF_SENSE_Low, ///< Pin sense low level.
Vincent Coubard 640:c90ae1400bf2 123 NRF_GPIO_PIN_SENSE_HIGH = GPIO_PIN_CNF_SENSE_High, ///< Pin sense high level.
Vincent Coubard 640:c90ae1400bf2 124 } nrf_gpio_pin_sense_t;
Vincent Coubard 640:c90ae1400bf2 125
Vincent Coubard 640:c90ae1400bf2 126
Vincent Coubard 640:c90ae1400bf2 127 /**
Vincent Coubard 640:c90ae1400bf2 128 * @brief Function for configuring the GPIO pin range as outputs with normal drive strength.
Vincent Coubard 640:c90ae1400bf2 129 * This function can be used to configure pin range as simple output with gate driving GPIO_PIN_CNF_DRIVE_S0S1 (normal cases).
Vincent Coubard 640:c90ae1400bf2 130 *
Vincent Coubard 640:c90ae1400bf2 131 * @param pin_range_start specifies the start number (inclusive) in the range of pin numbers to be configured (allowed values 0-30)
Vincent Coubard 640:c90ae1400bf2 132 *
Vincent Coubard 640:c90ae1400bf2 133 * @param pin_range_end specifies the end number (inclusive) in the range of pin numbers to be configured (allowed values 0-30)
Vincent Coubard 640:c90ae1400bf2 134 *
Vincent Coubard 640:c90ae1400bf2 135 * @note For configuring only one pin as output use @ref nrf_gpio_cfg_output
Vincent Coubard 640:c90ae1400bf2 136 * Sense capability on the pin is disabled, and input is disconnected from the buffer as the pins are configured as output.
Vincent Coubard 640:c90ae1400bf2 137 */
Vincent Coubard 640:c90ae1400bf2 138 __STATIC_INLINE void nrf_gpio_range_cfg_output(uint32_t pin_range_start, uint32_t pin_range_end);
Vincent Coubard 640:c90ae1400bf2 139
Vincent Coubard 640:c90ae1400bf2 140 /**
Vincent Coubard 640:c90ae1400bf2 141 * @brief Function for configuring the GPIO pin range as inputs with given initial value set, hiding inner details.
Vincent Coubard 640:c90ae1400bf2 142 * This function can be used to configure pin range as simple input.
Vincent Coubard 640:c90ae1400bf2 143 *
Vincent Coubard 640:c90ae1400bf2 144 * @param pin_range_start specifies the start number (inclusive) in the range of pin numbers to be configured (allowed values 0-30)
Vincent Coubard 640:c90ae1400bf2 145 *
Vincent Coubard 640:c90ae1400bf2 146 * @param pin_range_end specifies the end number (inclusive) in the range of pin numbers to be configured (allowed values 0-30)
Vincent Coubard 640:c90ae1400bf2 147 *
Vincent Coubard 640:c90ae1400bf2 148 * @param pull_config State of the pin range pull resistor (no pull, pulled down or pulled high)
Vincent Coubard 640:c90ae1400bf2 149 *
Vincent Coubard 640:c90ae1400bf2 150 * @note For configuring only one pin as input use @ref nrf_gpio_cfg_input
Vincent Coubard 640:c90ae1400bf2 151 * Sense capability on the pin is disabled, and input is connected to buffer so that the GPIO->IN register is readable
Vincent Coubard 640:c90ae1400bf2 152 */
Vincent Coubard 640:c90ae1400bf2 153 __STATIC_INLINE void nrf_gpio_range_cfg_input(uint32_t pin_range_start, uint32_t pin_range_end, nrf_gpio_pin_pull_t pull_config);
Vincent Coubard 640:c90ae1400bf2 154
Vincent Coubard 640:c90ae1400bf2 155 /**
Vincent Coubard 640:c90ae1400bf2 156 * @brief Pin configuration function
Vincent Coubard 640:c90ae1400bf2 157 *
Vincent Coubard 640:c90ae1400bf2 158 * The main pin configuration function.
Vincent Coubard 640:c90ae1400bf2 159 * This function allows to set any aspect in PIN_CNF register.
Vincent Coubard 640:c90ae1400bf2 160 * @param pin_number Specifies the pin number (allowed values 0-31).
Vincent Coubard 640:c90ae1400bf2 161 * @param dir Pin direction
Vincent Coubard 640:c90ae1400bf2 162 * @param input Connect or disconnect input buffer
Vincent Coubard 640:c90ae1400bf2 163 * @param pull Pull configuration
Vincent Coubard 640:c90ae1400bf2 164 * @param drive Drive configuration
Vincent Coubard 640:c90ae1400bf2 165 * @param sense Pin sensing mechanism
Vincent Coubard 640:c90ae1400bf2 166 */
Vincent Coubard 640:c90ae1400bf2 167 __STATIC_INLINE void nrf_gpio_cfg(
Vincent Coubard 640:c90ae1400bf2 168 uint32_t pin_number,
Vincent Coubard 640:c90ae1400bf2 169 nrf_gpio_pin_dir_t dir,
Vincent Coubard 640:c90ae1400bf2 170 nrf_gpio_pin_input_t input,
Vincent Coubard 640:c90ae1400bf2 171 nrf_gpio_pin_pull_t pull,
Vincent Coubard 640:c90ae1400bf2 172 nrf_gpio_pin_drive_t drive,
Vincent Coubard 640:c90ae1400bf2 173 nrf_gpio_pin_sense_t sense);
Vincent Coubard 640:c90ae1400bf2 174
Vincent Coubard 640:c90ae1400bf2 175 /**
Vincent Coubard 640:c90ae1400bf2 176 * @brief Function for configuring the given GPIO pin number as output with given initial value set, hiding inner details.
Vincent Coubard 640:c90ae1400bf2 177 * This function can be used to configure pin range as simple input with gate driving GPIO_PIN_CNF_DRIVE_S0S1 (normal cases).
Vincent Coubard 640:c90ae1400bf2 178 *
Vincent Coubard 640:c90ae1400bf2 179 * @param pin_number specifies the pin number (allowed values 0-31)
Vincent Coubard 640:c90ae1400bf2 180 *
Vincent Coubard 640:c90ae1400bf2 181 * @note Sense capability on the pin is disabled, and input is disconnected from the buffer as the pins are configured as output.
Vincent Coubard 640:c90ae1400bf2 182 */
Vincent Coubard 640:c90ae1400bf2 183 __STATIC_INLINE void nrf_gpio_cfg_output(uint32_t pin_number);
Vincent Coubard 640:c90ae1400bf2 184
Vincent Coubard 640:c90ae1400bf2 185 /**
Vincent Coubard 640:c90ae1400bf2 186 * @brief Function for configuring the given GPIO pin number as input with given initial value set, hiding inner details.
Vincent Coubard 640:c90ae1400bf2 187 * This function can be used to configure pin range as simple input with gate driving GPIO_PIN_CNF_DRIVE_S0S1 (normal cases).
Vincent Coubard 640:c90ae1400bf2 188 *
Vincent Coubard 640:c90ae1400bf2 189 * @param pin_number Specifies the pin number (allowed values 0-30).
Vincent Coubard 640:c90ae1400bf2 190 * @param pull_config State of the pin range pull resistor (no pull, pulled down or pulled high).
Vincent Coubard 640:c90ae1400bf2 191 *
Vincent Coubard 640:c90ae1400bf2 192 * @note Sense capability on the pin is disabled, and input is connected to buffer so that the GPIO->IN register is readable
Vincent Coubard 640:c90ae1400bf2 193 */
Vincent Coubard 640:c90ae1400bf2 194 __STATIC_INLINE void nrf_gpio_cfg_input(uint32_t pin_number, nrf_gpio_pin_pull_t pull_config);
Vincent Coubard 640:c90ae1400bf2 195
Vincent Coubard 640:c90ae1400bf2 196 /**
Vincent Coubard 640:c90ae1400bf2 197 * @brief Function for reseting pin configuration to its default state.
Vincent Coubard 640:c90ae1400bf2 198 *
Vincent Coubard 640:c90ae1400bf2 199 * @param pin_number Specifies the pin number (allowed values 0-31).
Vincent Coubard 640:c90ae1400bf2 200 */
Vincent Coubard 640:c90ae1400bf2 201 __STATIC_INLINE void nrf_gpio_cfg_default(uint32_t pin_number);
Vincent Coubard 640:c90ae1400bf2 202
Vincent Coubard 640:c90ae1400bf2 203 /**
Vincent Coubard 640:c90ae1400bf2 204 * @brief Function for configuring the given GPIO pin number as a watcher. Only input is connected.
Vincent Coubard 640:c90ae1400bf2 205 *
Vincent Coubard 640:c90ae1400bf2 206 * @param pin_number Specifies the pin number (allowed values 0-31).
Vincent Coubard 640:c90ae1400bf2 207 *
Vincent Coubard 640:c90ae1400bf2 208 */
Vincent Coubard 640:c90ae1400bf2 209 __STATIC_INLINE void nrf_gpio_cfg_watcher(uint32_t pin_number);
Vincent Coubard 640:c90ae1400bf2 210
Vincent Coubard 640:c90ae1400bf2 211 /**
Vincent Coubard 640:c90ae1400bf2 212 * @brief Function for disconnecting input for the given GPIO.
Vincent Coubard 640:c90ae1400bf2 213 *
Vincent Coubard 640:c90ae1400bf2 214 * @param pin_number Specifies the pin number (allowed values 0-31).
Vincent Coubard 640:c90ae1400bf2 215 *
Vincent Coubard 640:c90ae1400bf2 216 */
Vincent Coubard 640:c90ae1400bf2 217 __STATIC_INLINE void nrf_gpio_input_disconnect(uint32_t pin_number);
Vincent Coubard 640:c90ae1400bf2 218
Vincent Coubard 640:c90ae1400bf2 219 /**
Vincent Coubard 640:c90ae1400bf2 220 * @brief Function for configuring the given GPIO pin number as input with given initial value set, hiding inner details.
Vincent Coubard 640:c90ae1400bf2 221 * This function can be used to configure pin range as simple input with gate driving GPIO_PIN_CNF_DRIVE_S0S1 (normal cases).
Vincent Coubard 640:c90ae1400bf2 222 * Sense capability on the pin is configurable, and input is connected to buffer so that the GPIO->IN register is readable.
Vincent Coubard 640:c90ae1400bf2 223 *
Vincent Coubard 640:c90ae1400bf2 224 * @param pin_number Specifies the pin number (allowed values 0-30).
Vincent Coubard 640:c90ae1400bf2 225 * @param pull_config State of the pin pull resistor (no pull, pulled down or pulled high).
Vincent Coubard 640:c90ae1400bf2 226 * @param sense_config Sense level of the pin (no sense, sense low or sense high).
Vincent Coubard 640:c90ae1400bf2 227 */
Vincent Coubard 640:c90ae1400bf2 228 __STATIC_INLINE void nrf_gpio_cfg_sense_input(uint32_t pin_number, nrf_gpio_pin_pull_t pull_config, nrf_gpio_pin_sense_t sense_config);
Vincent Coubard 640:c90ae1400bf2 229
Vincent Coubard 640:c90ae1400bf2 230 /**
Vincent Coubard 640:c90ae1400bf2 231 * @brief Function for configuring sense level for the given GPIO.
Vincent Coubard 640:c90ae1400bf2 232 *
Vincent Coubard 640:c90ae1400bf2 233 * @param pin_number Specifies the pin number of gpio pin numbers to be configured (allowed values 0-30).
Vincent Coubard 640:c90ae1400bf2 234 * @param sense_config Sense configuration.
Vincent Coubard 640:c90ae1400bf2 235 *
Vincent Coubard 640:c90ae1400bf2 236 */
Vincent Coubard 640:c90ae1400bf2 237 __STATIC_INLINE void nrf_gpio_cfg_sense_set(uint32_t pin_number, nrf_gpio_pin_sense_t sense_config);
Vincent Coubard 640:c90ae1400bf2 238
Vincent Coubard 640:c90ae1400bf2 239 /**
Vincent Coubard 640:c90ae1400bf2 240 * @brief Function for setting the direction for a GPIO pin.
Vincent Coubard 640:c90ae1400bf2 241 *
Vincent Coubard 640:c90ae1400bf2 242 * @param pin_number specifies the pin number [0:31] for which to
Vincent Coubard 640:c90ae1400bf2 243 * set the direction.
Vincent Coubard 640:c90ae1400bf2 244 *
Vincent Coubard 640:c90ae1400bf2 245 * @param direction specifies the direction
Vincent Coubard 640:c90ae1400bf2 246 */
Vincent Coubard 640:c90ae1400bf2 247 __STATIC_INLINE void nrf_gpio_pin_dir_set(uint32_t pin_number, nrf_gpio_pin_dir_t direction);
Vincent Coubard 640:c90ae1400bf2 248
Vincent Coubard 640:c90ae1400bf2 249 /**
Vincent Coubard 640:c90ae1400bf2 250 * @brief Function for setting a GPIO pin.
Vincent Coubard 640:c90ae1400bf2 251 *
Vincent Coubard 640:c90ae1400bf2 252 * Note that the pin must be configured as an output for this
Vincent Coubard 640:c90ae1400bf2 253 * function to have any effect.
Vincent Coubard 640:c90ae1400bf2 254 *
Vincent Coubard 640:c90ae1400bf2 255 * @param pin_number specifies the pin number [0:31] to
Vincent Coubard 640:c90ae1400bf2 256 * set.
Vincent Coubard 640:c90ae1400bf2 257 */
Vincent Coubard 640:c90ae1400bf2 258 __STATIC_INLINE void nrf_gpio_pin_set(uint32_t pin_number);
Vincent Coubard 640:c90ae1400bf2 259
Vincent Coubard 640:c90ae1400bf2 260 /**
Vincent Coubard 640:c90ae1400bf2 261 * @brief Function for setting GPIO pins.
Vincent Coubard 640:c90ae1400bf2 262 *
Vincent Coubard 640:c90ae1400bf2 263 * Note that pins must be configured as an output for this
Vincent Coubard 640:c90ae1400bf2 264 * function to have any effect.
Vincent Coubard 640:c90ae1400bf2 265 *
Vincent Coubard 640:c90ae1400bf2 266 * @param pin_mask Specifies the pins to set.
Vincent Coubard 640:c90ae1400bf2 267 * set.
Vincent Coubard 640:c90ae1400bf2 268 */
Vincent Coubard 640:c90ae1400bf2 269 __STATIC_INLINE void nrf_gpio_pins_set(uint32_t pin_mask);
Vincent Coubard 640:c90ae1400bf2 270
Vincent Coubard 640:c90ae1400bf2 271 /**
Vincent Coubard 640:c90ae1400bf2 272 * @brief Function for clearing a GPIO pin.
Vincent Coubard 640:c90ae1400bf2 273 *
Vincent Coubard 640:c90ae1400bf2 274 * Note that the pin must be configured as an output for this
Vincent Coubard 640:c90ae1400bf2 275 * function to have any effect.
Vincent Coubard 640:c90ae1400bf2 276 *
Vincent Coubard 640:c90ae1400bf2 277 * @param pin_number specifies the pin number [0:31] to
Vincent Coubard 640:c90ae1400bf2 278 * clear.
Vincent Coubard 640:c90ae1400bf2 279 */
Vincent Coubard 640:c90ae1400bf2 280 __STATIC_INLINE void nrf_gpio_pin_clear(uint32_t pin_number);
Vincent Coubard 640:c90ae1400bf2 281
Vincent Coubard 640:c90ae1400bf2 282 /**
Vincent Coubard 640:c90ae1400bf2 283 * @brief Function for clearing GPIO pins.
Vincent Coubard 640:c90ae1400bf2 284 *
Vincent Coubard 640:c90ae1400bf2 285 * Note that pins must be configured as an output for this
Vincent Coubard 640:c90ae1400bf2 286 * function to have any effect.
Vincent Coubard 640:c90ae1400bf2 287 *
Vincent Coubard 640:c90ae1400bf2 288 * @param pin_mask Specifies the pins to clear.
Vincent Coubard 640:c90ae1400bf2 289 * set.
Vincent Coubard 640:c90ae1400bf2 290 */
Vincent Coubard 640:c90ae1400bf2 291 __STATIC_INLINE void nrf_gpio_pins_clear(uint32_t pin_mask);
Vincent Coubard 640:c90ae1400bf2 292
Vincent Coubard 640:c90ae1400bf2 293 /**
Vincent Coubard 640:c90ae1400bf2 294 * @brief Function for toggling a GPIO pin.
Vincent Coubard 640:c90ae1400bf2 295 *
Vincent Coubard 640:c90ae1400bf2 296 * Note that the pin must be configured as an output for this
Vincent Coubard 640:c90ae1400bf2 297 * function to have any effect.
Vincent Coubard 640:c90ae1400bf2 298 *
Vincent Coubard 640:c90ae1400bf2 299 * @param pin_number specifies the pin number [0:31] to
Vincent Coubard 640:c90ae1400bf2 300 * toggle.
Vincent Coubard 640:c90ae1400bf2 301 */
Vincent Coubard 640:c90ae1400bf2 302 __STATIC_INLINE void nrf_gpio_pin_toggle(uint32_t pin_number);
Vincent Coubard 640:c90ae1400bf2 303
Vincent Coubard 640:c90ae1400bf2 304 /**
Vincent Coubard 640:c90ae1400bf2 305 * @brief Function for writing a value to a GPIO pin.
Vincent Coubard 640:c90ae1400bf2 306 *
Vincent Coubard 640:c90ae1400bf2 307 * Note that the pin must be configured as an output for this
Vincent Coubard 640:c90ae1400bf2 308 * function to have any effect.
Vincent Coubard 640:c90ae1400bf2 309 *
Vincent Coubard 640:c90ae1400bf2 310 * @param pin_number specifies the pin number [0:31] to
Vincent Coubard 640:c90ae1400bf2 311 * write.
Vincent Coubard 640:c90ae1400bf2 312 *
Vincent Coubard 640:c90ae1400bf2 313 * @param value specifies the value to be written to the pin.
Vincent Coubard 640:c90ae1400bf2 314 * @arg 0 clears the pin
Vincent Coubard 640:c90ae1400bf2 315 * @arg >=1 sets the pin.
Vincent Coubard 640:c90ae1400bf2 316 */
Vincent Coubard 640:c90ae1400bf2 317 __STATIC_INLINE void nrf_gpio_pin_write(uint32_t pin_number, uint32_t value);
Vincent Coubard 640:c90ae1400bf2 318
Vincent Coubard 640:c90ae1400bf2 319 /**
Vincent Coubard 640:c90ae1400bf2 320 * @brief Function for reading the input level of a GPIO pin.
Vincent Coubard 640:c90ae1400bf2 321 *
Vincent Coubard 640:c90ae1400bf2 322 * Note that the pin must have input connected for the value
Vincent Coubard 640:c90ae1400bf2 323 * returned from this function to be valid.
Vincent Coubard 640:c90ae1400bf2 324 *
Vincent Coubard 640:c90ae1400bf2 325 * @param pin_number specifies the pin number [0:31] to
Vincent Coubard 640:c90ae1400bf2 326 * read.
Vincent Coubard 640:c90ae1400bf2 327 *
Vincent Coubard 640:c90ae1400bf2 328 * @return
Vincent Coubard 640:c90ae1400bf2 329 * @retval 0 if the pin input level is low.
Vincent Coubard 640:c90ae1400bf2 330 * @retval 1 if the pin input level is high.
Vincent Coubard 640:c90ae1400bf2 331 * @retval > 1 should never occur.
Vincent Coubard 640:c90ae1400bf2 332 */
Vincent Coubard 640:c90ae1400bf2 333 __STATIC_INLINE uint32_t nrf_gpio_pin_read(uint32_t pin_number);
Vincent Coubard 640:c90ae1400bf2 334
Vincent Coubard 640:c90ae1400bf2 335 /**
Vincent Coubard 640:c90ae1400bf2 336 * @brief Function for reading the input level of all GPIO pins.
Vincent Coubard 640:c90ae1400bf2 337 *
Vincent Coubard 640:c90ae1400bf2 338 * Note that the pin must have input connected for the value
Vincent Coubard 640:c90ae1400bf2 339 * returned from this function to be valid.
Vincent Coubard 640:c90ae1400bf2 340 *
Vincent Coubard 640:c90ae1400bf2 341 * @retval Status of input of all pins
Vincent Coubard 640:c90ae1400bf2 342 */
Vincent Coubard 640:c90ae1400bf2 343 __STATIC_INLINE uint32_t nrf_gpio_pins_read(void);
Vincent Coubard 640:c90ae1400bf2 344
Vincent Coubard 640:c90ae1400bf2 345 /**
Vincent Coubard 640:c90ae1400bf2 346 * @brief Function for reading the sense configuration of a GPIO pin.
Vincent Coubard 640:c90ae1400bf2 347 *
Vincent Coubard 640:c90ae1400bf2 348 * @param pin_number specifies the pin number [0:31] to
Vincent Coubard 640:c90ae1400bf2 349 * read.
Vincent Coubard 640:c90ae1400bf2 350 *
Vincent Coubard 640:c90ae1400bf2 351 * @retval Sense configuration
Vincent Coubard 640:c90ae1400bf2 352 */
Vincent Coubard 640:c90ae1400bf2 353 __STATIC_INLINE nrf_gpio_pin_sense_t nrf_gpio_pin_sense_get(uint32_t pin_number);
Vincent Coubard 640:c90ae1400bf2 354
Vincent Coubard 640:c90ae1400bf2 355 /**
Vincent Coubard 640:c90ae1400bf2 356 * @brief Generic function for writing a single byte of a 32 bit word at a given
Vincent Coubard 640:c90ae1400bf2 357 * address.
Vincent Coubard 640:c90ae1400bf2 358 *
Vincent Coubard 640:c90ae1400bf2 359 * This function should not be called from outside the nrf_gpio
Vincent Coubard 640:c90ae1400bf2 360 * abstraction layer.
Vincent Coubard 640:c90ae1400bf2 361 *
Vincent Coubard 640:c90ae1400bf2 362 * @param word_address is the address of the word to be written.
Vincent Coubard 640:c90ae1400bf2 363 *
Vincent Coubard 640:c90ae1400bf2 364 * @param byte_no is the word byte number (0-3) to be written.
Vincent Coubard 640:c90ae1400bf2 365 *
Vincent Coubard 640:c90ae1400bf2 366 * @param value is the value to be written to byte "byte_no" of word
Vincent Coubard 640:c90ae1400bf2 367 * at address "word_address"
Vincent Coubard 640:c90ae1400bf2 368 */
Vincent Coubard 640:c90ae1400bf2 369 __STATIC_INLINE void nrf_gpio_word_byte_write(volatile uint32_t * word_address, uint8_t byte_no, uint8_t value);
Vincent Coubard 640:c90ae1400bf2 370
Vincent Coubard 640:c90ae1400bf2 371 /**
Vincent Coubard 640:c90ae1400bf2 372 * @brief Generic function for reading a single byte of a 32 bit word at a given
Vincent Coubard 640:c90ae1400bf2 373 * address.
Vincent Coubard 640:c90ae1400bf2 374 *
Vincent Coubard 640:c90ae1400bf2 375 * This function should not be called from outside the nrf_gpio
Vincent Coubard 640:c90ae1400bf2 376 * abstraction layer.
Vincent Coubard 640:c90ae1400bf2 377 *
Vincent Coubard 640:c90ae1400bf2 378 * @param word_address is the address of the word to be read.
Vincent Coubard 640:c90ae1400bf2 379 *
Vincent Coubard 640:c90ae1400bf2 380 * @param byte_no is the byte number (0-3) of the word to be read.
Vincent Coubard 640:c90ae1400bf2 381 *
Vincent Coubard 640:c90ae1400bf2 382 * @return byte "byte_no" of word at address "word_address".
Vincent Coubard 640:c90ae1400bf2 383 */
Vincent Coubard 640:c90ae1400bf2 384 __STATIC_INLINE uint8_t nrf_gpio_word_byte_read(const volatile uint32_t* word_address, uint8_t byte_no);
Vincent Coubard 640:c90ae1400bf2 385
Vincent Coubard 640:c90ae1400bf2 386 /**
Vincent Coubard 640:c90ae1400bf2 387 * @brief Function for setting the direction of a port.
Vincent Coubard 640:c90ae1400bf2 388 *
Vincent Coubard 640:c90ae1400bf2 389 * @param port is the port for which to set the direction.
Vincent Coubard 640:c90ae1400bf2 390 *
Vincent Coubard 640:c90ae1400bf2 391 * @param dir direction to be set for this port.
Vincent Coubard 640:c90ae1400bf2 392 */
Vincent Coubard 640:c90ae1400bf2 393 __STATIC_INLINE void nrf_gpio_port_dir_set(nrf_gpio_port_select_t port, nrf_gpio_port_dir_t dir);
Vincent Coubard 640:c90ae1400bf2 394
Vincent Coubard 640:c90ae1400bf2 395 /**
Vincent Coubard 640:c90ae1400bf2 396 * @brief Function for reading a GPIO port.
Vincent Coubard 640:c90ae1400bf2 397 *
Vincent Coubard 640:c90ae1400bf2 398 * @param port is the port to read.
Vincent Coubard 640:c90ae1400bf2 399 *
Vincent Coubard 640:c90ae1400bf2 400 * @return the input value on this port.
Vincent Coubard 640:c90ae1400bf2 401 */
Vincent Coubard 640:c90ae1400bf2 402 __STATIC_INLINE uint8_t nrf_gpio_port_read(nrf_gpio_port_select_t port);
Vincent Coubard 640:c90ae1400bf2 403
Vincent Coubard 640:c90ae1400bf2 404 /**
Vincent Coubard 640:c90ae1400bf2 405 * @brief Function for writing to a GPIO port.
Vincent Coubard 640:c90ae1400bf2 406 *
Vincent Coubard 640:c90ae1400bf2 407 * @param port is the port to write.
Vincent Coubard 640:c90ae1400bf2 408 *
Vincent Coubard 640:c90ae1400bf2 409 * @param value is the value to write to this port.
Vincent Coubard 640:c90ae1400bf2 410 *
Vincent Coubard 640:c90ae1400bf2 411 * @sa nrf_gpio_port_dir_set()
Vincent Coubard 640:c90ae1400bf2 412 */
Vincent Coubard 640:c90ae1400bf2 413 __STATIC_INLINE void nrf_gpio_port_write(nrf_gpio_port_select_t port, uint8_t value);
Vincent Coubard 640:c90ae1400bf2 414
Vincent Coubard 640:c90ae1400bf2 415 /**
Vincent Coubard 640:c90ae1400bf2 416 * @brief Function for setting individual pins on GPIO port.
Vincent Coubard 640:c90ae1400bf2 417 *
Vincent Coubard 640:c90ae1400bf2 418 * @param port is the port for which to set the pins.
Vincent Coubard 640:c90ae1400bf2 419 *
Vincent Coubard 640:c90ae1400bf2 420 * @param set_mask is a mask specifying which pins to set. A bit
Vincent Coubard 640:c90ae1400bf2 421 * set to 1 indicates that the corresponding port pin shall be
Vincent Coubard 640:c90ae1400bf2 422 * set.
Vincent Coubard 640:c90ae1400bf2 423 *
Vincent Coubard 640:c90ae1400bf2 424 * @sa nrf_gpio_port_dir_set()
Vincent Coubard 640:c90ae1400bf2 425 */
Vincent Coubard 640:c90ae1400bf2 426 __STATIC_INLINE void nrf_gpio_port_set(nrf_gpio_port_select_t port, uint8_t set_mask);
Vincent Coubard 640:c90ae1400bf2 427
Vincent Coubard 640:c90ae1400bf2 428 /**
Vincent Coubard 640:c90ae1400bf2 429 * @brief Function for clearing individual pins on GPIO port.
Vincent Coubard 640:c90ae1400bf2 430 *
Vincent Coubard 640:c90ae1400bf2 431 * @param port is the port for which to clear the pins.
Vincent Coubard 640:c90ae1400bf2 432 *
Vincent Coubard 640:c90ae1400bf2 433 * @param clr_mask is a mask specifying which pins to clear. A bit
Vincent Coubard 640:c90ae1400bf2 434 * set to 1 indicates that the corresponding port pin shall be
Vincent Coubard 640:c90ae1400bf2 435 * cleared.
Vincent Coubard 640:c90ae1400bf2 436 *
Vincent Coubard 640:c90ae1400bf2 437 * @sa nrf_gpio_port_dir_set()
Vincent Coubard 640:c90ae1400bf2 438 */
Vincent Coubard 640:c90ae1400bf2 439 __STATIC_INLINE void nrf_gpio_port_clear(nrf_gpio_port_select_t port, uint8_t clr_mask);
Vincent Coubard 640:c90ae1400bf2 440
Vincent Coubard 640:c90ae1400bf2 441 #ifndef SUPPRESS_INLINE_IMPLEMENTATION
Vincent Coubard 640:c90ae1400bf2 442 __STATIC_INLINE void nrf_gpio_range_cfg_output(uint32_t pin_range_start, uint32_t pin_range_end)
Vincent Coubard 640:c90ae1400bf2 443 {
Vincent Coubard 640:c90ae1400bf2 444 /*lint -e{845} // A zero has been given as right argument to operator '|'" */
Vincent Coubard 640:c90ae1400bf2 445 for (; pin_range_start <= pin_range_end; pin_range_start++)
Vincent Coubard 640:c90ae1400bf2 446 {
Vincent Coubard 640:c90ae1400bf2 447 nrf_gpio_cfg_output(pin_range_start);
Vincent Coubard 640:c90ae1400bf2 448 }
Vincent Coubard 640:c90ae1400bf2 449 }
Vincent Coubard 640:c90ae1400bf2 450
Vincent Coubard 640:c90ae1400bf2 451 __STATIC_INLINE void nrf_gpio_range_cfg_input(uint32_t pin_range_start, uint32_t pin_range_end, nrf_gpio_pin_pull_t pull_config)
Vincent Coubard 640:c90ae1400bf2 452 {
Vincent Coubard 640:c90ae1400bf2 453 /*lint -e{845} // A zero has been given as right argument to operator '|'" */
Vincent Coubard 640:c90ae1400bf2 454 for (; pin_range_start <= pin_range_end; pin_range_start++)
Vincent Coubard 640:c90ae1400bf2 455 {
Vincent Coubard 640:c90ae1400bf2 456 nrf_gpio_cfg_input(pin_range_start, pull_config);
Vincent Coubard 640:c90ae1400bf2 457 }
Vincent Coubard 640:c90ae1400bf2 458 }
Vincent Coubard 640:c90ae1400bf2 459
Vincent Coubard 640:c90ae1400bf2 460 __STATIC_INLINE void nrf_gpio_cfg(
Vincent Coubard 640:c90ae1400bf2 461 uint32_t pin_number,
Vincent Coubard 640:c90ae1400bf2 462 nrf_gpio_pin_dir_t dir,
Vincent Coubard 640:c90ae1400bf2 463 nrf_gpio_pin_input_t input,
Vincent Coubard 640:c90ae1400bf2 464 nrf_gpio_pin_pull_t pull,
Vincent Coubard 640:c90ae1400bf2 465 nrf_gpio_pin_drive_t drive,
Vincent Coubard 640:c90ae1400bf2 466 nrf_gpio_pin_sense_t sense)
Vincent Coubard 640:c90ae1400bf2 467 {
Vincent Coubard 640:c90ae1400bf2 468 NRF_GPIO->PIN_CNF[pin_number] = ((uint32_t)dir << GPIO_PIN_CNF_DIR_Pos)
Vincent Coubard 640:c90ae1400bf2 469 | ((uint32_t)input << GPIO_PIN_CNF_INPUT_Pos)
Vincent Coubard 640:c90ae1400bf2 470 | ((uint32_t)pull << GPIO_PIN_CNF_PULL_Pos)
Vincent Coubard 640:c90ae1400bf2 471 | ((uint32_t)drive << GPIO_PIN_CNF_DRIVE_Pos)
Vincent Coubard 640:c90ae1400bf2 472 | ((uint32_t)sense << GPIO_PIN_CNF_SENSE_Pos);
Vincent Coubard 640:c90ae1400bf2 473 }
Vincent Coubard 640:c90ae1400bf2 474
Vincent Coubard 640:c90ae1400bf2 475 __STATIC_INLINE void nrf_gpio_cfg_output(uint32_t pin_number)
Vincent Coubard 640:c90ae1400bf2 476 {
Vincent Coubard 640:c90ae1400bf2 477 nrf_gpio_cfg(
Vincent Coubard 640:c90ae1400bf2 478 pin_number,
Vincent Coubard 640:c90ae1400bf2 479 NRF_GPIO_PIN_DIR_OUTPUT,
Vincent Coubard 640:c90ae1400bf2 480 NRF_GPIO_PIN_INPUT_DISCONNECT,
Vincent Coubard 640:c90ae1400bf2 481 NRF_GPIO_PIN_NOPULL,
Vincent Coubard 640:c90ae1400bf2 482 NRF_GPIO_PIN_S0S1,
Vincent Coubard 640:c90ae1400bf2 483 NRF_GPIO_PIN_NOSENSE);
Vincent Coubard 640:c90ae1400bf2 484 }
Vincent Coubard 640:c90ae1400bf2 485
Vincent Coubard 640:c90ae1400bf2 486 __STATIC_INLINE void nrf_gpio_cfg_input(uint32_t pin_number, nrf_gpio_pin_pull_t pull_config)
Vincent Coubard 640:c90ae1400bf2 487 {
Vincent Coubard 640:c90ae1400bf2 488 nrf_gpio_cfg(
Vincent Coubard 640:c90ae1400bf2 489 pin_number,
Vincent Coubard 640:c90ae1400bf2 490 NRF_GPIO_PIN_DIR_INPUT,
Vincent Coubard 640:c90ae1400bf2 491 NRF_GPIO_PIN_INPUT_CONNECT,
Vincent Coubard 640:c90ae1400bf2 492 pull_config,
Vincent Coubard 640:c90ae1400bf2 493 NRF_GPIO_PIN_S0S1,
Vincent Coubard 640:c90ae1400bf2 494 NRF_GPIO_PIN_NOSENSE);
Vincent Coubard 640:c90ae1400bf2 495 }
Vincent Coubard 640:c90ae1400bf2 496
Vincent Coubard 640:c90ae1400bf2 497 __STATIC_INLINE void nrf_gpio_cfg_default(uint32_t pin_number)
Vincent Coubard 640:c90ae1400bf2 498 {
Vincent Coubard 640:c90ae1400bf2 499 nrf_gpio_cfg(
Vincent Coubard 640:c90ae1400bf2 500 pin_number,
Vincent Coubard 640:c90ae1400bf2 501 NRF_GPIO_PIN_DIR_INPUT,
Vincent Coubard 640:c90ae1400bf2 502 NRF_GPIO_PIN_INPUT_DISCONNECT,
Vincent Coubard 640:c90ae1400bf2 503 NRF_GPIO_PIN_NOPULL,
Vincent Coubard 640:c90ae1400bf2 504 NRF_GPIO_PIN_S0S1,
Vincent Coubard 640:c90ae1400bf2 505 NRF_GPIO_PIN_NOSENSE);
Vincent Coubard 640:c90ae1400bf2 506 }
Vincent Coubard 640:c90ae1400bf2 507
Vincent Coubard 640:c90ae1400bf2 508 __STATIC_INLINE void nrf_gpio_cfg_watcher(uint32_t pin_number)
Vincent Coubard 640:c90ae1400bf2 509 {
Vincent Coubard 640:c90ae1400bf2 510 /*lint -e{845} // A zero has been given as right argument to operator '|'" */
Vincent Coubard 640:c90ae1400bf2 511 uint32_t cnf = NRF_GPIO->PIN_CNF[pin_number] & ~GPIO_PIN_CNF_INPUT_Msk;
Vincent Coubard 640:c90ae1400bf2 512 NRF_GPIO->PIN_CNF[pin_number] = cnf | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos);
Vincent Coubard 640:c90ae1400bf2 513 }
Vincent Coubard 640:c90ae1400bf2 514
Vincent Coubard 640:c90ae1400bf2 515 __STATIC_INLINE void nrf_gpio_input_disconnect(uint32_t pin_number)
Vincent Coubard 640:c90ae1400bf2 516 {
Vincent Coubard 640:c90ae1400bf2 517 /*lint -e{845} // A zero has been given as right argument to operator '|'" */
Vincent Coubard 640:c90ae1400bf2 518 uint32_t cnf = NRF_GPIO->PIN_CNF[pin_number] & ~GPIO_PIN_CNF_INPUT_Msk;
Vincent Coubard 640:c90ae1400bf2 519 NRF_GPIO->PIN_CNF[pin_number] = cnf | (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos);
Vincent Coubard 640:c90ae1400bf2 520 }
Vincent Coubard 640:c90ae1400bf2 521
Vincent Coubard 640:c90ae1400bf2 522 __STATIC_INLINE void nrf_gpio_cfg_sense_input(uint32_t pin_number, nrf_gpio_pin_pull_t pull_config, nrf_gpio_pin_sense_t sense_config)
Vincent Coubard 640:c90ae1400bf2 523 {
Vincent Coubard 640:c90ae1400bf2 524 nrf_gpio_cfg(
Vincent Coubard 640:c90ae1400bf2 525 pin_number,
Vincent Coubard 640:c90ae1400bf2 526 NRF_GPIO_PIN_DIR_INPUT,
Vincent Coubard 640:c90ae1400bf2 527 NRF_GPIO_PIN_INPUT_CONNECT,
Vincent Coubard 640:c90ae1400bf2 528 pull_config,
Vincent Coubard 640:c90ae1400bf2 529 NRF_GPIO_PIN_S0S1,
Vincent Coubard 640:c90ae1400bf2 530 sense_config);
Vincent Coubard 640:c90ae1400bf2 531 }
Vincent Coubard 640:c90ae1400bf2 532
Vincent Coubard 640:c90ae1400bf2 533 __STATIC_INLINE void nrf_gpio_cfg_sense_set(uint32_t pin_number, nrf_gpio_pin_sense_t sense_config)
Vincent Coubard 640:c90ae1400bf2 534 {
Vincent Coubard 640:c90ae1400bf2 535 /*lint -e{845} // A zero has been given as right argument to operator '|'" */
Vincent Coubard 640:c90ae1400bf2 536 //uint32_t cnf = NRF_GPIO->PIN_CNF[pin_number] & ~GPIO_PIN_CNF_SENSE_Msk;
Vincent Coubard 640:c90ae1400bf2 537 NRF_GPIO->PIN_CNF[pin_number] &= ~GPIO_PIN_CNF_SENSE_Msk;
Vincent Coubard 640:c90ae1400bf2 538 NRF_GPIO->PIN_CNF[pin_number] |= (sense_config << GPIO_PIN_CNF_SENSE_Pos);
Vincent Coubard 640:c90ae1400bf2 539 }
Vincent Coubard 640:c90ae1400bf2 540
Vincent Coubard 640:c90ae1400bf2 541 __STATIC_INLINE void nrf_gpio_pin_dir_set(uint32_t pin_number, nrf_gpio_pin_dir_t direction)
Vincent Coubard 640:c90ae1400bf2 542 {
Vincent Coubard 640:c90ae1400bf2 543 if(direction == NRF_GPIO_PIN_DIR_INPUT)
Vincent Coubard 640:c90ae1400bf2 544 {
Vincent Coubard 640:c90ae1400bf2 545 nrf_gpio_cfg(
Vincent Coubard 640:c90ae1400bf2 546 pin_number,
Vincent Coubard 640:c90ae1400bf2 547 NRF_GPIO_PIN_DIR_INPUT,
Vincent Coubard 640:c90ae1400bf2 548 NRF_GPIO_PIN_INPUT_CONNECT,
Vincent Coubard 640:c90ae1400bf2 549 NRF_GPIO_PIN_NOPULL,
Vincent Coubard 640:c90ae1400bf2 550 NRF_GPIO_PIN_S0S1,
Vincent Coubard 640:c90ae1400bf2 551 NRF_GPIO_PIN_NOSENSE);
Vincent Coubard 640:c90ae1400bf2 552 }
Vincent Coubard 640:c90ae1400bf2 553 else
Vincent Coubard 640:c90ae1400bf2 554 {
Vincent Coubard 640:c90ae1400bf2 555 NRF_GPIO->DIRSET = (1UL << pin_number);
Vincent Coubard 640:c90ae1400bf2 556 }
Vincent Coubard 640:c90ae1400bf2 557 }
Vincent Coubard 640:c90ae1400bf2 558
Vincent Coubard 640:c90ae1400bf2 559 __STATIC_INLINE void nrf_gpio_pin_set(uint32_t pin_number)
Vincent Coubard 640:c90ae1400bf2 560 {
Vincent Coubard 640:c90ae1400bf2 561 NRF_GPIO->OUTSET = (1UL << pin_number);
Vincent Coubard 640:c90ae1400bf2 562 }
Vincent Coubard 640:c90ae1400bf2 563
Vincent Coubard 640:c90ae1400bf2 564 __STATIC_INLINE void nrf_gpio_pins_set(uint32_t pin_mask)
Vincent Coubard 640:c90ae1400bf2 565 {
Vincent Coubard 640:c90ae1400bf2 566 NRF_GPIO->OUTSET = pin_mask;
Vincent Coubard 640:c90ae1400bf2 567 }
Vincent Coubard 640:c90ae1400bf2 568
Vincent Coubard 640:c90ae1400bf2 569 __STATIC_INLINE void nrf_gpio_pin_clear(uint32_t pin_number)
Vincent Coubard 640:c90ae1400bf2 570 {
Vincent Coubard 640:c90ae1400bf2 571 NRF_GPIO->OUTCLR = (1UL << pin_number);
Vincent Coubard 640:c90ae1400bf2 572 }
Vincent Coubard 640:c90ae1400bf2 573
Vincent Coubard 640:c90ae1400bf2 574 __STATIC_INLINE void nrf_gpio_pins_clear(uint32_t pin_mask)
Vincent Coubard 640:c90ae1400bf2 575 {
Vincent Coubard 640:c90ae1400bf2 576 NRF_GPIO->OUTCLR = pin_mask;
Vincent Coubard 640:c90ae1400bf2 577 }
Vincent Coubard 640:c90ae1400bf2 578
Vincent Coubard 640:c90ae1400bf2 579 __STATIC_INLINE void nrf_gpio_pin_toggle(uint32_t pin_number)
Vincent Coubard 640:c90ae1400bf2 580 {
Vincent Coubard 640:c90ae1400bf2 581 const uint32_t pin_bit = 1UL << pin_number;
Vincent Coubard 640:c90ae1400bf2 582 const uint32_t pin_state = ((NRF_GPIO->OUT >> pin_number) & 1UL);
Vincent Coubard 640:c90ae1400bf2 583
Vincent Coubard 640:c90ae1400bf2 584 if (pin_state == 0)
Vincent Coubard 640:c90ae1400bf2 585 {
Vincent Coubard 640:c90ae1400bf2 586 // Current state low, set high.
Vincent Coubard 640:c90ae1400bf2 587 NRF_GPIO->OUTSET = pin_bit;
Vincent Coubard 640:c90ae1400bf2 588 }
Vincent Coubard 640:c90ae1400bf2 589 else
Vincent Coubard 640:c90ae1400bf2 590 {
Vincent Coubard 640:c90ae1400bf2 591 // Current state high, set low.
Vincent Coubard 640:c90ae1400bf2 592 NRF_GPIO->OUTCLR = pin_bit;
Vincent Coubard 640:c90ae1400bf2 593 }
Vincent Coubard 640:c90ae1400bf2 594 }
Vincent Coubard 640:c90ae1400bf2 595
Vincent Coubard 640:c90ae1400bf2 596 __STATIC_INLINE void nrf_gpio_pin_write(uint32_t pin_number, uint32_t value)
Vincent Coubard 640:c90ae1400bf2 597 {
Vincent Coubard 640:c90ae1400bf2 598 if (value == 0)
Vincent Coubard 640:c90ae1400bf2 599 {
Vincent Coubard 640:c90ae1400bf2 600 nrf_gpio_pin_clear(pin_number);
Vincent Coubard 640:c90ae1400bf2 601 }
Vincent Coubard 640:c90ae1400bf2 602 else
Vincent Coubard 640:c90ae1400bf2 603 {
Vincent Coubard 640:c90ae1400bf2 604 nrf_gpio_pin_set(pin_number);
Vincent Coubard 640:c90ae1400bf2 605 }
Vincent Coubard 640:c90ae1400bf2 606 }
Vincent Coubard 640:c90ae1400bf2 607
Vincent Coubard 640:c90ae1400bf2 608 __STATIC_INLINE uint32_t nrf_gpio_pin_read(uint32_t pin_number)
Vincent Coubard 640:c90ae1400bf2 609 {
Vincent Coubard 640:c90ae1400bf2 610 return ((NRF_GPIO->IN >> pin_number) & 1UL);
Vincent Coubard 640:c90ae1400bf2 611 }
Vincent Coubard 640:c90ae1400bf2 612
Vincent Coubard 640:c90ae1400bf2 613 __STATIC_INLINE uint32_t nrf_gpio_pins_read(void)
Vincent Coubard 640:c90ae1400bf2 614 {
Vincent Coubard 640:c90ae1400bf2 615 return NRF_GPIO->IN;
Vincent Coubard 640:c90ae1400bf2 616 }
Vincent Coubard 640:c90ae1400bf2 617
Vincent Coubard 640:c90ae1400bf2 618 __STATIC_INLINE nrf_gpio_pin_sense_t nrf_gpio_pin_sense_get(uint32_t pin_number)
Vincent Coubard 640:c90ae1400bf2 619 {
Vincent Coubard 640:c90ae1400bf2 620 return (nrf_gpio_pin_sense_t)((NRF_GPIO->PIN_CNF[pin_number] & GPIO_PIN_CNF_SENSE_Msk) >> GPIO_PIN_CNF_SENSE_Pos);
Vincent Coubard 640:c90ae1400bf2 621 }
Vincent Coubard 640:c90ae1400bf2 622
Vincent Coubard 640:c90ae1400bf2 623 __STATIC_INLINE void nrf_gpio_word_byte_write(volatile uint32_t * word_address, uint8_t byte_no, uint8_t value)
Vincent Coubard 640:c90ae1400bf2 624 {
Vincent Coubard 640:c90ae1400bf2 625 *((volatile uint8_t*)(word_address) + byte_no) = value;
Vincent Coubard 640:c90ae1400bf2 626 }
Vincent Coubard 640:c90ae1400bf2 627
Vincent Coubard 640:c90ae1400bf2 628 __STATIC_INLINE uint8_t nrf_gpio_word_byte_read(const volatile uint32_t* word_address, uint8_t byte_no)
Vincent Coubard 640:c90ae1400bf2 629 {
Vincent Coubard 640:c90ae1400bf2 630 return (*((const volatile uint8_t*)(word_address) + byte_no));
Vincent Coubard 640:c90ae1400bf2 631 }
Vincent Coubard 640:c90ae1400bf2 632
Vincent Coubard 640:c90ae1400bf2 633 __STATIC_INLINE void nrf_gpio_port_dir_set(nrf_gpio_port_select_t port, nrf_gpio_port_dir_t dir)
Vincent Coubard 640:c90ae1400bf2 634 {
Vincent Coubard 640:c90ae1400bf2 635 if (dir == NRF_GPIO_PORT_DIR_OUTPUT)
Vincent Coubard 640:c90ae1400bf2 636 {
Vincent Coubard 640:c90ae1400bf2 637 nrf_gpio_word_byte_write(&NRF_GPIO->DIRSET, port, 0xFF);
Vincent Coubard 640:c90ae1400bf2 638 }
Vincent Coubard 640:c90ae1400bf2 639 else
Vincent Coubard 640:c90ae1400bf2 640 {
Vincent Coubard 640:c90ae1400bf2 641 nrf_gpio_range_cfg_input(port*8, (port+1)*8-1, NRF_GPIO_PIN_NOPULL);
Vincent Coubard 640:c90ae1400bf2 642 }
Vincent Coubard 640:c90ae1400bf2 643 }
Vincent Coubard 640:c90ae1400bf2 644
Vincent Coubard 640:c90ae1400bf2 645 __STATIC_INLINE uint8_t nrf_gpio_port_read(nrf_gpio_port_select_t port)
Vincent Coubard 640:c90ae1400bf2 646 {
Vincent Coubard 640:c90ae1400bf2 647 return nrf_gpio_word_byte_read(&NRF_GPIO->IN, port);
Vincent Coubard 640:c90ae1400bf2 648 }
Vincent Coubard 640:c90ae1400bf2 649
Vincent Coubard 640:c90ae1400bf2 650 __STATIC_INLINE void nrf_gpio_port_write(nrf_gpio_port_select_t port, uint8_t value)
Vincent Coubard 640:c90ae1400bf2 651 {
Vincent Coubard 640:c90ae1400bf2 652 nrf_gpio_word_byte_write(&NRF_GPIO->OUT, port, value);
Vincent Coubard 640:c90ae1400bf2 653 }
Vincent Coubard 640:c90ae1400bf2 654
Vincent Coubard 640:c90ae1400bf2 655 __STATIC_INLINE void nrf_gpio_port_set(nrf_gpio_port_select_t port, uint8_t set_mask)
Vincent Coubard 640:c90ae1400bf2 656 {
Vincent Coubard 640:c90ae1400bf2 657 nrf_gpio_word_byte_write(&NRF_GPIO->OUTSET, port, set_mask);
Vincent Coubard 640:c90ae1400bf2 658 }
Vincent Coubard 640:c90ae1400bf2 659
Vincent Coubard 640:c90ae1400bf2 660 __STATIC_INLINE void nrf_gpio_port_clear(nrf_gpio_port_select_t port, uint8_t clr_mask)
Vincent Coubard 640:c90ae1400bf2 661 {
Vincent Coubard 640:c90ae1400bf2 662 nrf_gpio_word_byte_write(&NRF_GPIO->OUTCLR, port, clr_mask);
Vincent Coubard 640:c90ae1400bf2 663 }
Vincent Coubard 640:c90ae1400bf2 664 #endif //SUPPRESS_INLINE_IMPLEMENTATION
Vincent Coubard 640:c90ae1400bf2 665 /** @} */
Vincent Coubard 640:c90ae1400bf2 666
Vincent Coubard 640:c90ae1400bf2 667 #endif