From fad5c270389b65ece48520259fe52388e80f8f65 Mon Sep 17 00:00:00 2001 From: sg- Date: Fri, 7 Feb 2014 18:20:45 -0600 Subject: [PATCH] Add default interrupt handler for Freescale NMI_b pins. --- .../TARGET_KLXX/TARGET_KL05Z/gpio_irq_api.c | 14 +++++++++++++- .../TARGET_KLXX/TARGET_KL25Z/gpio_irq_api.c | 17 +++++++++++++++-- .../TARGET_KLXX/TARGET_KL46Z/gpio_irq_api.c | 13 ++++++++++++- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/gpio_irq_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/gpio_irq_api.c index e14f0b8ec7..30bf18a3fd 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/gpio_irq_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/gpio_irq_api.c @@ -37,7 +37,9 @@ static void handle_interrupt_in(PORT_Type *port, int ch_base) { if (port->ISFR & pmask) { mask |= pmask; uint32_t id = channel_ids[ch_base + i]; - if (id == 0) continue; + if (id == 0) { + continue; + } FGPIO_Type *gpio; gpio_irq_event event = IRQ_NONE; @@ -170,3 +172,13 @@ void gpio_irq_disable(gpio_irq_t *obj) { NVIC_DisableIRQ(PORTB_IRQn); } } + +// Change the NMI pin to an input. This allows NMI pin to +// be used as a low power mode wakeup. The application will +// need to change the pin back to NMI_b or wakeup only occurs once! +extern void gpio_init(gpio_t *obj, PinName pin, PinDirection direction); +void NMI_Handler(void) +{ + gpio_t gpio; + gpio_init(&gpio, PTB5, PIN_INPUT); +} diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/gpio_irq_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/gpio_irq_api.c index 0af91e80bc..e3f704da4c 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/gpio_irq_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/gpio_irq_api.c @@ -37,7 +37,9 @@ static void handle_interrupt_in(PORT_Type *port, int ch_base) { if (port->ISFR & pmask) { mask |= pmask; uint32_t id = channel_ids[ch_base + i]; - if (id == 0) continue; + if (id == 0) { + continue; + } FGPIO_Type *gpio; gpio_irq_event event = IRQ_NONE; @@ -55,8 +57,9 @@ static void handle_interrupt_in(PORT_Type *port, int ch_base) { event = (gpio->PDIR & pmask) ? (IRQ_RISE) : (IRQ_FALL); break; } - if (event != IRQ_NONE) + if (event != IRQ_NONE) { irq_handler(id, event); + } } } port->ISFR = mask; @@ -159,3 +162,13 @@ void gpio_irq_disable(gpio_irq_t *obj) { NVIC_DisableIRQ(PORTD_IRQn); } } + +// Change the NMI pin to an input. This allows NMI pin to +// be used as a low power mode wakeup. The application will +// need to change the pin back to NMI_b or wakeup only occurs once! +extern void gpio_init(gpio_t *obj, PinName pin, PinDirection direction); +void NMI_Handler(void) +{ + gpio_t gpio; + gpio_init(&gpio, PTA4, PIN_INPUT); +} diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/gpio_irq_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/gpio_irq_api.c index 005ae3a367..e4b3de004a 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/gpio_irq_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/gpio_irq_api.c @@ -37,8 +37,9 @@ static void handle_interrupt_in(PORT_Type *port, int ch_base) { if (port->ISFR & pmask) { mask |= pmask; uint32_t id = channel_ids[ch_base + i]; - if (id == 0) + if (id == 0) { continue; + } FGPIO_Type *gpio; gpio_irq_event event = IRQ_NONE; @@ -181,3 +182,13 @@ void gpio_irq_disable(gpio_irq_t *obj) { NVIC_DisableIRQ(PORTC_PORTD_IRQn); } } + +// Change the NMI pin to an input. This allows NMI pin to +// be used as a low power mode wakeup. The application will +// need to change the pin back to NMI_b or wakeup only occurs once! +extern void gpio_init(gpio_t *obj, PinName pin, PinDirection direction); +void NMI_Handler(void) +{ + gpio_t gpio; + gpio_init(&gpio, PTA4, PIN_INPUT); +}