mirror of
https://github.com/esphome/esphome.git
synced 2025-07-29 06:36:45 +00:00
[esp8266] fix isr pin (#8981)
Co-authored-by: Samuel Sieb <samuel@sieb.net>
This commit is contained in:
parent
e2093c34da
commit
acb1532e34
@ -40,6 +40,7 @@ struct ISRPinArg {
|
|||||||
volatile uint32_t *mode_set_reg;
|
volatile uint32_t *mode_set_reg;
|
||||||
volatile uint32_t *mode_clr_reg;
|
volatile uint32_t *mode_clr_reg;
|
||||||
volatile uint32_t *func_reg;
|
volatile uint32_t *func_reg;
|
||||||
|
volatile uint32_t *control_reg;
|
||||||
uint32_t mask;
|
uint32_t mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -54,6 +55,7 @@ ISRInternalGPIOPin ESP8266GPIOPin::to_isr() const {
|
|||||||
arg->mode_set_reg = &GPES;
|
arg->mode_set_reg = &GPES;
|
||||||
arg->mode_clr_reg = &GPEC;
|
arg->mode_clr_reg = &GPEC;
|
||||||
arg->func_reg = &GPF(this->pin_);
|
arg->func_reg = &GPF(this->pin_);
|
||||||
|
arg->control_reg = &GPC(this->pin_);
|
||||||
arg->mask = 1 << this->pin_;
|
arg->mask = 1 << this->pin_;
|
||||||
} else {
|
} else {
|
||||||
arg->in_reg = &GP16I;
|
arg->in_reg = &GP16I;
|
||||||
@ -62,6 +64,7 @@ ISRInternalGPIOPin ESP8266GPIOPin::to_isr() const {
|
|||||||
arg->mode_set_reg = &GP16E;
|
arg->mode_set_reg = &GP16E;
|
||||||
arg->mode_clr_reg = nullptr;
|
arg->mode_clr_reg = nullptr;
|
||||||
arg->func_reg = &GPF16;
|
arg->func_reg = &GPF16;
|
||||||
|
arg->control_reg = nullptr;
|
||||||
arg->mask = 1;
|
arg->mask = 1;
|
||||||
}
|
}
|
||||||
return ISRInternalGPIOPin((void *) arg);
|
return ISRInternalGPIOPin((void *) arg);
|
||||||
@ -143,11 +146,17 @@ void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) {
|
|||||||
if (arg->pin < 16) {
|
if (arg->pin < 16) {
|
||||||
if (flags & gpio::FLAG_OUTPUT) {
|
if (flags & gpio::FLAG_OUTPUT) {
|
||||||
*arg->mode_set_reg = arg->mask;
|
*arg->mode_set_reg = arg->mask;
|
||||||
} else {
|
if (flags & gpio::FLAG_OPEN_DRAIN) {
|
||||||
|
*arg->control_reg |= 1 << GPCD;
|
||||||
|
} else {
|
||||||
|
*arg->control_reg &= ~(1 << GPCD);
|
||||||
|
}
|
||||||
|
} else if (flags & gpio::FLAG_INPUT) {
|
||||||
*arg->mode_clr_reg = arg->mask;
|
*arg->mode_clr_reg = arg->mask;
|
||||||
}
|
}
|
||||||
if (flags & gpio::FLAG_PULLUP) {
|
if (flags & gpio::FLAG_PULLUP) {
|
||||||
*arg->func_reg |= 1 << GPFPU;
|
*arg->func_reg |= 1 << GPFPU;
|
||||||
|
*arg->control_reg |= 1 << GPCD;
|
||||||
} else {
|
} else {
|
||||||
*arg->func_reg &= ~(1 << GPFPU);
|
*arg->func_reg &= ~(1 << GPFPU);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user