gpio.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef _HARDWARE_GPIO_H_
8#define _HARDWARE_GPIO_H_
9
10#include "pico.h"
11#include "hardware/structs/sio.h"
12#include "hardware/structs/padsbank0.h"
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18// PICO_CONFIG: PARAM_ASSERTIONS_ENABLED_GPIO, Enable/disable assertions in the GPIO module, type=bool, default=0, group=hardware_gpio
19#ifndef PARAM_ASSERTIONS_ENABLED_GPIO
20#define PARAM_ASSERTIONS_ENABLED_GPIO 0
21#endif
22
88enum gpio_function {
89 GPIO_FUNC_XIP = 0,
90 GPIO_FUNC_SPI = 1,
91 GPIO_FUNC_UART = 2,
92 GPIO_FUNC_I2C = 3,
93 GPIO_FUNC_PWM = 4,
94 GPIO_FUNC_SIO = 5,
95 GPIO_FUNC_PIO0 = 6,
96 GPIO_FUNC_PIO1 = 7,
97 GPIO_FUNC_GPCK = 8,
98 GPIO_FUNC_USB = 9,
99 GPIO_FUNC_NULL = 0x1f,
100};
101
102#define GPIO_OUT 1
103#define GPIO_IN 0
104
121 GPIO_IRQ_LEVEL_LOW = 0x1u,
122 GPIO_IRQ_LEVEL_HIGH = 0x2u,
123 GPIO_IRQ_EDGE_FALL = 0x4u,
124 GPIO_IRQ_EDGE_RISE = 0x8u,
125};
126
134typedef void (*gpio_irq_callback_t)(uint gpio, uint32_t events);
135
141};
142
150enum gpio_slew_rate {
154
161enum gpio_drive_strength {
167
168// ----------------------------------------------------------------------------
169// Pad Controls + IO Muxing
170// ----------------------------------------------------------------------------
171// Declarations for gpio.c
172
179void gpio_set_function(uint gpio, enum gpio_function fn);
180
187enum gpio_function gpio_get_function(uint gpio);
188
199void gpio_set_pulls(uint gpio, bool up, bool down);
200
206static inline void gpio_pull_up(uint gpio) {
207 gpio_set_pulls(gpio, true, false);
208}
209
216static inline bool gpio_is_pulled_up(uint gpio) {
217 return (padsbank0_hw->io[gpio] & PADS_BANK0_GPIO0_PUE_BITS) != 0;
218}
219
225static inline void gpio_pull_down(uint gpio) {
226 gpio_set_pulls(gpio, false, true);
227}
228
235static inline bool gpio_is_pulled_down(uint gpio) {
236 return (padsbank0_hw->io[gpio] & PADS_BANK0_GPIO0_PDE_BITS) != 0;
237}
238
244static inline void gpio_disable_pulls(uint gpio) {
245 gpio_set_pulls(gpio, false, false);
246}
247
256void gpio_set_irqover(uint gpio, uint value);
257
264void gpio_set_outover(uint gpio, uint value);
265
272void gpio_set_inover(uint gpio, uint value);
273
280void gpio_set_oeover(uint gpio, uint value);
281
288void gpio_set_input_enabled(uint gpio, bool enabled);
289
302void gpio_set_input_hysteresis_enabled(uint gpio, bool enabled);
303
311
312
320void gpio_set_slew_rate(uint gpio, enum gpio_slew_rate slew);
321
329enum gpio_slew_rate gpio_get_slew_rate(uint gpio);
330
338void gpio_set_drive_strength(uint gpio, enum gpio_drive_strength drive);
339
347enum gpio_drive_strength gpio_get_drive_strength(uint gpio);
348
368void gpio_set_irq_enabled(uint gpio, uint32_t events, bool enabled);
369
384void gpio_set_irq_enabled_with_callback(uint gpio, uint32_t events, bool enabled, gpio_irq_callback_t callback);
385
396void gpio_set_dormant_irq_enabled(uint gpio, uint32_t events, bool enabled);
397
405void gpio_acknowledge_irq(uint gpio, uint32_t events);
406
415void gpio_init(uint gpio);
416
425void gpio_init_mask(uint gpio_mask);
426// ----------------------------------------------------------------------------
427// Input
428// ----------------------------------------------------------------------------
429
436static inline bool gpio_get(uint gpio) {
437 return !!((1ul << gpio) & sio_hw->gpio_in);
438}
439
445static inline uint32_t gpio_get_all(void) {
446 return sio_hw->gpio_in;
447}
448
449// ----------------------------------------------------------------------------
450// Output
451// ----------------------------------------------------------------------------
452
458static inline void gpio_set_mask(uint32_t mask) {
459 sio_hw->gpio_set = mask;
460}
461
467static inline void gpio_clr_mask(uint32_t mask) {
468 sio_hw->gpio_clr = mask;
469}
470
476static inline void gpio_xor_mask(uint32_t mask) {
477 sio_hw->gpio_togl = mask;
478}
479
491static inline void gpio_put_masked(uint32_t mask, uint32_t value) {
492 sio_hw->gpio_togl = (sio_hw->gpio_out ^ value) & mask;
493}
494
500static inline void gpio_put_all(uint32_t value) {
501 sio_hw->gpio_out = value;
502}
503
510static inline void gpio_put(uint gpio, bool value) {
511 uint32_t mask = 1ul << gpio;
512 if (value)
513 gpio_set_mask(mask);
514 else
515 gpio_clr_mask(mask);
516}
517
534static inline bool gpio_get_out_level(uint gpio) {
535 return !!(sio_hw->gpio_out & (1u << gpio));
536}
537
538// ----------------------------------------------------------------------------
539// Direction
540// ----------------------------------------------------------------------------
541
549static inline void gpio_set_dir_out_masked(uint32_t mask) {
550 sio_hw->gpio_oe_set = mask;
551}
552
558static inline void gpio_set_dir_in_masked(uint32_t mask) {
559 sio_hw->gpio_oe_clr = mask;
560}
561
573static inline void gpio_set_dir_masked(uint32_t mask, uint32_t value) {
574 sio_hw->gpio_oe_togl = (sio_hw->gpio_oe ^ value) & mask;
575}
576
582static inline void gpio_set_dir_all_bits(uint32_t values) {
583 sio_hw->gpio_oe = values;
584}
585
592static inline void gpio_set_dir(uint gpio, bool out) {
593 uint32_t mask = 1ul << gpio;
594 if (out)
596 else
598}
599
606static inline bool gpio_is_dir_out(uint gpio) {
607 return !!(sio_hw->gpio_oe & (1u << (gpio)));
608}
609
616static inline uint gpio_get_dir(uint gpio) {
617 return gpio_is_dir_out(gpio); // note GPIO_OUT is 1/true and GPIO_IN is 0/false anyway
618}
619
620extern void gpio_debug_pins_init(void);
621
622#ifdef __cplusplus
623}
624#endif
625
626
627// PICO_CONFIG: PICO_DEBUG_PIN_BASE, First pin to use for debug output (if enabled), min=0, max=28, default=19, group=hardware_gpio
628#ifndef PICO_DEBUG_PIN_BASE
629#define PICO_DEBUG_PIN_BASE 19u
630#endif
631
632// PICO_CONFIG: PICO_DEBUG_PIN_COUNT, Number of pins to use for debug output (if enabled), min=1, max=28, default=3, group=hardware_gpio
633#ifndef PICO_DEBUG_PIN_COUNT
634#define PICO_DEBUG_PIN_COUNT 3u
635#endif
636
637#ifndef __cplusplus
638// note these two macros may only be used once per and only apply per compilation unit (hence the CU_)
639#define CU_REGISTER_DEBUG_PINS(...) enum __unused DEBUG_PIN_TYPE { _none = 0, __VA_ARGS__ }; static enum DEBUG_PIN_TYPE __selected_debug_pins;
640#define CU_SELECT_DEBUG_PINS(x) static enum DEBUG_PIN_TYPE __selected_debug_pins = (x);
641#define DEBUG_PINS_ENABLED(p) (__selected_debug_pins == (p))
642#else
643#define CU_REGISTER_DEBUG_PINS(p...) \
644 enum DEBUG_PIN_TYPE { _none = 0, p }; \
645 template <enum DEBUG_PIN_TYPE> class __debug_pin_settings { \
646 public: \
647 static inline bool enabled() { return false; } \
648 };
649#define CU_SELECT_DEBUG_PINS(x) template<> inline bool __debug_pin_settings<x>::enabled() { return true; };
650#define DEBUG_PINS_ENABLED(p) (__debug_pin_settings<p>::enabled())
651#endif
652#define DEBUG_PINS_SET(p, v) if (DEBUG_PINS_ENABLED(p)) gpio_set_mask((unsigned)(v)<<PICO_DEBUG_PIN_BASE)
653#define DEBUG_PINS_CLR(p, v) if (DEBUG_PINS_ENABLED(p)) gpio_clr_mask((unsigned)(v)<<PICO_DEBUG_PIN_BASE)
654#define DEBUG_PINS_XOR(p, v) if (DEBUG_PINS_ENABLED(p)) gpio_xor_mask((unsigned)(v)<<PICO_DEBUG_PIN_BASE)
655
656#endif // _GPIO_H_
static bool gpio_get_out_level(uint gpio)
Determine whether a GPIO is currently driven high or low.
Definition: gpio.h:534
void gpio_set_drive_strength(uint gpio, enum gpio_drive_strength drive)
Set drive strength for a specified GPIO.
Definition: gpio.c:62
enum gpio_drive_strength gpio_get_drive_strength(uint gpio)
Determine current slew rate for a specified GPIO.
Definition: gpio.c:66
void gpio_set_input_hysteresis_enabled(uint gpio, bool enabled)
Enable/disable GPIO input hysteresis (Schmitt trigger)
Definition: gpio.c:46
void gpio_set_oeover(uint gpio, uint value)
Select GPIO output enable override.
Definition: gpio.c:42
static uint gpio_get_dir(uint gpio)
Get a specific GPIO direction.
Definition: gpio.h:616
void gpio_init_mask(uint gpio_mask)
Initialise multiple GPIOs (enabled I/O and set func to GPIO_FUNC_SIO)
Definition: gpio.c:145
static void gpio_pull_up(uint gpio)
Set specified GPIO to be pulled up.
Definition: gpio.h:206
enum gpio_slew_rate gpio_get_slew_rate(uint gpio)
Determine current slew rate for a specified GPIO.
Definition: gpio.c:58
static void gpio_set_dir_all_bits(uint32_t values)
Set direction of all pins simultaneously.
Definition: gpio.h:582
static bool gpio_is_pulled_down(uint gpio)
Determine if the specified GPIO is pulled down.
Definition: gpio.h:235
void gpio_set_irq_enabled_with_callback(uint gpio, uint32_t events, bool enabled, gpio_irq_callback_t callback)
Enable interrupts for specified GPIO.
Definition: gpio.c:179
void gpio_set_inover(uint gpio, uint value)
Select GPIO input override.
Definition: gpio.c:38
gpio_irq_level
GPIO Interrupt level definitions.
Definition: gpio.h:120
static void gpio_xor_mask(uint32_t mask)
Toggle every GPIO appearing in mask.
Definition: gpio.h:476
static void gpio_set_dir(uint gpio, bool out)
Set a single GPIO direction.
Definition: gpio.h:592
static void gpio_clr_mask(uint32_t mask)
Drive low every GPIO appearing in mask.
Definition: gpio.h:467
static void gpio_put(uint gpio, bool value)
Drive a single GPIO high/low.
Definition: gpio.h:510
void(* gpio_irq_callback_t)(uint gpio, uint32_t events)
Definition: gpio.h:134
void gpio_set_input_enabled(uint gpio, bool enabled)
Enable GPIO input.
Definition: gpio.c:141
static void gpio_set_dir_in_masked(uint32_t mask)
Set a number of GPIOs to input.
Definition: gpio.h:558
static void gpio_put_all(uint32_t value)
Drive all pins simultaneously.
Definition: gpio.h:500
static void gpio_set_dir_out_masked(uint32_t mask)
Set a number of GPIOs to output.
Definition: gpio.h:549
void gpio_set_outover(uint gpio, uint value)
Set GPIO output override.
Definition: gpio.c:34
void gpio_init(uint gpio)
Initialise a GPIO for (enabled I/O and set func to GPIO_FUNC_SIO)
Definition: gpio.c:79
void gpio_set_irqover(uint gpio, uint value)
Set GPIO IRQ override.
Definition: gpio.c:30
void gpio_set_irq_enabled(uint gpio, uint32_t events, bool enabled)
Enable or disable interrupts for specified GPIO.
Definition: gpio.c:71
static bool gpio_is_dir_out(uint gpio)
Check if a specific GPIO direction is OUT.
Definition: gpio.h:606
static void gpio_set_dir_masked(uint32_t mask, uint32_t value)
Set multiple GPIO directions.
Definition: gpio.h:573
void gpio_set_function(uint gpio, enum gpio_function fn)
Select GPIO function.
Definition: gpio.c:10
void gpio_set_pulls(uint gpio, bool up, bool down)
Select up and down pulls on specific GPIO.
Definition: gpio.c:26
enum gpio_function gpio_get_function(uint gpio)
Determine current GPIO function.
Definition: gpio.c:44
bool gpio_is_input_hysteresis_enabled(uint gpio)
Determine whether input hysteresis is enabled on a specified GPIO.
Definition: gpio.c:50
static bool gpio_is_pulled_up(uint gpio)
Determine if the specified GPIO is pulled up.
Definition: gpio.h:216
static void gpio_put_masked(uint32_t mask, uint32_t value)
Drive GPIO high/low depending on parameters.
Definition: gpio.h:491
static void gpio_disable_pulls(uint gpio)
Disable pulls on specified GPIO.
Definition: gpio.h:244
static uint32_t gpio_get_all(void)
Get raw value of all GPIOs.
Definition: gpio.h:445
static void gpio_pull_down(uint gpio)
Set specified GPIO to be pulled down.
Definition: gpio.h:225
void gpio_set_slew_rate(uint gpio, enum gpio_slew_rate slew)
Set slew rate for a specified GPIO.
Definition: gpio.c:54
static bool gpio_get(uint gpio)
Get state of a single specified GPIO.
Definition: gpio.h:436
static void gpio_set_mask(uint32_t mask)
Drive high every GPIO appearing in mask.
Definition: gpio.h:458
void gpio_acknowledge_irq(uint gpio, uint32_t events)
Acknowledge a GPIO interrupt.
Definition: gpio.c:75
void gpio_set_dormant_irq_enabled(uint gpio, uint32_t events, bool enabled)
Enable dormant wake up interrupt for specified GPIO.
Definition: gpio.c:189
@ GPIO_DRIVE_STRENGTH_2MA
2 mA nominal drive strength
Definition: gpio.h:36
@ GPIO_DRIVE_STRENGTH_8MA
8 mA nominal drive strength
Definition: gpio.h:38
@ GPIO_DRIVE_STRENGTH_12MA
12 mA nominal drive strength
Definition: gpio.h:39
@ GPIO_DRIVE_STRENGTH_4MA
4 mA nominal drive strength
Definition: gpio.h:37
@ GPIO_SLEW_RATE_FAST
Slew rate limiting disabled.
Definition: gpio.h:32
@ GPIO_SLEW_RATE_SLOW
Slew rate limiting enabled.
Definition: gpio.h:31
gpio_override
Definition: gpio.h:136
@ GPIO_OVERRIDE_INVERT
invert peripheral signal selected via gpio_set_function
Definition: gpio.h:138
@ GPIO_OVERRIDE_HIGH
drive high/enable output
Definition: gpio.h:140
@ GPIO_OVERRIDE_LOW
drive low/disable output
Definition: gpio.h:139
@ GPIO_OVERRIDE_NORMAL
peripheral signal selected via gpio_set_function
Definition: gpio.h:137