feat(gpio): support glitch filter on esp32s31

This commit is contained in:
morris
2026-04-08 15:07:27 +08:00
parent 25d8f3c269
commit b79cf6d8eb
25 changed files with 79 additions and 18 deletions
@@ -35,7 +35,7 @@ struct gpio_flex_glitch_filter_t {
};
static gpio_flex_glitch_filter_group_t s_gpio_glitch_filter_group = {
.hw = &GLITCH_FILTER,
.hw = GPIO_LL_GLITCH_FILTER_GET_HW(),
.spinlock = portMUX_INITIALIZER_UNLOCKED,
};
@@ -17,6 +17,7 @@
#include "soc/gpio_ext_struct.h"
#include "soc/gpio_ext_reg.h"
#define GPIO_LL_GLITCH_FILTER_GET_HW() ((gpio_glitch_filter_dev_t *)(void *)&GPIO_EXT.glitch_filter)
#define GPIO_LL_GLITCH_FILTER_MAX_WINDOW (GPIO_EXT_FILTER_CH0_WINDOW_WIDTH_V + 1)
#ifdef __cplusplus
@@ -17,6 +17,7 @@
#include "soc/gpio_ext_struct.h"
#include "soc/gpio_ext_reg.h"
#define GPIO_LL_GLITCH_FILTER_GET_HW() ((gpio_glitch_filter_dev_t *)(void *)&GPIO_EXT.glitch_filter)
// the max window size is expected to be 64, but due to a hardware issue, we need to limit it to 63
#define GPIO_LL_GLITCH_FILTER_MAX_WINDOW GPIO_EXT_FILTER_CH0_WINDOW_WIDTH_V
@@ -17,6 +17,7 @@
#include "soc/gpio_ext_struct.h"
#include "soc/gpio_ext_reg.h"
#define GPIO_LL_GLITCH_FILTER_GET_HW() ((gpio_glitch_filter_dev_t *)(void *)&GPIO_EXT.glitch_filter)
// the max window size is expected to be 64, but due to a hardware issue, we need to limit it to 63
#define GPIO_LL_GLITCH_FILTER_MAX_WINDOW GPIO_EXT_FILTER_CH0_WINDOW_WIDTH_V
@@ -11,6 +11,7 @@
#include "soc/gpio_ext_struct.h"
#include "soc/gpio_ext_reg.h"
#define GPIO_LL_GLITCH_FILTER_GET_HW() ((gpio_glitch_filter_dev_t *)(void *)&GPIO_EXT.glitch_filter)
#define GPIO_LL_GLITCH_FILTER_MAX_WINDOW (GPIO_EXT_FILTER_CH0_WINDOW_WIDTH_V + 1)
#ifdef __cplusplus
@@ -11,6 +11,7 @@
#include "soc/gpio_ext_struct.h"
#include "soc/gpio_ext_reg.h"
#define GPIO_LL_GLITCH_FILTER_GET_HW() ((gpio_glitch_filter_dev_t *)(void *)&GPIO_EXT.ext_glitch_filter)
#define GPIO_LL_GLITCH_FILTER_MAX_WINDOW (GPIO_EXT_FILTER_CH0_WINDOW_WIDTH_V + 1)
#ifdef __cplusplus
@@ -11,6 +11,7 @@
#include "soc/gpio_ext_struct.h"
#include "soc/gpio_ext_reg.h"
#define GPIO_LL_GLITCH_FILTER_GET_HW() ((gpio_glitch_filter_dev_t *)(void *)&GPIO_EXT.glitch_filter)
#define GPIO_LL_GLITCH_FILTER_MAX_WINDOW (GPIO_EXT_FILTER_CH0_WINDOW_WIDTH_V + 1)
#ifdef __cplusplus
@@ -0,0 +1,62 @@
/*
* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stdbool.h>
#include "hal/assert.h"
#include "soc/gpio_ext_struct.h"
#include "soc/gpio_ext_reg.h"
#define GPIO_LL_GLITCH_FILTER_GET_HW() ((gpio_glitch_filter_dev_t *)(void *)&GPIO_EXT.glitch_filter)
#define GPIO_LL_GLITCH_FILTER_MAX_WINDOW (GPIO_EXT_FILTER_CH0_WINDOW_WIDTH_V + 1)
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Enable GPIO glitch filter
*
* @param hw Glitch filter register base address
* @param filter_idx Glitch filter index
* @param enable True to enable, false to disable
*/
static inline void gpio_ll_glitch_filter_enable(gpio_glitch_filter_dev_t *hw, uint32_t filter_idx, bool enable)
{
hw->glitch_filter_chn[filter_idx].filter_chn_en = enable;
}
/**
* @brief Set the input GPIO for the glitch filter
*
* @param hw Glitch filter register base address
* @param filter_idx Glitch filter index
* @param gpio_num GPIO number
*/
static inline void gpio_ll_glitch_filter_set_gpio(gpio_glitch_filter_dev_t *hw, uint32_t filter_idx, uint32_t gpio_num)
{
hw->glitch_filter_chn[filter_idx].filter_chn_input_io_num = gpio_num;
}
/**
* @brief Set the coefficient of the glitch filter window
*
* @param hw Glitch filter register base address
* @param filter_idx Glitch filter index
* @param window_width Window width, in IOMUX clock ticks
* @param window_threshold Window threshold, in IOMUX clock ticks
*/
static inline void gpio_ll_glitch_filter_set_window_coeff(gpio_glitch_filter_dev_t *hw, uint32_t filter_idx, uint32_t window_width, uint32_t window_thres)
{
HAL_ASSERT(window_thres <= window_width);
hw->glitch_filter_chn[filter_idx].filter_chn_window_width = window_width - 1;
hw->glitch_filter_chn[filter_idx].filter_chn_window_thres = window_thres - 1;
}
#ifdef __cplusplus
}
#endif
@@ -47,7 +47,6 @@ PROVIDE ( IO_MUX = 0x60090000 );
PROVIDE ( GPIO = 0x60091000 );
PROVIDE ( GPIO_EXT = 0x60091e00 );
PROVIDE ( SDM = 0x60091e00 );
PROVIDE ( GLITCH_FILTER = 0x60091ed8 );
PROVIDE ( GPIO_ETM = 0x60091f18 );
PROVIDE ( MEM_MONITOR = 0x60092000 );
PROVIDE ( PAU = 0x60093000 );
@@ -416,7 +416,6 @@ typedef struct {
} gpio_ext_dev_t;
extern gpio_sd_dev_t SDM;
extern gpio_glitch_filter_dev_t GLITCH_FILTER;
extern gpio_etm_dev_t GPIO_ETM;
extern gpio_ext_dev_t GPIO_EXT;
@@ -48,7 +48,6 @@ PROVIDE ( IO_MUX = 0x60090000 );
PROVIDE ( GPIO = 0x60091000 );
PROVIDE ( GPIO_EXT = 0x60091f00 );
PROVIDE ( SDM = 0x60091f00 );
PROVIDE ( GLITCH_FILTER = 0x60091f30 );
PROVIDE ( GPIO_ETM = 0x60091f60 );
PROVIDE ( MEM_MONITOR = 0x60092000 );
@@ -201,7 +201,6 @@ typedef struct gpio_ext_dev_t {
} gpio_ext_dev_t;
extern gpio_sd_dev_t SDM;
extern gpio_glitch_filter_dev_t GLITCH_FILTER;
extern gpio_etm_dev_t GPIO_ETM;
extern gpio_ext_dev_t GPIO_EXT;
@@ -45,7 +45,6 @@ PROVIDE ( IO_MUX = 0x60090000 );
PROVIDE ( GPIO = 0x60091000 );
PROVIDE ( GPIO_EXT = 0x60091f00 );
PROVIDE ( SDM = 0x60091f00 );
PROVIDE ( GLITCH_FILTER = 0x60091f30 );
PROVIDE ( GPIO_ETM = 0x60091f60 );
PROVIDE ( MEM_ACS_MONITOR = 0x60092000 );
@@ -306,7 +306,6 @@ typedef struct {
} gpio_ext_dev_t;
extern gpio_sd_dev_t SDM;
extern gpio_glitch_filter_dev_t GLITCH_FILTER;
extern gpio_etm_dev_t GPIO_ETM;
extern gpio_ext_dev_t GPIO_EXT;
@@ -40,7 +40,6 @@ PROVIDE ( IO_MUX = 0x60090000 );
PROVIDE ( GPIO = 0x60091000 );
PROVIDE ( GPIO_EXT = 0x60091E00 );
PROVIDE ( SDM = 0x60091E04 );
PROVIDE ( GLITCH_FILTER = 0x60091ED8 );
PROVIDE ( GPIO_ETM = 0x60091F18 );
PROVIDE ( MEM_MONITOR = 0x60092000 );
PROVIDE ( PAU = 0x60093000 );
@@ -592,7 +592,6 @@ typedef struct {
} gpio_ext_dev_t;
extern gpio_sd_dev_t SDM;
extern gpio_glitch_filter_dev_t GLITCH_FILTER;
extern gpio_etm_dev_t GPIO_ETM;
extern gpio_ext_dev_t GPIO_EXT;
@@ -46,7 +46,6 @@ PROVIDE ( IO_MUX = 0x60092000 );
PROVIDE ( GPIO = 0x60093000 );
PROVIDE ( GPIO_EXT = 0x60093E00 );
PROVIDE ( SDM = 0x60093E00 );
PROVIDE ( GLITCH_FILTER = 0x60093ED8 );
PROVIDE ( GPIO_ETM = 0x60093F18 );
PROVIDE ( PCR = 0x60094000 );
PROVIDE ( SPIMEM0 = 0x60098000 );
@@ -271,7 +271,6 @@ typedef struct {
} gpio_ext_dev_t;
extern gpio_sd_dev_t SDM;
extern gpio_glitch_filter_dev_t GLITCH_FILTER;
extern gpio_etm_dev_t GPIO_ETM;
extern gpio_ext_dev_t GPIO_EXT;
@@ -63,7 +63,6 @@ PROVIDE ( ECDSA = 0x50096000 );
PROVIDE ( GPIO = 0x500E0000 );
PROVIDE ( GPIO_EXT = 0x500E0F00 );
PROVIDE ( SDM = 0x500E0F00 );
PROVIDE ( GLITCH_FILTER = 0x500E0F30 );
PROVIDE ( GPIO_ETM = 0x500E0F60 );
PROVIDE ( IO_MUX = 0x500E1000 );
PROVIDE ( MSPI_IOMUX = 0x500E1200 );
@@ -181,7 +181,6 @@ typedef struct {
} gpio_ext_dev_t;
extern gpio_sd_dev_t SDM;
extern gpio_glitch_filter_dev_t GLITCH_FILTER;
extern gpio_etm_dev_t GPIO_ETM;
extern gpio_ext_dev_t GPIO_EXT;
@@ -181,7 +181,6 @@ typedef struct {
} gpio_ext_dev_t;
extern gpio_sd_dev_t SDM;
extern gpio_glitch_filter_dev_t GLITCH_FILTER;
extern gpio_etm_dev_t GPIO_ETM;
extern gpio_ext_dev_t GPIO_EXT;
@@ -255,6 +255,14 @@ config SOC_GPIO_PIN_COUNT
int
default 62
config SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER
bool
default y
config SOC_GPIO_FLEX_GLITCH_FILTER_NUM
int
default 8
config SOC_GPIO_SUPPORT_PIN_HYS_FILTER
bool
default y
@@ -158,8 +158,8 @@
// ESP32-S31 has 1 GPIO peripheral
#define SOC_GPIO_PORT 1U
#define SOC_GPIO_PIN_COUNT 62
// #define SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER 1 // TODO: [ESP32S31] IDF-14781
// #define SOC_GPIO_FLEX_GLITCH_FILTER_NUM 8 // TODO: [ESP32S31] IDF-14781
#define SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER 1
#define SOC_GPIO_FLEX_GLITCH_FILTER_NUM 8
#define SOC_GPIO_SUPPORT_PIN_HYS_FILTER 1
// GPIO peripheral has the ETM extension
@@ -73,7 +73,6 @@ PROVIDE ( IO_MUX = 0x20582000 );
PROVIDE ( GPIO = 0x20583000 );
PROVIDE ( GPIO_EXT = 0x20583E00 );
PROVIDE ( SDM = 0x20583E04 );
PROVIDE ( GLITCH_FILTER = 0x20583E08 );
PROVIDE ( GPIO_ETM = 0x20583F18 );
PROVIDE ( MSPI_IOMUX = 0x20584000 );
PROVIDE ( HP_SYSTEM = 0x20586000 );
@@ -242,7 +242,6 @@ typedef struct {
} gpio_ext_dev_t;
extern gpio_sd_dev_t SDM;
extern gpio_glitch_filter_dev_t GLITCH_FILTER;
extern gpio_etm_dev_t GPIO_ETM;
extern gpio_ext_dev_t GPIO_EXT;