Modified the ISR.
This commit is contained in:
parent
a263688c5e
commit
47b1725a7d
|
@ -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) */
|
||||||
|
|
Loading…
Reference in New Issue