Skip to content

Commit

Permalink
drivers: gpio
Browse files Browse the repository at this point in the history
integrate reworked interrut controller

Signed-off-by: Alexander Kozhinov <ak.alexander.kozhinov@gmail.com>
  • Loading branch information
KozhinovAlexander committed Mar 3, 2025
1 parent be9e4d8 commit 92de989
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 150 deletions.
66 changes: 36 additions & 30 deletions drivers/gpio/gpio_stm32.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/clock_control/stm32_clock_control.h>
#include <zephyr/sys/util.h>
#include <zephyr/drivers/interrupt_controller/gpio_intc_stm32.h>
#include <zephyr/drivers/interrupt_controller/intc_exti_stm32.h>
#include <zephyr/pm/device.h>
#include <zephyr/pm/device_runtime.h>
#include <zephyr/drivers/misc/stm32_wkup_pins/stm32_wkup_pins.h>
Expand All @@ -36,14 +36,23 @@ LOG_MODULE_REGISTER(stm32, CONFIG_GPIO_LOG_LEVEL);
* @brief Common GPIO driver for STM32 MCUs.
*/


/**
* @brief Helper to get EXTI line number from pin defined by ST's LL library
*/
static inline uint32_t pin2exti_linenum(uint32_t pin)
{
return BIT(pin % 32U);
}

/**
* @brief EXTI interrupt callback
*/
static void gpio_stm32_isr(gpio_port_pins_t pin, void *arg)
__maybe_unused static void gpio_stm32_isr(gpio_port_pins_t pin, void *arg)
{
struct gpio_stm32_data *data = arg;

gpio_fire_callbacks(&data->cb, data->dev, pin);
gpio_fire_callbacks(&data->cb, data->dev, pin2exti_linenum(pin));
}

/**
Expand Down Expand Up @@ -219,16 +228,15 @@ __maybe_unused static inline uint32_t ll_gpio_get_pin_pull(GPIO_TypeDef *GPIOx,
static inline void gpio_stm32_disable_pin_irqs(uint32_t port, gpio_pin_t pin)
{
#if defined(CONFIG_EXTI_STM32)
if (port != stm32_exti_get_line_src_port(pin)) {
/* EXTI line not owned by this port - do nothing */
/**
* GPIO pins are connected to EXTI lines 0 to 15 and directly represent EXTI
* line number
*/
if (stm32_exti_disable(pin) != 0) {
/* pin number is not valid */
return;
}
#endif
stm32_gpio_irq_line_t irq_line = stm32_gpio_intc_get_pin_irq_line(port, pin);

stm32_gpio_intc_disable_line(irq_line);
stm32_gpio_intc_remove_irq_callback(irq_line);
stm32_gpio_intc_select_line_trigger(irq_line, STM32_GPIO_IRQ_TRIG_NONE);
#endif /* CONFIG_EXTI_STM32 */
}

/**
Expand Down Expand Up @@ -585,19 +593,18 @@ static int gpio_stm32_pin_interrupt_configure(const struct device *dev,
{
const struct gpio_stm32_config *cfg = dev->config;
struct gpio_stm32_data *data = dev->data;
const stm32_gpio_irq_line_t irq_line = stm32_gpio_intc_get_pin_irq_line(cfg->port, pin);
uint32_t irq_trigger = 0;
int err = 0;

#ifdef CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT
#if defined(CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT) && defined(CONFIG_EXTI_STM32)
if (mode == GPIO_INT_MODE_DISABLE_ONLY) {
stm32_gpio_intc_disable_line(irq_line);
stm32_exti_disable_irq(pin);
goto exit;
} else if (mode == GPIO_INT_MODE_ENABLE_ONLY) {
stm32_gpio_intc_enable_line(irq_line);
stm32_exti_enable_irq(pin);
goto exit;
}
#endif /* CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT */
#endif /* CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT && CONFIG_EXTI_STM32 */

if (mode == GPIO_INT_MODE_DISABLED) {
gpio_stm32_disable_pin_irqs(cfg->port, pin);
Expand All @@ -612,10 +619,10 @@ static int gpio_stm32_pin_interrupt_configure(const struct device *dev,
} else {
switch (trig) {
case GPIO_INT_TRIG_LOW:
irq_trigger = STM32_GPIO_IRQ_TRIG_LOW_LEVEL;
irq_trigger = STM32_EXTI_TRIG_LOW_LEVEL;
break;
case GPIO_INT_TRIG_HIGH:
irq_trigger = STM32_GPIO_IRQ_TRIG_HIGH_LEVEL;
irq_trigger = STM32_EXTI_TRIG_HIGH_LEVEL;
break;
default:
err = -EINVAL;
Expand All @@ -625,32 +632,31 @@ static int gpio_stm32_pin_interrupt_configure(const struct device *dev,
} else {
switch (trig) {
case GPIO_INT_TRIG_LOW:
irq_trigger = STM32_GPIO_IRQ_TRIG_FALLING;
irq_trigger = STM32_EXTI_TRIG_FALLING;
break;
case GPIO_INT_TRIG_HIGH:
irq_trigger = STM32_GPIO_IRQ_TRIG_RISING;
irq_trigger = STM32_EXTI_TRIG_RISING;
break;
case GPIO_INT_TRIG_BOTH:
irq_trigger = STM32_GPIO_IRQ_TRIG_BOTH;
irq_trigger = STM32_EXTI_TRIG_BOTH;
break;
default:
err = -EINVAL;
goto exit;
}
}

if (stm32_gpio_intc_set_irq_callback(irq_line, gpio_stm32_isr, data) != 0) {
err = -EBUSY;
goto exit;
}

#if defined(CONFIG_EXTI_STM32)
stm32_exti_set_line_src_port(pin, cfg->port);
#endif

stm32_gpio_intc_select_line_trigger(irq_line, irq_trigger);

stm32_gpio_intc_enable_line(irq_line);
err = stm32_exti_enable(pin, irq_trigger, STM32_EXTI_MODE_IT, gpio_stm32_isr,
data);
if (err != 0) {
err = -EBUSY;
}
#else /* CONFIG_EXTI_STM32 */
ARG_UNUSED(data);
#endif /* CONFIG_EXTI_STM32 */

exit:
return err;
Expand Down
120 changes: 0 additions & 120 deletions include/zephyr/drivers/interrupt_controller/gpio_intc_stm32.h

This file was deleted.

0 comments on commit 92de989

Please sign in to comment.