arm: st_stm32: Add support for STM32F4x SoC family
This patch adds support for the STMicroelectronics STM32F4x family in the STM32 MCU line. Configuration is included for the STM32F401RE MCU. Acknowledgements to Pawel Wodnicki's earlier submission from February that was used as a starting point for this port. In the end, we rewrote all of it. Change-Id: I9797c282ac3c0cc66a63b9d34821de95df537ef6 Signed-off-by: Amit Kucheria <amit.kucheria@linaro.org> Signed-off-by: Ricardo Salveti <ricardo.salveti@linaro.org>
This commit is contained in:
parent
31a3f6a70e
commit
95e7fb6c98
12 changed files with 581 additions and 9 deletions
|
@ -72,4 +72,44 @@ config EXTI_STM32_EXTI15_10_IRQ_PRI
|
|||
help
|
||||
IRQ priority of EXTI15:10 interrupt
|
||||
|
||||
config EXTI_STM32_EXTI16_IRQ_PRI
|
||||
int "EXTI16 IRQ priority"
|
||||
depends on EXTI_STM32
|
||||
depends on SOC_SERIES_STM32F4X
|
||||
default 0
|
||||
help
|
||||
IRQ priority of EXTI16 interrupt
|
||||
|
||||
config EXTI_STM32_EXTI17_IRQ_PRI
|
||||
int "EXTI17 IRQ priority"
|
||||
depends on EXTI_STM32
|
||||
depends on SOC_SERIES_STM32F4X
|
||||
default 0
|
||||
help
|
||||
IRQ priority of EXTI17 interrupt
|
||||
|
||||
config EXTI_STM32_EXTI18_IRQ_PRI
|
||||
int "EXTI18 IRQ priority"
|
||||
depends on EXTI_STM32
|
||||
depends on SOC_SERIES_STM32F4X
|
||||
default 0
|
||||
help
|
||||
IRQ priority of EXTI18 interrupt
|
||||
|
||||
config EXTI_STM32_EXTI21_IRQ_PRI
|
||||
int "EXTI21 IRQ priority"
|
||||
depends on EXTI_STM32
|
||||
depends on SOC_SERIES_STM32F4X
|
||||
default 0
|
||||
help
|
||||
IRQ priority of EXTI21 interrupt
|
||||
|
||||
config EXTI_STM32_EXTI22_IRQ_PRI
|
||||
int "EXTI22 IRQ priority"
|
||||
depends on EXTI_STM32
|
||||
depends on SOC_SERIES_STM32F4X
|
||||
default 0
|
||||
help
|
||||
IRQ priority of EXTI22 interrupt
|
||||
|
||||
endif # SOC_FAMILY_STM32
|
||||
|
|
|
@ -17,9 +17,12 @@
|
|||
/**
|
||||
* @brief Driver for External interrupt/event controller in STM32 MCUs
|
||||
*
|
||||
* Based on reference manual:
|
||||
* STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx
|
||||
* advanced ARM ® -based 32-bit MCUs
|
||||
* Based on reference manuals:
|
||||
* RM0008 Reference Manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx
|
||||
* and STM32F107xx advanced ARM-based 32-bit MCUs
|
||||
* and
|
||||
* RM0368 Reference manual STM32F401xB/C and STM32F401xD/E
|
||||
* advanced ARM-based 32-bit MCUs
|
||||
*
|
||||
* Chapter 10.2: External interrupt/event controller (EXTI)
|
||||
*
|
||||
|
@ -54,6 +57,8 @@ struct __exti_cb {
|
|||
|
||||
#ifdef CONFIG_SOC_SERIES_STM32F1X
|
||||
#define EXTI_LINES 19
|
||||
#elif CONFIG_SOC_SERIES_STM32F4X
|
||||
#define EXTI_LINES 23
|
||||
#endif
|
||||
|
||||
/* driver data */
|
||||
|
@ -70,7 +75,7 @@ static inline struct stm32_exti *get_exti_base_addr(int line)
|
|||
void stm32_exti_enable(int line)
|
||||
{
|
||||
volatile struct stm32_exti *exti = get_exti_base_addr(line);
|
||||
int irqnum;
|
||||
int irqnum = 0;
|
||||
|
||||
exti->imr |= 1 << line;
|
||||
|
||||
|
@ -83,6 +88,35 @@ void stm32_exti_enable(int line)
|
|||
/* pins 0..4 are mapped to EXTI0.. EXTI4 */
|
||||
irqnum = STM32F1_IRQ_EXTI0 + line;
|
||||
}
|
||||
#elif CONFIG_SOC_SERIES_STM32F4X
|
||||
if (line >= 5 && line <= 9) {
|
||||
irqnum = STM32F4_IRQ_EXTI9_5;
|
||||
} else if (line >= 10 && line <= 15) {
|
||||
irqnum = STM32F4_IRQ_EXTI15_10;
|
||||
} else if (line >= 0 && line <= 4) {
|
||||
/* pins 0..4 are mapped to EXTI0.. EXTI4 */
|
||||
irqnum = STM32F4_IRQ_EXTI0 + line;
|
||||
} else {
|
||||
switch (line) {
|
||||
case 16:
|
||||
irqnum = STM32F4_IRQ_EXTI16;
|
||||
break;
|
||||
case 17:
|
||||
irqnum = STM32F4_IRQ_EXTI17;
|
||||
break;
|
||||
case 18:
|
||||
irqnum = STM32F4_IRQ_EXTI18;
|
||||
break;
|
||||
case 21:
|
||||
irqnum = STM32F4_IRQ_EXTI21;
|
||||
break;
|
||||
case 22:
|
||||
irqnum = STM32F4_IRQ_EXTI22;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
#error "Unknown STM32 SoC"
|
||||
#endif
|
||||
|
||||
irq_enable(irqnum);
|
||||
|
@ -199,6 +233,33 @@ static inline void __stm32_exti_isr_15_10(void *arg)
|
|||
__stm32_exti_isr(10, 16, arg);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SOC_SERIES_STM32F4X
|
||||
static inline void __stm32_exti_isr_16(void *arg)
|
||||
{
|
||||
__stm32_exti_isr(16, 17, arg);
|
||||
}
|
||||
|
||||
static inline void __stm32_exti_isr_17(void *arg)
|
||||
{
|
||||
__stm32_exti_isr(17, 18, arg);
|
||||
}
|
||||
|
||||
static inline void __stm32_exti_isr_18(void *arg)
|
||||
{
|
||||
__stm32_exti_isr(18, 19, arg);
|
||||
}
|
||||
|
||||
static inline void __stm32_exti_isr_21(void *arg)
|
||||
{
|
||||
__stm32_exti_isr(21, 22, arg);
|
||||
}
|
||||
|
||||
static inline void __stm32_exti_isr_22(void *arg)
|
||||
{
|
||||
__stm32_exti_isr(22, 23, arg);
|
||||
}
|
||||
#endif /* CONFIG_SOC_SERIES_STM32F4X */
|
||||
|
||||
static void __stm32_exti_connect_irqs(struct device *dev);
|
||||
|
||||
/**
|
||||
|
@ -274,7 +335,56 @@ static void __stm32_exti_connect_irqs(struct device *dev)
|
|||
CONFIG_EXTI_STM32_EXTI15_10_IRQ_PRI,
|
||||
__stm32_exti_isr_15_10, DEVICE_GET(exti_stm32),
|
||||
0);
|
||||
#endif
|
||||
#elif CONFIG_SOC_SERIES_STM32F4X
|
||||
IRQ_CONNECT(STM32F4_IRQ_EXTI0,
|
||||
CONFIG_EXTI_STM32_EXTI0_IRQ_PRI,
|
||||
__stm32_exti_isr_0, DEVICE_GET(exti_stm32),
|
||||
0);
|
||||
IRQ_CONNECT(STM32F4_IRQ_EXTI1,
|
||||
CONFIG_EXTI_STM32_EXTI1_IRQ_PRI,
|
||||
__stm32_exti_isr_1, DEVICE_GET(exti_stm32),
|
||||
0);
|
||||
IRQ_CONNECT(STM32F4_IRQ_EXTI2,
|
||||
CONFIG_EXTI_STM32_EXTI2_IRQ_PRI,
|
||||
__stm32_exti_isr_2, DEVICE_GET(exti_stm32),
|
||||
0);
|
||||
IRQ_CONNECT(STM32F4_IRQ_EXTI3,
|
||||
CONFIG_EXTI_STM32_EXTI3_IRQ_PRI,
|
||||
__stm32_exti_isr_3, DEVICE_GET(exti_stm32),
|
||||
0);
|
||||
IRQ_CONNECT(STM32F4_IRQ_EXTI4,
|
||||
CONFIG_EXTI_STM32_EXTI4_IRQ_PRI,
|
||||
__stm32_exti_isr_4, DEVICE_GET(exti_stm32),
|
||||
0);
|
||||
IRQ_CONNECT(STM32F4_IRQ_EXTI9_5,
|
||||
CONFIG_EXTI_STM32_EXTI9_5_IRQ_PRI,
|
||||
__stm32_exti_isr_9_5, DEVICE_GET(exti_stm32),
|
||||
0);
|
||||
IRQ_CONNECT(STM32F4_IRQ_EXTI15_10,
|
||||
CONFIG_EXTI_STM32_EXTI15_10_IRQ_PRI,
|
||||
__stm32_exti_isr_15_10, DEVICE_GET(exti_stm32),
|
||||
0);
|
||||
IRQ_CONNECT(STM32F4_IRQ_EXTI16,
|
||||
CONFIG_EXTI_STM32_EXTI16_IRQ_PRI,
|
||||
__stm32_exti_isr_16, DEVICE_GET(exti_stm32),
|
||||
0);
|
||||
IRQ_CONNECT(STM32F4_IRQ_EXTI17,
|
||||
CONFIG_EXTI_STM32_EXTI17_IRQ_PRI,
|
||||
__stm32_exti_isr_17, DEVICE_GET(exti_stm32),
|
||||
0);
|
||||
IRQ_CONNECT(STM32F4_IRQ_EXTI18,
|
||||
CONFIG_EXTI_STM32_EXTI18_IRQ_PRI,
|
||||
__stm32_exti_isr_18, DEVICE_GET(exti_stm32),
|
||||
0);
|
||||
IRQ_CONNECT(STM32F4_IRQ_EXTI21,
|
||||
CONFIG_EXTI_STM32_EXTI21_IRQ_PRI,
|
||||
__stm32_exti_isr_21, DEVICE_GET(exti_stm32),
|
||||
0);
|
||||
IRQ_CONNECT(STM32F4_IRQ_EXTI22,
|
||||
CONFIG_EXTI_STM32_EXTI22_IRQ_PRI,
|
||||
__stm32_exti_isr_22, DEVICE_GET(exti_stm32),
|
||||
0);
|
||||
#endif /* CONFIG_SOC_SERIES_STM32FXX */
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -17,11 +17,14 @@
|
|||
/**
|
||||
* @brief Driver for External interrupt/event controller in STM32 MCUs
|
||||
*
|
||||
* Based on reference manual:
|
||||
* STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx
|
||||
* advanced ARM ® -based 32-bit MCUs
|
||||
* Based on reference manuals:
|
||||
* RM0008 Reference Manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx
|
||||
* and STM32F107xx advanced ARM-based 32-bit MCUs
|
||||
* and
|
||||
* RM0368 Reference manual STM32F401xB/C and STM32F401xD/E
|
||||
* advanced ARM-based 32-bit MCUs
|
||||
*
|
||||
* Chapter 8.2: External interrupt/event controller (EXTI)
|
||||
* Chapter 10.2: External interrupt/event controller (EXTI)
|
||||
*
|
||||
*/
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue