From 9ea0ceca9c52eed473749ae1bce5ee51839a87dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Tue, 24 Apr 2018 18:48:52 +0200 Subject: [PATCH] kinetis: Add support for combined GPIO PORTC,D IRQs Used in KL43 and others --- cpu/kinetis/include/vectors_kinetis.h | 1 + cpu/kinetis/isr_kinetis.c | 1 + cpu/kinetis/periph/gpio.c | 8 ++++++++ cpu/kinetis/vectors.c | 4 +++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/cpu/kinetis/include/vectors_kinetis.h b/cpu/kinetis/include/vectors_kinetis.h index fb37d941fb..24649dbec2 100644 --- a/cpu/kinetis/include/vectors_kinetis.h +++ b/cpu/kinetis/include/vectors_kinetis.h @@ -134,6 +134,7 @@ void isr_portc(void); /**< Port C pin detect interrupt handler */ void isr_portd(void); /**< Port D pin detect interrupt handler */ void isr_porte(void); /**< Port E pin detect interrupt handler */ void isr_portb_portc(void); /**< Port B, C combined pin detect interrupt handler */ +void isr_portc_portd(void); /**< Port C, D combined pin detect interrupt handler */ void isr_radio_0(void); /**< Radio transceiver INT0 interrupt handler */ void isr_radio_1(void); /**< Radio transceiver INT1 interrupt handler */ void isr_rng(void); /**< RNG interrupt handler */ diff --git a/cpu/kinetis/isr_kinetis.c b/cpu/kinetis/isr_kinetis.c index 3708e24ecc..b16319a079 100644 --- a/cpu/kinetis/isr_kinetis.c +++ b/cpu/kinetis/isr_kinetis.c @@ -180,6 +180,7 @@ WEAK_DEFAULT void isr_portc(void); WEAK_DEFAULT void isr_portd(void); WEAK_DEFAULT void isr_porte(void); WEAK_DEFAULT void isr_portb_portc(void); +WEAK_DEFAULT void isr_portc_portd(void); WEAK_DEFAULT void isr_radio_0(void); WEAK_DEFAULT void isr_radio_1(void); WEAK_DEFAULT void isr_rng(void); diff --git a/cpu/kinetis/periph/gpio.c b/cpu/kinetis/periph/gpio.c index 2988efd0bc..1b674be68b 100644 --- a/cpu/kinetis/periph/gpio.c +++ b/cpu/kinetis/periph/gpio.c @@ -412,4 +412,12 @@ void isr_portb_portc(void) cortexm_isr_end(); } #endif +#if defined(PORTC_BASE) && defined(PORTD_BASE) +/* Combined ISR used in certain KL devices */ +void isr_portc_portd(void) +{ + irq_handler(PORTC, 2); + irq_handler(PORTD, 3); +} +#endif #endif /* MODULE_PERIPH_GPIO_IRQ */ diff --git a/cpu/kinetis/vectors.c b/cpu/kinetis/vectors.c index 151ddc5db8..0b8b0297d1 100644 --- a/cpu/kinetis/vectors.c +++ b/cpu/kinetis/vectors.c @@ -319,8 +319,10 @@ ISR_VECTOR(1) const isr_t vector_cpu[CPU_IRQ_NUMOF] = { [PORTA_IRQn ] = isr_porta, /* Port A interrupt */ #endif #ifdef KINETIS_CORE_Z -#if defined(PORTB) && defined(PORTC) +#if defined(PORTB) && defined(PORTC) && !defined(PORTD) [PORTB_PORTC_IRQn] = isr_portb_portc, /* Port B, C combined interrupt */ +#elif defined(PORTC) && defined(PORTD) + [PORTC_PORTD_IRQn] = isr_portc_portd, /* Port C, D combined interrupt */ #endif #else #ifdef PORTB