Add support for STM3210E-EVAL button interrupts

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3750 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2011-07-07 16:20:35 +00:00
parent 4014cbef3c
commit ab6f9522f0
2 changed files with 92 additions and 59 deletions

View File

@ -35,10 +35,9 @@
*
****************************************************************************/
/** \file
* \author Gregory Nutt <spudmonkey@racsa.co.cr>
* \brief STM32 GPIO
**/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/irq.h>
@ -56,7 +55,6 @@
#include "stm32_rcc.h"
#include "stm32_internal.h"
/****************************************************************************
* Private Data
****************************************************************************/
@ -87,16 +85,17 @@ static const uint32_t g_gpiobase[STM32_NGPIO_PORTS] =
};
#ifdef CONFIG_DEBUG
static const char g_portchar[8] = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'
static const char g_portchar[8] =
{
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'
};
#endif
static void (*stm32_exti_callbacks[7])(void) = {
NULL, NULL, NULL, NULL, NULL, NULL, NULL
static xcpt_t stm32_exti_callbacks[7] =
{
NULL, NULL, NULL, NULL, NULL, NULL, NULL
};
/****************************************************************************
* Private Functions
****************************************************************************/
@ -263,59 +262,87 @@ int stm32_gpio_configlock(uint32_t cfgset, bool altlock)
int stm32_exti0_isr(int irq, void *context)
{
putreg32(0x0001, STM32_EXTI_PR);
if (stm32_exti_callbacks[0]) stm32_exti_callbacks[0]();
return 0;
}
int ret = OK;
putreg32(0x0001, STM32_EXTI_PR);
if (stm32_exti_callbacks[0])
{
ret = stm32_exti_callbacks[0](irq, context);
}
return ret;
}
int stm32_exti1_isr(int irq, void *context)
{
putreg32(0x0002, STM32_EXTI_PR);
if (stm32_exti_callbacks[1]) stm32_exti_callbacks[1]();
return 0;
}
int ret = OK;
putreg32(0x0002, STM32_EXTI_PR);
if (stm32_exti_callbacks[1])
{
ret = stm32_exti_callbacks[1](irq, context);
}
return ret;
}
int stm32_exti2_isr(int irq, void *context)
{
putreg32(0x0004, STM32_EXTI_PR);
if (stm32_exti_callbacks[2]) stm32_exti_callbacks[2]();
return 0;
}
int ret = OK;
putreg32(0x0004, STM32_EXTI_PR);
if (stm32_exti_callbacks[2])
{
ret = stm32_exti_callbacks[2](irq, context);
}
return ret;
}
int stm32_exti3_isr(int irq, void *context)
{
putreg32(0x0008, STM32_EXTI_PR);
if (stm32_exti_callbacks[3]) stm32_exti_callbacks[3]();
return 0;
}
int ret = OK;
putreg32(0x0008, STM32_EXTI_PR);
if (stm32_exti_callbacks[3])
{
ret = stm32_exti_callbacks[3](irq, context);
}
return ret;
}
int stm32_exti4_isr(int irq, void *context)
{
putreg32(0x0010, STM32_EXTI_PR);
if (stm32_exti_callbacks[4]) stm32_exti_callbacks[4]();
return 0;
}
int ret = OK;
putreg32(0x0010, STM32_EXTI_PR);
if (stm32_exti_callbacks[4])
{
ret = stm32_exti_callbacks[4](irq, context);
}
return ret;
}
int stm32_exti95_isr(int irq, void *context)
{
putreg32(0x03E0, STM32_EXTI_PR); /* ACK all pins, since we support just one */
if (stm32_exti_callbacks[5]) stm32_exti_callbacks[5]();
return 0;
}
int ret = OK;
putreg32(0x03E0, STM32_EXTI_PR); /* ACK all pins, since we support just one */
if (stm32_exti_callbacks[5])
{
ret = stm32_exti_callbacks[5](irq, context);
}
return ret;
}
int stm32_exti1510_isr(int irq, void *context)
{
putreg32(0xFC00, STM32_EXTI_PR); /* ACK all pins, since we support just one */
if (stm32_exti_callbacks[6]) stm32_exti_callbacks[6]();
return 0;
}
int ret = OK;
putreg32(0xFC00, STM32_EXTI_PR); /* ACK all pins, since we support just one */
if (stm32_exti_callbacks[6])
{
ret = stm32_exti_callbacks[6](irq, context);
}
return ret;
}
/****************************************************************************
* Public Functions
@ -546,16 +573,20 @@ bool stm32_gpioread(uint32_t pinset)
* - func: when non-NULL, generate interrupt
*
* Returns:
* True when GPIO Event/Interrupt generation is successfully configured.
* The previous value of the interrupt handler function pointer. This value may,
* for example, be used to restore the previous handler when multiple handlers are
* used.
*
************************************************************************************/
bool stm32_gpiosetevent(uint32_t pinset, bool risingedge, bool fallingedge,
bool event, void (*func)(void))
xcpt_t stm32_gpiosetevent(uint32_t pinset, bool risingedge, bool fallingedge,
bool event, xcpt_t func)
{
uint32_t exti_isr = pinset & GPIO_PIN_MASK;
uint32_t exti_bit = STM32_EXTI_BIT( exti_isr );
int intno;
int (*exti_hnd)(int irq, void *context);
xcpt_t oldhandler = NULL;
/* Set callback, single callback at the moment, but we could extend
* that easily
@ -582,12 +613,9 @@ bool stm32_gpiosetevent(uint32_t pinset, bool risingedge, bool fallingedge,
intno = STM32_IRQ_EXTI1510;
}
/* Check if previous and different instance exists? */
if (func && stm32_exti_callbacks[exti_isr] &&
func != stm32_exti_callbacks[exti_isr])
return false;
/* Get the previous GPIO IRQ handler; Save the new IRQ handler. */
oldhandler = stm32_exti_callbacks[exti_isr];
stm32_exti_callbacks[exti_isr] = func;
/* Install external interrupt handlers */
@ -614,8 +642,10 @@ bool stm32_gpiosetevent(uint32_t pinset, bool risingedge, bool fallingedge,
modifyreg32(STM32_EXTI_EMR, event ? 0 : exti_bit, event ? exti_bit : 0);
modifyreg32(STM32_EXTI_IMR, func ? 0 : exti_bit, func ? exti_bit : 0);
return true;
/* Return the old IRQ handler */
return oldhandler;
}
/****************************************************************************

View File

@ -38,12 +38,16 @@
#ifndef __ARCH_ARM_SRC_STM32_STM32_GPIO_H
#define __ARCH_ARM_SRC_STM32_STM32_GPIO_H
/************************************************************************************
* Included Files
************************************************************************************/
#include <nuttx/config.h>
#include <nuttx/irq.h>
#include "chip.h"
#include "chip/stm32_gpio.h"
/************************************************************************************
* Pre-Processor Declarations
************************************************************************************/
@ -58,9 +62,9 @@ extern "C" {
#define EXTERN extern
#endif
/* Bit-encoded input to stm32_configgpio()
* These definitions could be replaced by 'enum' as a stm32_gpio_t data type.
*/
/* Bit-encoded input to stm32_configgpio()
* These definitions could be replaced by 'enum' as a stm32_gpio_t data type.
*/
/* 16-bit Encoding:
* OFFS SX.. VPPP BBBB
@ -157,7 +161,6 @@ extern "C" {
#define GPIO_PIN14 (14 << GPIO_PIN_SHIFT)
#define GPIO_PIN15 (15 << GPIO_PIN_SHIFT)
/************************************************************************************
* Public Function Prototypes
************************************************************************************/
@ -175,7 +178,6 @@ extern "C" {
* OK on success
* ERROR on invalid port, or when pin is locked as ALT function.
*
* \todo Auto Power Enable
************************************************************************************/
EXTERN int stm32_configgpio(uint32_t cfgset);
@ -197,7 +199,6 @@ EXTERN int stm32_configgpio(uint32_t cfgset);
* OK on success
* ERROR on invalid port
*
* \todo Auto Power Disable
************************************************************************************/
EXTERN int stm32_unconfiggpio(uint32_t cfgset);
@ -238,11 +239,14 @@ EXTERN bool stm32_gpioread(uint32_t pinset);
* - func: when non-NULL, generate interrupt
*
* Returns:
* True when GPIO Event/Interrupt generation is successfully configured.
* The previous value of the interrupt handler function pointer. This value may,
* for example, be used to restore the previous handler when multiple handlers are
* used.
*
************************************************************************************/
EXTERN bool stm32_gpiosetevent(uint32_t pinset, bool risingedge, bool fallingedge,
bool event, void (*func)(void));
EXTERN xcpt_t stm32_gpiosetevent(uint32_t pinset, bool risingedge, bool fallingedge,
bool event, xcpt_t func);
/************************************************************************************
* Function: stm32_dumpgpio
@ -258,7 +262,6 @@ EXTERN int stm32_dumpgpio(uint32_t pinset, const char *msg);
# define stm32_dumpgpio(p,m)
#endif
/************************************************************************************
* Function: stm32_gpioinit
*