ESPHome 2026.5.0b1
Loading...
Searching...
No Matches
gpio.h
Go to the documentation of this file.
1#pragma once
2
3#ifdef USE_ESP32
4#include "esphome/core/hal.h"
5#include <driver/gpio.h>
6
7namespace esphome::esp32 {
8
9// Static assertions to ensure our bit-packed fields can hold the enum values
10static_assert(GPIO_NUM_MAX <= 256, "gpio_num_t has too many values for uint8_t");
11static_assert(GPIO_DRIVE_CAP_MAX <= 4, "gpio_drive_cap_t has too many values for 2-bit field");
12
14 public:
15 void set_pin(gpio_num_t pin) { this->pin_ = static_cast<uint8_t>(pin); }
16 void set_inverted(bool inverted) { this->pin_flags_.inverted = inverted; }
17 void set_drive_strength(gpio_drive_cap_t drive_strength) {
18 this->pin_flags_.drive_strength = static_cast<uint8_t>(drive_strength);
19 }
21
22 void setup() override;
23 void pin_mode(gpio::Flags flags) override;
24 bool digital_read() override;
25 void digital_write(bool value) override;
26 size_t dump_summary(char *buffer, size_t len) const override;
27 void detach_interrupt() const override;
28 ISRInternalGPIOPin to_isr() const override;
29 uint8_t get_pin() const override { return this->pin_; }
30 gpio::Flags get_flags() const override { return this->flags_; }
31 bool is_inverted() const override { return this->pin_flags_.inverted; }
32 gpio_num_t get_pin_num() const { return static_cast<gpio_num_t>(this->pin_); }
33 gpio_drive_cap_t get_drive_strength() const { return static_cast<gpio_drive_cap_t>(this->pin_flags_.drive_strength); }
34
35 protected:
36 void attach_interrupt(void (*func)(void *), void *arg, gpio::InterruptType type) const override;
37
38 // Memory layout: 8 bytes total on 32-bit systems
39 // - 3 bytes for members below
40 // - 1 byte padding for alignment
41 // - 4 bytes for vtable pointer
42 uint8_t pin_; // GPIO pin number (0-255, actual max ~54 on ESP32)
43 gpio::Flags flags_{}; // GPIO flags (1 byte)
44 struct PinFlags {
45 uint8_t inverted : 1; // Invert pin logic (1 bit)
46 uint8_t drive_strength : 2; // Drive strength 0-3 (2 bits)
47 uint8_t reserved : 5; // Reserved for future use (5 bits)
48 } pin_flags_{}; // Total: 1 byte
49 // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
51};
52
53} // namespace esphome::esp32
54
55#endif // USE_ESP32
Copy of GPIOPin that is safe to use from ISRs (with no virtual functions)
Definition gpio.h:92
void set_inverted(bool inverted)
Definition gpio.h:16
uint8_t get_pin() const override
Definition gpio.h:29
void set_pin(gpio_num_t pin)
Definition gpio.h:15
gpio_num_t get_pin_num() const
Definition gpio.h:32
struct esphome::esp32::ESP32InternalGPIOPin::PinFlags pin_flags_
void attach_interrupt(void(*func)(void *), void *arg, gpio::InterruptType type) const override
Definition gpio.cpp:68
gpio::Flags get_flags() const override
Definition gpio.h:30
void set_drive_strength(gpio_drive_cap_t drive_strength)
Definition gpio.h:17
gpio_drive_cap_t get_drive_strength() const
Definition gpio.h:33
bool is_inverted() const override
Definition gpio.h:31
void detach_interrupt() const override
Definition gpio.cpp:137
ISRInternalGPIOPin to_isr() const override
Definition gpio.cpp:55
void set_flags(gpio::Flags flags)
Definition gpio.h:20
void pin_mode(gpio::Flags flags) override
Definition gpio.cpp:117
void digital_write(bool value) override
Definition gpio.cpp:134
size_t dump_summary(char *buffer, size_t len) const override
Definition gpio.cpp:100
uint16_t type
uint16_t flags
std::string size_t len