9static const char *
const TAG =
"esp8266";
11static int flags_to_mode(
gpio::Flags flags, uint8_t pin) {
26 return INPUT_PULLDOWN_16;
28 return OUTPUT_OPEN_DRAIN;
37 volatile uint32_t *in_reg;
38 volatile uint32_t *out_set_reg;
39 volatile uint32_t *out_clr_reg;
40 volatile uint32_t *mode_set_reg;
41 volatile uint32_t *mode_clr_reg;
42 volatile uint32_t *func_reg;
43 volatile uint32_t *control_reg;
48 auto *arg =
new ISRPinArg{};
49 arg->pin = this->
pin_;
51 if (this->
pin_ < 16) {
53 arg->out_set_reg = &GPOS;
54 arg->out_clr_reg = &GPOC;
55 arg->mode_set_reg = &GPES;
56 arg->mode_clr_reg = &GPEC;
57 arg->func_reg = &GPF(this->
pin_);
58 arg->control_reg = &GPC(this->
pin_);
59 arg->mask = 1 << this->
pin_;
62 arg->out_set_reg = &GP16O;
63 arg->out_clr_reg =
nullptr;
64 arg->mode_set_reg = &GP16E;
65 arg->mode_clr_reg =
nullptr;
66 arg->func_reg = &GPF16;
67 arg->control_reg =
nullptr;
74 uint8_t arduino_mode = 0;
77 arduino_mode =
inverted_ ? FALLING : RISING;
80 arduino_mode =
inverted_ ? RISING : FALLING;
83 arduino_mode = CHANGE;
86 arduino_mode =
inverted_ ? ONHIGH : ONLOW;
89 arduino_mode =
inverted_ ? ONLOW : ONHIGH;
93 attachInterruptArg(
pin_, func, arg, arduino_mode);
96 pinMode(
pin_, flags_to_mode(flags,
pin_));
101 snprintf(buffer,
sizeof(buffer),
"GPIO%u",
pin_);
115using namespace esp8266;
118 auto *arg =
reinterpret_cast<ISRPinArg *
>(this->
arg_);
119 return bool(*arg->in_reg & arg->mask) != arg->inverted;
123 auto *arg =
reinterpret_cast<ISRPinArg *
>(
arg_);
125 if (value != arg->inverted) {
126 *arg->out_set_reg = arg->mask;
128 *arg->out_clr_reg = arg->mask;
131 if (value != arg->inverted) {
132 *arg->out_set_reg |= 1;
134 *arg->out_set_reg &= ~1;
140 auto *arg =
reinterpret_cast<ISRPinArg *
>(
arg_);
141 GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, 1UL << arg->pin);
145 auto *arg =
reinterpret_cast<ISRPinArg *
>(this->
arg_);
148 *arg->mode_set_reg = arg->mask;
150 *arg->control_reg |= 1 << GPCD;
152 *arg->control_reg &= ~(1 << GPCD);
155 *arg->mode_clr_reg = arg->mask;
158 *arg->func_reg |= 1 << GPFPU;
159 *arg->control_reg |= 1 << GPCD;
161 *arg->func_reg &= ~(1 << GPFPU);
165 *arg->mode_set_reg |= 1;
167 *arg->mode_set_reg &= ~1;
170 *arg->func_reg |= 1 << GP16FPD;
172 *arg->func_reg &= ~(1 << GP16FPD);
Copy of GPIOPin that is safe to use from ISRs (with no virtual functions)
void digital_write(bool value)
void pin_mode(gpio::Flags flags)
bool digital_read() override
ISRInternalGPIOPin to_isr() const override
void digital_write(bool value) override
void attach_interrupt(void(*func)(void *), void *arg, gpio::InterruptType type) const override
std::string dump_summary() const override
void detach_interrupt() const override
void pin_mode(gpio::Flags flags) override
Providing packet encoding functions for exchanging data with a remote host.