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