Update tca6408.h

This commit is contained in:
Dave Williams | DitroniX | G8PUO
2026-06-13 09:23:50 +01:00
committed by GitHub
parent 3863d71791
commit a9d76de4e4
+12 -19
View File
@@ -9,14 +9,13 @@ namespace esphome {
namespace tca6408 { namespace tca6408 {
/** /**
* TCA6408 8-bit I²C I/O Expander Component * TCA6408 8-bit I²C I/O Expander
* *
* Features: * Supports:
* - 8 bidirectional GPIO pins (0-7) * - 8 bidirectional pins
* - Hardware polarity inversion (for inputs) * - Hardware polarity inversion for inputs
* - Interrupt support (active-low open-drain INT pin) * - Interrupt-driven inputs (active-low open-drain INT)
* - Cached GPIO access for efficiency * - Efficient cached access
* - Works with ESP32 (including C5), ESP8266, etc.
*/ */
class TCA6408Component : public Component, class TCA6408Component : public Component,
public i2c::I2CDevice, public i2c::I2CDevice,
@@ -27,32 +26,26 @@ class TCA6408Component : public Component,
void dump_config() override; void dump_config() override;
float get_setup_priority() const override { return setup_priority::IO; } float get_setup_priority() const override { return setup_priority::IO; }
/** Set I²C address (default 0x20) */
void set_address(uint8_t address) { this->address_ = address; } void set_address(uint8_t address) { this->address_ = address; }
/** Set ESP GPIO connected to TCA6408 INT pin (recommended) */
void set_interrupt_pin(InternalGPIOPin *pin) { this->interrupt_pin_ = pin; } void set_interrupt_pin(InternalGPIOPin *pin) { this->interrupt_pin_ = pin; }
/** Set hardware polarity inversion for a specific pin (used internally) */
void set_polarity_inversion(uint8_t pin, bool inverted); void set_polarity_inversion(uint8_t pin, bool inverted);
protected: protected:
/** Interrupt Service Routine - lightweight, runs in ISR context */
static void IRAM_ATTR gpio_intr(TCA6408Component *arg); static void IRAM_ATTR gpio_intr(TCA6408Component *arg);
// GPIO Expander overrides
bool digital_read_hw(uint8_t pin) override; bool digital_read_hw(uint8_t pin) override;
bool digital_read_cache(uint8_t pin) override; bool digital_read_cache(uint8_t pin) override;
void digital_write_hw(uint8_t pin, bool value) override; void digital_write_hw(uint8_t pin, bool value) override;
void pin_mode(uint8_t pin, gpio::Flags flags) override; void pin_mode(uint8_t pin, gpio::Flags flags) override;
uint8_t mode_mask_{0xFF}; // 1 = input, 0 = output (Config Register 0x03) uint8_t mode_mask_{0xFF}; // 1 = input, 0 = output
uint8_t output_mask_{0x00}; // Output Port Register 0x01 uint8_t output_mask_{0x00};
uint8_t input_mask_{0x00}; // Input Port Register 0x00 uint8_t input_mask_{0x00};
uint8_t polarity_mask_{0x00}; // Polarity Inversion Register 0x02 (1 = inverted) uint8_t polarity_mask_{0x00}; // Hardware polarity inversion
InternalGPIOPin *interrupt_pin_{nullptr}; // ESP pin connected to TCA6408 INT InternalGPIOPin *interrupt_pin_{nullptr};
bool interrupt_triggered_{false}; // Flag set by ISR bool interrupt_triggered_{false};
private: private:
bool read_gpio_outputs_(); bool read_gpio_outputs_();