diff --git a/components/esp_hal_gpio/esp32s2/include/hal/gpio_ll.h b/components/esp_hal_gpio/esp32s2/include/hal/gpio_ll.h index a8b96ec973..b54c426a74 100644 --- a/components/esp_hal_gpio/esp32s2/include/hal/gpio_ll.h +++ b/components/esp_hal_gpio/esp32s2/include/hal/gpio_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -474,7 +474,12 @@ static inline void gpio_ll_hold_dis(gpio_dev_t *hw, uint32_t gpio_num) __attribute__((always_inline)) static inline bool gpio_ll_is_digital_io_hold(gpio_dev_t *hw, uint32_t gpio_num) { - return GET_PERI_REG_MASK(RTC_CNTL_DIG_PAD_HOLD_REG, BIT(gpio_num - 21)); + uint64_t bit_mask = 1ULL << gpio_num; + if (!(bit_mask & SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK)) { + // GPIO 0-21 are not digital IO pads, 22-25 does not exist + abort(); + } + return GET_PERI_REG_MASK(RTC_CNTL_DIG_PAD_HOLD_REG, bit_mask >> 21); } /** diff --git a/components/esp_hal_gpio/esp32s3/include/hal/gpio_ll.h b/components/esp_hal_gpio/esp32s3/include/hal/gpio_ll.h index 7c021b6a2d..81096a97f4 100644 --- a/components/esp_hal_gpio/esp32s3/include/hal/gpio_ll.h +++ b/components/esp_hal_gpio/esp32s3/include/hal/gpio_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -22,6 +22,7 @@ #include "soc/usb_serial_jtag_reg.h" #include "soc/gpio_periph.h" #include "hal/gpio_types.h" +#include "hal/assert.h" // Get GPIO hardware instance with giving gpio num #define GPIO_LL_GET_HW(num) (((num) == 0) ? (&GPIO) : NULL) @@ -475,7 +476,12 @@ static inline void gpio_ll_hold_dis(gpio_dev_t *hw, uint32_t gpio_num) __attribute__((always_inline)) static inline bool gpio_ll_is_digital_io_hold(gpio_dev_t *hw, uint32_t gpio_num) { - return GET_PERI_REG_MASK(RTC_CNTL_DIG_PAD_HOLD_REG, BIT(gpio_num - 21)); + uint64_t bit_mask = 1ULL << gpio_num; + if (!(bit_mask & SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK)) { + // GPIO 0-21 are not digital IO pads, 22-25 does not exist + abort(); + } + return GET_PERI_REG_MASK(RTC_CNTL_DIG_PAD_HOLD_REG, bit_mask >> 21); } /** diff --git a/components/esp_hal_gpio/include/hal/gpio_types.h b/components/esp_hal_gpio/include/hal/gpio_types.h index 164904b1cc..f651ba3d79 100644 --- a/components/esp_hal_gpio/include/hal/gpio_types.h +++ b/components/esp_hal_gpio/include/hal/gpio_types.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -16,15 +16,15 @@ extern "C" { #endif -#define GPIO_PIN_COUNT (SOC_GPIO_PIN_COUNT) +#define GPIO_PIN_COUNT (SOC_GPIO_PIN_COUNT) /// Check whether it is a valid GPIO number -#define GPIO_IS_VALID_GPIO(gpio_num) ((gpio_num >= 0) && (gpio_num <= (SOC_GPIO_PIN_COUNT - 1)) && \ - (((1ULL << (gpio_num)) & SOC_GPIO_VALID_GPIO_MASK) != 0)) +#define GPIO_IS_VALID_GPIO(gpio_num) ((gpio_num >= 0) && (gpio_num < SOC_GPIO_PIN_COUNT) && \ + (((1ULL << (gpio_num)) & SOC_GPIO_VALID_GPIO_MASK) != 0)) /// Check whether it can be a valid GPIO number of output mode -#define GPIO_IS_VALID_OUTPUT_GPIO(gpio_num) ((gpio_num >= 0) && (gpio_num <= SOC_GPIO_OUT_RANGE_MAX) && \ - (((1ULL << (gpio_num)) & SOC_GPIO_VALID_OUTPUT_GPIO_MASK) != 0)) +#define GPIO_IS_VALID_OUTPUT_GPIO(gpio_num) ((gpio_num >= 0) && (gpio_num < SOC_GPIO_PIN_COUNT) && \ + (((1ULL << (gpio_num)) & SOC_GPIO_VALID_OUTPUT_GPIO_MASK) != 0)) /// Check whether it can be a valid digital I/O pad -#define GPIO_IS_VALID_DIGITAL_IO_PAD(gpio_num) ((gpio_num >= 0) && \ +#define GPIO_IS_VALID_DIGITAL_IO_PAD(gpio_num) ((gpio_num >= 0) && (gpio_num < SOC_GPIO_PIN_COUNT) && \ (((1ULL << (gpio_num)) & SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK) != 0)) typedef enum {