diff --git a/components/TCA6408/tca6408.h b/components/TCA6408/tca6408.h index 9c45dd4..aad0014 100644 --- a/components/TCA6408/tca6408.h +++ b/components/TCA6408/tca6408.h @@ -8,6 +8,16 @@ namespace esphome { namespace tca6408 { +/** + * TCA6408 8-bit I²C I/O Expander Component + * + * Features: + * - 8 bidirectional GPIO pins (0-7) + * - Hardware polarity inversion (for inputs) + * - Interrupt support (active-low open-drain INT pin) + * - Cached GPIO access for efficiency + * - Works with ESP32 (including C5), ESP8266, etc. + */ class TCA6408Component : public Component, public i2c::I2CDevice, public gpio_expander::CachedGpioExpander { @@ -17,26 +27,32 @@ class TCA6408Component : public Component, void dump_config() override; 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; } + + /** Set ESP GPIO connected to TCA6408 INT pin (recommended) */ 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); protected: + /** Interrupt Service Routine - lightweight, runs in ISR context */ static void IRAM_ATTR gpio_intr(TCA6408Component *arg); + // GPIO Expander overrides bool digital_read_hw(uint8_t pin) override; bool digital_read_cache(uint8_t pin) override; void digital_write_hw(uint8_t pin, bool value) override; void pin_mode(uint8_t pin, gpio::Flags flags) override; - uint8_t mode_mask_{0xFF}; // 1 = input, 0 = output - uint8_t output_mask_{0x00}; - uint8_t input_mask_{0x00}; - uint8_t polarity_mask_{0x00}; // 1 = inverted (hardware polarity for inputs) + uint8_t mode_mask_{0xFF}; // 1 = input, 0 = output (Config Register 0x03) + uint8_t output_mask_{0x00}; // Output Port Register 0x01 + uint8_t input_mask_{0x00}; // Input Port Register 0x00 + uint8_t polarity_mask_{0x00}; // Polarity Inversion Register 0x02 (1 = inverted) - InternalGPIOPin *interrupt_pin_{nullptr}; - bool interrupt_triggered_{false}; + InternalGPIOPin *interrupt_pin_{nullptr}; // ESP pin connected to TCA6408 INT + bool interrupt_triggered_{false}; // Flag set by ISR private: bool read_gpio_outputs_(); @@ -62,4 +78,4 @@ class TCA6408GPIOPin : public gpio::GPIOPin, public Parented { }; } // namespace tca6408 -} // namespace esphome \ No newline at end of file +} // namespace esphome