diff --git a/drivers/interrupt_controller/Kconfig.stm32 b/drivers/interrupt_controller/Kconfig.stm32 index d925d575e02..d2553a81604 100644 --- a/drivers/interrupt_controller/Kconfig.stm32 +++ b/drivers/interrupt_controller/Kconfig.stm32 @@ -16,7 +16,7 @@ config EXTI_STM32 config EXTI_STM32_EXTI1_0_IRQ_PRI int "EXTI1:0 IRQ priority" depends on EXTI_STM32 - depends on SOC_SERIES_STM32F0X + depends on SOC_SERIES_STM32F0X || SOC_SERIES_STM32L0X default 0 help IRQ priority of EXTI1:0 interrupt @@ -24,7 +24,7 @@ config EXTI_STM32_EXTI1_0_IRQ_PRI config EXTI_STM32_EXTI3_2_IRQ_PRI int "EXTI3:2 IRQ priority" depends on EXTI_STM32 - depends on SOC_SERIES_STM32F0X + depends on SOC_SERIES_STM32F0X || SOC_SERIES_STM32L0X default 0 help IRQ priority of EXTI3:2 interrupt @@ -32,12 +32,12 @@ config EXTI_STM32_EXTI3_2_IRQ_PRI config EXTI_STM32_EXTI15_4_IRQ_PRI int "EXTI15:4 IRQ priority" depends on EXTI_STM32 - depends on SOC_SERIES_STM32F0X + depends on SOC_SERIES_STM32F0X || SOC_SERIES_STM32L0X default 0 help IRQ priority of EXTI15:4 interrupt -if SOC_SERIES_STM32F0X!=y +if SOC_SERIES_STM32F0X!=y && SOC_SERIES_STM32L0X!=y config EXTI_STM32_EXTI0_IRQ_PRI int "EXTI0 IRQ priority" @@ -88,7 +88,7 @@ config EXTI_STM32_EXTI15_10_IRQ_PRI help IRQ priority of EXTI15:10 interrupt -endif # SOC_SERIES_STM32F0X!=y +endif # SOC_SERIES_STM32F0X!=y && SOC_SERIES_STM32L0X!=y config EXTI_STM32_EXTI16_IRQ_PRI int "EXTI16 IRQ priority" diff --git a/drivers/interrupt_controller/exti_stm32.c b/drivers/interrupt_controller/exti_stm32.c index 911586ea319..5099ba2f23c 100644 --- a/drivers/interrupt_controller/exti_stm32.c +++ b/drivers/interrupt_controller/exti_stm32.c @@ -35,6 +35,8 @@ #define EXTI_LINES 29 #elif CONFIG_SOC_SERIES_STM32F4X #define EXTI_LINES 23 +#elif defined(CONFIG_SOC_SERIES_STM32L0X) +#define EXTI_LINES 30 #elif defined(CONFIG_SOC_SERIES_STM32L4X) #define EXTI_LINES 40 #endif @@ -154,6 +156,23 @@ void stm32_exti_enable(int line) break; } } +#elif defined(CONFIG_SOC_SERIES_STM32L0X) + if (line >= 4 && line <= 15) { + irqnum = STM32L0_IRQ_EXTI4_15; + } else if (line >= 2 && line <= 3) { + irqnum = STM32L0_IRQ_EXTI2_3; + } else if (line >= 0 && line <= 1) { + irqnum = STM32L0_IRQ_EXTI0_1; + } else { + /* > 15 are not mapped on an IRQ */ + /* + * On STM32L0X, this function also support enabling EXTI + * lines that are not connected to an IRQ. This might be used + * by other drivers or boards, to allow the device wakeup on + * some non-GPIO signals. + */ + return; + } #elif defined(CONFIG_SOC_SERIES_STM32L4X) if (line >= 5 && line <= 9) { irqnum = STM32L4_IRQ_EXTI9_5; @@ -254,7 +273,7 @@ static void __stm32_exti_isr(int min, int max, void *arg) } } -#ifdef CONFIG_SOC_SERIES_STM32F0X +#if defined(CONFIG_SOC_SERIES_STM32F0X) || defined(CONFIG_SOC_SERIES_STM32L0X) static inline void __stm32_exti_isr_0_1(void *arg) { __stm32_exti_isr(0, 2, arg); @@ -502,6 +521,19 @@ static void __stm32_exti_connect_irqs(struct device *dev) CONFIG_EXTI_STM32_EXTI22_IRQ_PRI, __stm32_exti_isr_22, DEVICE_GET(exti_stm32), 0); +#elif defined(CONFIG_SOC_SERIES_STM32L0X) + IRQ_CONNECT(STM32L0_IRQ_EXTI0_1, + CONFIG_EXTI_STM32_EXTI1_0_IRQ_PRI, + __stm32_exti_isr_0_1, DEVICE_GET(exti_stm32), + 0); + IRQ_CONNECT(STM32L0_IRQ_EXTI2_3, + CONFIG_EXTI_STM32_EXTI3_2_IRQ_PRI, + __stm32_exti_isr_2_3, DEVICE_GET(exti_stm32), + 0); + IRQ_CONNECT(STM32L0_IRQ_EXTI4_15, + CONFIG_EXTI_STM32_EXTI15_4_IRQ_PRI, + __stm32_exti_isr_4_15, DEVICE_GET(exti_stm32), + 0); #elif defined(CONFIG_SOC_SERIES_STM32L4X) IRQ_CONNECT(STM32L4_IRQ_EXTI0, CONFIG_EXTI_STM32_EXTI0_IRQ_PRI,