Modified the ISR.

This commit is contained in:
Tracy Wadleigh 2020-05-25 22:00:23 -07:00
parent a263688c5e
commit 47b1725a7d
1 changed files with 25 additions and 37 deletions

View File

@ -82,22 +82,24 @@ static inline PORT_TypeDef* _pal_lld_ext_port(ioportid_t port) {
/* /*
* Generic interrupt handler. * Generic interrupt handler.
*/ */
static inline void irq_handler(ioportid_t ioport, static inline void irq_handler(PORT_TypeDef* const port,
PORT_TypeDef * const port) { palevent_t* events) {
unsigned pin; iopadid_t pad;
uint32_t isfr = port->ISFR; uint32_t pad_mask;
/* Clear all pending interrupts on this port. */ chSysLockFromISR();
port->ISFR = 0xFFFFFFFF; uint32_t isfr = port->ISFR; /* Get pending interrupts on this port. */
port->ISFR = 0xFFFFFFFFU; /* Clear all pending interrupts on this port. */
chSysUnlockFromISR();
for (pin = 0; pin < PAL_IOPORTS_WIDTH; pin++) { /* invoke callbacks for pending interrupts */
if (isfr & (1 << pin)) { for (pad = 0, pad_mask = 1U;
palevent_t* e = _pal_lld_get_pad_event(ioport, pin); pad < PAL_IOPORTS_WIDTH;
if (e && e->cb) { ++pad, ++events, pad_mask <<= 1) {
e->cb(e->arg); if (events->cb && (isfr & pad_mask)) {
events->cb(events->arg);
} }
} }
}
} }
/** /**
@ -108,9 +110,7 @@ static inline void irq_handler(ioportid_t ioport,
#if defined(KINETIS_PORTA_IRQ_VECTOR) #if defined(KINETIS_PORTA_IRQ_VECTOR)
OSAL_IRQ_HANDLER(KINETIS_PORTA_IRQ_VECTOR) { OSAL_IRQ_HANDLER(KINETIS_PORTA_IRQ_VECTOR) {
OSAL_IRQ_PROLOGUE(); OSAL_IRQ_PROLOGUE();
irq_handler(PORTA, _pal_events);
irq_handler(IOPORT1, PORTA);
OSAL_IRQ_EPILOGUE(); OSAL_IRQ_EPILOGUE();
} }
#endif /* defined(KINETIS_PORTA_IRQ_VECTOR) */ #endif /* defined(KINETIS_PORTA_IRQ_VECTOR) */
@ -120,12 +120,10 @@ OSAL_IRQ_HANDLER(KINETIS_PORTA_IRQ_VECTOR) {
#if defined(KINETIS_PORTD_IRQ_VECTOR) #if defined(KINETIS_PORTD_IRQ_VECTOR)
OSAL_IRQ_HANDLER(KINETIS_PORTD_IRQ_VECTOR) { OSAL_IRQ_HANDLER(KINETIS_PORTD_IRQ_VECTOR) {
OSAL_IRQ_PROLOGUE(); OSAL_IRQ_PROLOGUE();
irq_handler(PORTB, _pal_events + PAL_IOPORTS_WIDTH);
irq_handler(IOPORT2, PORTB); irq_handler(PORTC, _pal_events + PAL_IOPORTS_WIDTH * 2);
irq_handler(IOPORT3, PORTC); irq_handler(PORTD, _pal_events + PAL_IOPORTS_WIDTH * 3);
irq_handler(IOPORT4, PORTD); irq_handler(PORTE, _pal_events + PAL_IOPORTS_WIDTH * 4);
irq_handler(IOPORT5, PORTE);
OSAL_IRQ_EPILOGUE(); OSAL_IRQ_EPILOGUE();
} }
#endif /* defined(KINETIS_PORTD_IRQ_VECTOR) */ #endif /* defined(KINETIS_PORTD_IRQ_VECTOR) */
@ -135,10 +133,8 @@ OSAL_IRQ_HANDLER(KINETIS_PORTD_IRQ_VECTOR) {
#if defined(KINETIS_PORTD_IRQ_VECTOR) #if defined(KINETIS_PORTD_IRQ_VECTOR)
OSAL_IRQ_HANDLER(KINETIS_PORTD_IRQ_VECTOR) { OSAL_IRQ_HANDLER(KINETIS_PORTD_IRQ_VECTOR) {
OSAL_IRQ_PROLOGUE(); OSAL_IRQ_PROLOGUE();
irq_handler(PORTC, _pal_events + PAL_IOPORTS_WIDTH * 2);
irq_handler(IOPORT3, PORTC); irq_handler(PORTD, _pal_events + PAL_IOPORTS_WIDTH * 3);
irq_handler(IOPORT4, PORTD);
OSAL_IRQ_EPILOGUE(); OSAL_IRQ_EPILOGUE();
} }
#endif /* defined(KINETIS_PORTD_IRQ_VECTOR) */ #endif /* defined(KINETIS_PORTD_IRQ_VECTOR) */
@ -154,9 +150,7 @@ OSAL_IRQ_HANDLER(KINETIS_PORTD_IRQ_VECTOR) {
#if defined(KINETIS_PORTB_IRQ_VECTOR) #if defined(KINETIS_PORTB_IRQ_VECTOR)
OSAL_IRQ_HANDLER(KINETIS_PORTB_IRQ_VECTOR) { OSAL_IRQ_HANDLER(KINETIS_PORTB_IRQ_VECTOR) {
OSAL_IRQ_PROLOGUE(); OSAL_IRQ_PROLOGUE();
irq_handler(PORTB, _pal_events + PAL_IOPORTS_WIDTH);
irq_handler(IOPORT2, PORTB);
OSAL_IRQ_EPILOGUE(); OSAL_IRQ_EPILOGUE();
} }
#endif /* defined(KINETIS_EXT_PORTB_IRQ_VECTOR */ #endif /* defined(KINETIS_EXT_PORTB_IRQ_VECTOR */
@ -169,9 +163,7 @@ OSAL_IRQ_HANDLER(KINETIS_PORTB_IRQ_VECTOR) {
#if defined(KINETIS_PORTC_IRQ_VECTOR) #if defined(KINETIS_PORTC_IRQ_VECTOR)
OSAL_IRQ_HANDLER(KINETIS_PORTC_IRQ_VECTOR) { OSAL_IRQ_HANDLER(KINETIS_PORTC_IRQ_VECTOR) {
OSAL_IRQ_PROLOGUE(); OSAL_IRQ_PROLOGUE();
irq_handler(PORTC, _pal_events + PAL_IOPORTS_WIDTH * 2);
irq_handler(IOPORT3, PORTC);
OSAL_IRQ_EPILOGUE(); OSAL_IRQ_EPILOGUE();
} }
#endif /* defined(KINETIS_PORTC_IRQ_VECTOR) */ #endif /* defined(KINETIS_PORTC_IRQ_VECTOR) */
@ -184,9 +176,7 @@ OSAL_IRQ_HANDLER(KINETIS_PORTC_IRQ_VECTOR) {
#if defined(KINETIS_PORTD_IRQ_VECTOR) #if defined(KINETIS_PORTD_IRQ_VECTOR)
OSAL_IRQ_HANDLER(KINETIS_PORTD_IRQ_VECTOR) { OSAL_IRQ_HANDLER(KINETIS_PORTD_IRQ_VECTOR) {
OSAL_IRQ_PROLOGUE(); OSAL_IRQ_PROLOGUE();
irq_handler(PORTD, _pal_events + PAL_IOPORTS_WIDTH * 3);
irq_handler(IOPORT4, PORTD);
OSAL_IRQ_EPILOGUE(); OSAL_IRQ_EPILOGUE();
} }
#endif /* defined(KINETIS_PORTD_IRQ_VECTOR) */ #endif /* defined(KINETIS_PORTD_IRQ_VECTOR) */
@ -199,9 +189,7 @@ OSAL_IRQ_HANDLER(KINETIS_PORTD_IRQ_VECTOR) {
#if defined(KINETIS_PORTE_IRQ_VECTOR) #if defined(KINETIS_PORTE_IRQ_VECTOR)
OSAL_IRQ_HANDLER(KINETIS_PORTE_IRQ_VECTOR) { OSAL_IRQ_HANDLER(KINETIS_PORTE_IRQ_VECTOR) {
OSAL_IRQ_PROLOGUE(); OSAL_IRQ_PROLOGUE();
irq_handler(PORTE, _pal_events + PAL_IOPORTS_WIDTH * 4);
irq_handler(IOPORT5, PORTE);
OSAL_IRQ_EPILOGUE(); OSAL_IRQ_EPILOGUE();
} }
#endif /* defined(KINETIS_PORTE_IRQ_VECTOR) */ #endif /* defined(KINETIS_PORTE_IRQ_VECTOR) */