From 144f80ab044da641c8060c28fe5b4ea4c7e7fb07 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Sun, 7 Apr 2013 13:46:05 -0600 Subject: LPC17xx GPIO interrupt fixes: lpc17_setintedge() must be atomic. Can't disable interrupts from interrupt handlers because they are automatically re-enabled. Try re-configuring pin instead. --- nuttx/arch/arm/src/lpc17xx/chip/lpc178x_pinconfig.h | 2 +- nuttx/arch/arm/src/lpc17xx/lpc17_gpioint.c | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) (limited to 'nuttx/arch') diff --git a/nuttx/arch/arm/src/lpc17xx/chip/lpc178x_pinconfig.h b/nuttx/arch/arm/src/lpc17xx/chip/lpc178x_pinconfig.h index 170d9ceee..be749e8c4 100644 --- a/nuttx/arch/arm/src/lpc17xx/chip/lpc178x_pinconfig.h +++ b/nuttx/arch/arm/src/lpc17xx/chip/lpc178x_pinconfig.h @@ -99,7 +99,7 @@ #define GPIO_SSP1_MISO_1 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN8) #define GPIO_MAT2p2_1 (GPIO_ALT3 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN8) #define GPIO_RTC_EV1_1 (GPIO_ALT4 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN8) -#define GPIO_LCD_VD16 (GPIO_ALT7 | GPIO_FLOA | GPIO_HYSTERESIST | GPIO_PORT0 | GPIO_PIN8) +#define GPIO_LCD_VD16 (GPIO_ALT7 | GPIO_FLOAT | GPIO_HYSTERESIS | GPIO_PORT0 | GPIO_PIN8) #define GPIO_I2S_TXSDA_1 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN9) #define GPIO_SSP1_MOSI_1 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN9) diff --git a/nuttx/arch/arm/src/lpc17xx/lpc17_gpioint.c b/nuttx/arch/arm/src/lpc17xx/lpc17_gpioint.c index a8e4bd641..1d6b4b1d6 100644 --- a/nuttx/arch/arm/src/lpc17xx/lpc17_gpioint.c +++ b/nuttx/arch/arm/src/lpc17xx/lpc17_gpioint.c @@ -116,8 +116,13 @@ static unsigned int lpc17_getintedge(unsigned int port, unsigned int pin) static void lpc17_setintedge(uint32_t intbase, unsigned int pin, unsigned int edges) { + irqstate_t flags; int regval; + /* These must be atomic */ + + flags = irqsave(); + /* Set/clear the rising edge enable bit */ regval = getreg32(intbase + LPC17_GPIOINT_INTENR_OFFSET); @@ -145,6 +150,7 @@ static void lpc17_setintedge(uint32_t intbase, unsigned int pin, } putreg32(regval, intbase + LPC17_GPIOINT_INTENF_OFFSET); + irqrestore(flags); } /**************************************************************************** @@ -389,9 +395,10 @@ static void lpc17_gpiodemux(uint32_t intbase, uint32_t intmask, * Name: lpc17_gpiointerrupt * * Description: - * Handle the EINT3 interrupt that also indicates that a GPIO interrupt has - * occurred. NOTE: This logic will have to be extended if EINT3 is - * actually used for External Interrupt 3. + * Handle the GPIO interrupt. For the LPC176x family, that interrupt could + * also that also indicates that an EINT3 interrupt has occurred. NOTE: + * This logic would have to be extended if EINT3 is actually used for + * External Interrupt 3 on an LPC176x platform. * ****************************************************************************/ -- cgit v1.2.3