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:
J. Nick Koston
2026-04-04 09:44:59 -10:00
parent d1e737280f
commit 8234512a89
3 changed files with 17 additions and 0 deletions
@@ -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"