Line data Source code
1 0 : /*
2 : * Copyright (c) 2016 Open-RnD Sp. z o.o.
3 : * Copyright (c) 2024 STMicroelectronics
4 : *
5 : * SPDX-License-Identifier: Apache-2.0
6 : */
7 :
8 : /**
9 : * @brief GPIO interrupt controller API for STM32 MCUs
10 : *
11 : * This API is used to interact with the GPIO interrupt controller
12 : * of STM32 microcontrollers.
13 : */
14 :
15 : #ifndef ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_GPIO_INTC_STM32_H_
16 : #define ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_GPIO_INTC_STM32_H_
17 :
18 : #include <zephyr/types.h>
19 : #include <zephyr/drivers/gpio.h>
20 :
21 : /**
22 : * @brief Opaque type representing a GPIO interrupt line
23 : */
24 1 : typedef uint32_t stm32_gpio_irq_line_t;
25 :
26 : /**
27 : * @brief Get the GPIO interrupt line value corresponding
28 : * to specified @p pin of GPIO port @p port
29 : */
30 1 : stm32_gpio_irq_line_t stm32_gpio_intc_get_pin_irq_line(uint32_t port, gpio_pin_t pin);
31 :
32 : /**
33 : * @brief Enable GPIO interrupts for specified line
34 : *
35 : * @param line GPIO interrupt line
36 : */
37 1 : void stm32_gpio_intc_enable_line(stm32_gpio_irq_line_t line);
38 :
39 : /**
40 : * @brief Disable GPIO interrupts for specified line
41 : *
42 : * @param line GPIO interrupt line
43 : */
44 1 : void stm32_gpio_intc_disable_line(stm32_gpio_irq_line_t line);
45 :
46 : /**
47 : * @brief GPIO interrupt trigger flags
48 : */
49 0 : enum stm32_gpio_irq_trigger {
50 : /* No trigger */
51 : STM32_GPIO_IRQ_TRIG_NONE = 0x0,
52 : /* Trigger on rising edge */
53 : STM32_GPIO_IRQ_TRIG_RISING = 0x1,
54 : /* Trigger on falling edge */
55 : STM32_GPIO_IRQ_TRIG_FALLING = 0x2,
56 : /* Trigger on both rising and falling edge */
57 : STM32_GPIO_IRQ_TRIG_BOTH = 0x3,
58 : /* Trigger on high level */
59 : STM32_GPIO_IRQ_TRIG_HIGH_LEVEL = 0x4,
60 : /* Trigger on low level */
61 : STM32_GPIO_IRQ_TRIG_LOW_LEVEL = 0x5
62 : };
63 :
64 : /**
65 : * @brief Select trigger for interrupt on specified GPIO line
66 : *
67 : * @param line GPIO interrupt line
68 : * @param trg Interrupt trigger (see @ref stm32_gpio_irq_trigger)
69 : */
70 1 : void stm32_gpio_intc_select_line_trigger(stm32_gpio_irq_line_t line, uint32_t trg);
71 :
72 : /**
73 : * @brief GPIO interrupt callback function signature
74 : *
75 : * @param pin GPIO pin on which interrupt occurred
76 : * @param user @p data provided to @ref stm32_gpio_intc_set_irq_callback
77 : *
78 : * @note This callback is invoked in ISR context.
79 : */
80 1 : typedef void (*stm32_gpio_irq_cb_t)(gpio_port_pins_t pin, void *user);
81 :
82 : /**
83 : * @brief Set callback invoked when an interrupt occurs on specified GPIO line
84 : *
85 : * @param line GPIO interrupt line
86 : * @param cb Interrupt callback function
87 : * @param user Custom user data for usage by the callback
88 : * @returns 0 on success, -EBUSY if a callback is already set for @p line
89 : */
90 1 : int stm32_gpio_intc_set_irq_callback(stm32_gpio_irq_line_t line,
91 : stm32_gpio_irq_cb_t cb, void *user);
92 :
93 : /**
94 : * @brief Removes the interrupt callback of specified EXTI line
95 : *
96 : * @param line EXTI interrupt line
97 : */
98 1 : void stm32_gpio_intc_remove_irq_callback(stm32_gpio_irq_line_t line);
99 :
100 : /** Hardware-specific API extensions */
101 :
102 : #if defined(CONFIG_EXTI_STM32) /* EXTI-specific extensions */
103 : /**
104 : * @brief Set which GPIO port triggers events on specified EXTI line.
105 : *
106 : * @param line EXTI line number (= pin number)
107 : * @param port GPIO port number (STM32_PORTA, STM32_PORTB, ...)
108 : */
109 : void stm32_exti_set_line_src_port(gpio_pin_t line, uint32_t port);
110 :
111 : /**
112 : * @brief Get port which is triggering events on specified EXTI line.
113 : *
114 : * @param line EXTI line number (= pin number)
115 : * @returns GPIO port number (STM32_PORTA, STM32_PORTB, ...)
116 : */
117 : uint32_t stm32_exti_get_line_src_port(gpio_pin_t line);
118 : #endif /* CONFIG_EXTI_STM32 */
119 :
120 : #endif /* ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_GPIO_INTC_STM32_H_ */
|