ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
gpio.cpp
Go to the documentation of this file.
1#ifdef USE_RP2
2
3#include "gpio.h"
4#include "esphome/core/hal.h"
5#include "esphome/core/log.h"
6
7namespace esphome {
8namespace rp2 {
9
10ESPHOME_LOG_TAG(TAG, "rp2");
11
12static int flags_to_mode(gpio::Flags flags, uint8_t pin) {
13 flags =
15 if (flags == gpio::FLAG_INPUT) { // NOLINT(bugprone-branch-clone)
16 return INPUT;
17 } else if (flags == gpio::FLAG_OUTPUT) {
18 return OUTPUT;
19 } else if (flags == (gpio::FLAG_INPUT | gpio::FLAG_PULLUP)) {
20 return INPUT_PULLUP;
21 } else if (flags == (gpio::FLAG_INPUT | gpio::FLAG_PULLDOWN)) {
22 return INPUT_PULLDOWN;
23 // } else if (flags == (gpio::FLAG_OUTPUT | gpio::FLAG_OPEN_DRAIN)) {
24 // return OpenDrain;
25 } else {
26 return 0;
27 }
28}
29
30struct ISRPinArg {
31 uint32_t mask;
32 uint8_t pin;
33 bool inverted;
34};
35
37 auto *arg = new ISRPinArg{}; // NOLINT(cppcoreguidelines-owning-memory)
38 arg->pin = this->pin_;
39 arg->inverted = this->inverted_;
40 arg->mask = 1 << this->pin_;
41 return ISRInternalGPIOPin((void *) arg);
42}
43
44void RP2GPIOPin::attach_interrupt_(void (*func)(void *), void *arg, gpio::InterruptType type) const {
45 PinStatus arduino_mode = LOW;
46 switch (type) {
48 arduino_mode = inverted_ ? FALLING : RISING;
49 break;
51 arduino_mode = inverted_ ? RISING : FALLING;
52 break;
54 arduino_mode = CHANGE;
55 break;
57 arduino_mode = inverted_ ? HIGH : LOW;
58 break;
60 arduino_mode = inverted_ ? LOW : HIGH;
61 break;
62 }
63
64 attachInterrupt(pin_, func, arduino_mode, arg);
65}
67 pinMode(pin_, flags_to_mode(flags, pin_)); // NOLINT
68}
69
70size_t RP2GPIOPin::dump_summary(char *buffer, size_t len) const { return snprintf(buffer, len, "GPIO%u", this->pin_); }
71
73 return bool(digitalRead(pin_)) != inverted_; // NOLINT
74}
75void RP2GPIOPin::digital_write(bool value) {
76 digitalWrite(pin_, value != inverted_ ? 1 : 0); // NOLINT
77}
78void RP2GPIOPin::detach_interrupt() const { detachInterrupt(pin_); }
79
80} // namespace rp2
81
82using namespace rp2;
83
84bool IRAM_ATTR ISRInternalGPIOPin::digital_read() {
85 auto *arg = reinterpret_cast<ISRPinArg *>(this->arg_);
86 return bool(sio_hw->gpio_in & arg->mask) != arg->inverted;
87}
88
89void IRAM_ATTR ISRInternalGPIOPin::digital_write(bool value) {
90 auto *arg = reinterpret_cast<ISRPinArg *>(this->arg_);
91 if (value != arg->inverted) {
92 sio_hw->gpio_set = arg->mask;
93 } else {
94 sio_hw->gpio_clr = arg->mask;
95 }
96}
97
99 // TODO: implement
100 // auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
101 // GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, 1UL << arg->pin);
102}
103
105 auto *arg = reinterpret_cast<ISRPinArg *>(this->arg_);
106 if (flags & gpio::FLAG_OUTPUT) {
107 sio_hw->gpio_oe_set = arg->mask;
108 } else if (flags & gpio::FLAG_INPUT) {
109 sio_hw->gpio_oe_clr = arg->mask;
110 hw_write_masked(&pads_bank0_hw->io[arg->pin],
111 (bool_to_bit(flags & gpio::FLAG_PULLUP) << PADS_BANK0_GPIO0_PUE_LSB) |
112 (bool_to_bit(flags & gpio::FLAG_PULLDOWN) << PADS_BANK0_GPIO0_PDE_LSB),
113 PADS_BANK0_GPIO0_PUE_BITS | PADS_BANK0_GPIO0_PDE_BITS);
114 }
115}
116
117} // namespace esphome
118
119#endif // USE_RP2
Copy of GPIOPin that is safe to use from ISRs (with no virtual functions)
Definition gpio_pin.h:98
void digital_write(bool value)
Definition gpio.cpp:227
void pin_mode(gpio::Flags flags)
Definition gpio.cpp:239
void digital_write(bool value) override
Definition gpio.cpp:75
ISRInternalGPIOPin to_isr() const
Definition gpio.cpp:36
bool digital_read() override
Definition gpio.cpp:72
void pin_mode(gpio::Flags flags) override
Definition gpio.cpp:66
void attach_interrupt_(void(*func)(void *), void *arg, gpio::InterruptType type) const
Definition gpio.cpp:44
void detach_interrupt() const
Definition gpio.cpp:78
size_t dump_summary(char *buffer, size_t len) const override
Definition gpio.cpp:70
uint16_t flags
uint8_t type
uint32_t buffer
Definition gif.cpp:50
@ INTERRUPT_FALLING_EDGE
Definition gpio_pin.h:53
@ INTERRUPT_RISING_EDGE
Definition gpio_pin.h:52
@ INTERRUPT_HIGH_LEVEL
Definition gpio_pin.h:56
@ INTERRUPT_LOW_LEVEL
Definition gpio_pin.h:55
@ INTERRUPT_ANY_EDGE
Definition gpio_pin.h:54
ESPHOME_LOG_TAG(TAG, "rp2.crash")
const void size_t len
Definition hal.h:68
static void uint32_t