mirror of
https://github.com/esphome/esphome.git
synced 2026-09-15 00:58:40 +00:00
Auto-enable chip-level interrupts for input pins
- MCP23x08/x17: auto-enable CHANGE interrupt mode in pin_mode() when interrupt_pin is configured, so users don't need to manually set interrupt: CHANGE on every pin - PI4IOE5V6408: write interrupt enable mask for input pins in write_gpio_modes_() when interrupt_pin is configured
This commit is contained in:
@@ -32,6 +32,11 @@ void MCP23X08Base::pin_mode(uint8_t pin, gpio::Flags flags) {
|
||||
} else if (flags == gpio::FLAG_OUTPUT) {
|
||||
this->update_reg(pin, false, iodir);
|
||||
}
|
||||
// When interrupt_pin is configured, auto-enable CHANGE interrupt for input pins
|
||||
// so the chip's INT output fires on any input state change
|
||||
if (this->interrupt_pin_ != nullptr && (flags & gpio::FLAG_INPUT)) {
|
||||
this->pin_interrupt_mode(pin, mcp23xxx_base::MCP23XXX_CHANGE);
|
||||
}
|
||||
}
|
||||
|
||||
void MCP23X08Base::pin_interrupt_mode(uint8_t pin, mcp23xxx_base::MCP23XXXInterruptMode interrupt_mode) {
|
||||
|
||||
@@ -44,6 +44,11 @@ void MCP23X17Base::pin_mode(uint8_t pin, gpio::Flags flags) {
|
||||
} else if (flags == gpio::FLAG_OUTPUT) {
|
||||
this->update_reg(pin, false, iodir);
|
||||
}
|
||||
// When interrupt_pin is configured, auto-enable CHANGE interrupt for input pins
|
||||
// so the chip's INT output fires on any input state change
|
||||
if (this->interrupt_pin_ != nullptr && (flags & gpio::FLAG_INPUT)) {
|
||||
this->pin_interrupt_mode(pin, mcp23xxx_base::MCP23XXX_CHANGE);
|
||||
}
|
||||
}
|
||||
|
||||
void MCP23X17Base::pin_interrupt_mode(uint8_t pin, mcp23xxx_base::MCP23XXXInterruptMode interrupt_mode) {
|
||||
|
||||
@@ -156,6 +156,13 @@ bool PI4IOE5V6408Component::write_gpio_modes_() {
|
||||
this->status_set_warning(LOG_STR("Failed to write GPIO pull enable"));
|
||||
return false;
|
||||
}
|
||||
// Enable interrupts for input pins when interrupt pin is configured
|
||||
// (input pins have mode_mask_ bit cleared)
|
||||
if (this->interrupt_pin_ != nullptr &&
|
||||
!this->write_byte(PI4IOE5V6408_REGISTER_INTERRUPT_ENABLE_MASK, ~this->mode_mask_)) {
|
||||
this->status_set_warning(LOG_STR("Failed to write interrupt enable mask"));
|
||||
return false;
|
||||
}
|
||||
#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
|
||||
ESP_LOGV(TAG,
|
||||
"Wrote GPIO config:\n"
|
||||
|
||||
Reference in New Issue
Block a user