cc2538: gpio: Factor out duplicated ISR code
This makes the code easier to maintain, and this reduces the binary image size. Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau.dev@gmail.com>
This commit is contained in:
parent
6c706e53ee
commit
41d9078ed4
1 changed files with 21 additions and 52 deletions
|
@ -79,69 +79,38 @@ notify(uint8_t mask, uint8_t port)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/** \brief Interrupt service routine for Port A */
|
/** \brief Interrupt service routine for Port \a port
|
||||||
void
|
* \param port Number between 0 and 3. Port A: 0, Port B: 1, etc.
|
||||||
gpio_port_a_isr()
|
*/
|
||||||
|
static void
|
||||||
|
gpio_port_isr(uint8_t port)
|
||||||
{
|
{
|
||||||
|
uint32_t base;
|
||||||
|
|
||||||
lpm_exit();
|
lpm_exit();
|
||||||
|
|
||||||
ENERGEST_ON(ENERGEST_TYPE_IRQ);
|
ENERGEST_ON(ENERGEST_TYPE_IRQ);
|
||||||
|
|
||||||
notify(REG(GPIO_A_BASE + GPIO_MIS), GPIO_A_NUM);
|
base = GPIO_PORT_TO_BASE(port);
|
||||||
|
|
||||||
GPIO_CLEAR_INTERRUPT(GPIO_A_BASE, 0xFF);
|
notify(REG(base + GPIO_MIS), port);
|
||||||
GPIO_CLEAR_POWER_UP_INTERRUPT(GPIO_A_NUM, 0xFF);
|
|
||||||
|
GPIO_CLEAR_INTERRUPT(base, 0xFF);
|
||||||
|
GPIO_CLEAR_POWER_UP_INTERRUPT(port, 0xFF);
|
||||||
|
|
||||||
ENERGEST_OFF(ENERGEST_TYPE_IRQ);
|
ENERGEST_OFF(ENERGEST_TYPE_IRQ);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/** \brief Interrupt service routine for Port B */
|
#define GPIO_PORT_ISR(lowercase_port, uppercase_port) \
|
||||||
void
|
void \
|
||||||
gpio_port_b_isr()
|
gpio_port_##lowercase_port##_isr(void) \
|
||||||
{
|
{ \
|
||||||
lpm_exit();
|
gpio_port_isr(GPIO_##uppercase_port##_NUM); \
|
||||||
|
|
||||||
ENERGEST_ON(ENERGEST_TYPE_IRQ);
|
|
||||||
|
|
||||||
notify(REG(GPIO_B_BASE + GPIO_MIS), GPIO_B_NUM);
|
|
||||||
|
|
||||||
GPIO_CLEAR_INTERRUPT(GPIO_B_BASE, 0xFF);
|
|
||||||
GPIO_CLEAR_POWER_UP_INTERRUPT(GPIO_B_NUM, 0xFF);
|
|
||||||
|
|
||||||
ENERGEST_OFF(ENERGEST_TYPE_IRQ);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
/** \brief Interrupt service routine for Port C */
|
|
||||||
void
|
|
||||||
gpio_port_c_isr()
|
|
||||||
{
|
|
||||||
lpm_exit();
|
|
||||||
|
|
||||||
ENERGEST_ON(ENERGEST_TYPE_IRQ);
|
|
||||||
|
|
||||||
notify(REG(GPIO_C_BASE + GPIO_MIS), GPIO_C_NUM);
|
|
||||||
|
|
||||||
GPIO_CLEAR_INTERRUPT(GPIO_C_BASE, 0xFF);
|
|
||||||
GPIO_CLEAR_POWER_UP_INTERRUPT(GPIO_C_NUM, 0xFF);
|
|
||||||
|
|
||||||
ENERGEST_OFF(ENERGEST_TYPE_IRQ);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
/** \brief Interrupt service routine for Port D */
|
|
||||||
void
|
|
||||||
gpio_port_d_isr()
|
|
||||||
{
|
|
||||||
lpm_exit();
|
|
||||||
|
|
||||||
ENERGEST_ON(ENERGEST_TYPE_IRQ);
|
|
||||||
|
|
||||||
notify(REG(GPIO_D_BASE + GPIO_MIS), GPIO_D_NUM);
|
|
||||||
|
|
||||||
GPIO_CLEAR_INTERRUPT(GPIO_D_BASE, 0xFF);
|
|
||||||
GPIO_CLEAR_POWER_UP_INTERRUPT(GPIO_D_NUM, 0xFF);
|
|
||||||
|
|
||||||
ENERGEST_OFF(ENERGEST_TYPE_IRQ);
|
|
||||||
}
|
}
|
||||||
|
GPIO_PORT_ISR(a, A)
|
||||||
|
GPIO_PORT_ISR(b, B)
|
||||||
|
GPIO_PORT_ISR(c, C)
|
||||||
|
GPIO_PORT_ISR(d, D)
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
gpio_init()
|
gpio_init()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue