From 93ba4af2ff1dacc63106796eb22f294e7d9030b0 Mon Sep 17 00:00:00 2001 From: patacongo Date: Sun, 17 Oct 2010 17:38:40 +0000 Subject: Add button logic git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3030 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/configs/avr32dev1/README.txt | 4 ++ nuttx/configs/avr32dev1/include/board.h | 15 +++++- nuttx/configs/avr32dev1/ostest/defconfig | 10 +++- nuttx/configs/avr32dev1/src/avr32dev1_internal.h | 30 ++++++++++- nuttx/configs/avr32dev1/src/up_buttons.c | 65 +++++++++++++----------- 5 files changed, 90 insertions(+), 34 deletions(-) (limited to 'nuttx/configs/avr32dev1') diff --git a/nuttx/configs/avr32dev1/README.txt b/nuttx/configs/avr32dev1/README.txt index c28da89e0..01c38cb0e 100755 --- a/nuttx/configs/avr32dev1/README.txt +++ b/nuttx/configs/avr32dev1/README.txt @@ -156,6 +156,10 @@ AVR32DEV1 Configuration Options the delay actually is 100 seconds. Individual subsystems can be enabled: + + CONFIG_AVR32_GPIOIRQ - GPIO interrupt support + CONFIG_AVR32_GPIOIRQSETA - Set of GPIOs on PORTA that support interrupts + CONFIG_AVR32_GPIOIRQSETB - Set of GPIOs on PORTB that support interrupts CONFIG_AVR32_USARTn - Enable support for USARTn CONFIG_AVR32_USARTn_RS232 - Configure USARTn as an RS232 interface. diff --git a/nuttx/configs/avr32dev1/include/board.h b/nuttx/configs/avr32dev1/include/board.h index c166cae05..7c6371e1d 100755 --- a/nuttx/configs/avr32dev1/include/board.h +++ b/nuttx/configs/avr32dev1/include/board.h @@ -43,6 +43,9 @@ #include +#include +#include + /************************************************************************************ * Definitions ************************************************************************************/ @@ -135,6 +138,10 @@ EXTERN void avr32_boardinitialize(void); * returns an 8-bit bit set with each bit associated with a button. See the * BUTTON* definitions above for the meaning of each bit in the returned value. * + * NOTE: Nothing in the "base" NuttX code calls up_buttoninit(). If you want button + * support in an application, your application startup code must call up_buttoninit() + * prior to calling any of the other button interfaces. + * ************************************************************************************/ #ifdef CONFIG_ARCH_BUTTONS @@ -161,9 +168,15 @@ EXTERN uint8_t up_buttons(void); * called when BUTTON1/2 is depressed. The previous interrupt handler value is * returned (so that it may restored, if so desired). * + * Configuration Notes: + * Configuration CONFIG_AVR32_GPIOIRQ must be selected to enable the overall GPIO + * IRQ feature and CONFIG_AVR32_GPIOIRQSETA and/or CONFIG_AVR32_GPIOIRQSETB must + * be enabled to select GPIOs to support interrupts on. For button support, bits + * 2 and 3 must be set in CONFIG_AVR32_GPIOIRQSETB (PB2 and PB3). + * ************************************************************************************/ -#ifdef CONFIG_GPIOB_IRQ +#ifdef CONFIG_AVR32_GPIOIRQ EXTERN xcpt_t up_irqbutton1(xcpt_t irqhandler); EXTERN xcpt_t up_irqbutton2(xcpt_t irqhandler); #endif diff --git a/nuttx/configs/avr32dev1/ostest/defconfig b/nuttx/configs/avr32dev1/ostest/defconfig index 0068dae6e..234725b82 100755 --- a/nuttx/configs/avr32dev1/ostest/defconfig +++ b/nuttx/configs/avr32dev1/ostest/defconfig @@ -89,7 +89,7 @@ CONFIG_ARCH_INTERRUPTSTACK=n CONFIG_ARCH_STACKDUMP=y CONFIG_ARCH_BOOTLOADER=n CONFIG_ARCH_LEDS=y -CONFIG_ARCH_BUTTONS=n +CONFIG_ARCH_BUTTONS=y CONFIG_ARCH_CALIBRATION=n CONFIG_ARCH_DMA=n @@ -103,6 +103,10 @@ CONFIG_AVR32_AVRTOOLSL=n # # Individual subsystems can be enabled: # +# CONFIG_AVR32_GPIOIRQ - GPIO interrupt support +# CONFIG_AVR32_GPIOIRQSETA - Set of GPIOs on PORTA that support interrupts +# CONFIG_AVR32_GPIOIRQSETB - Set of GPIOs on PORTB that support interrupts +# # CONFIG_AVR32_USARTn - Enable support for USARTn # CONFIG_AVR32_USARTn_RS232 - Configure USARTn as an RS232 interface. # CONFIG_AVR32_USARTn_SPI - Configure USARTn as an SPI interface. @@ -113,6 +117,10 @@ CONFIG_AVR32_AVRTOOLSL=n # CONFIG_AVR32_USARTn_ISO786 - Configure USARTn as an ISO786 interface. # +CONFIG_AVR32_GPIOIRQ=y +CONFIG_AVR32_GPIOIRQSETA=0 +CONFIG_AVR32_GPIOIRQSETB=0x0000000c + CONFIG_AVR32_USART0=n CONFIG_AVR32_USART0_RS232=n CONFIG_AVR32_USART0_SPI=n diff --git a/nuttx/configs/avr32dev1/src/avr32dev1_internal.h b/nuttx/configs/avr32dev1/src/avr32dev1_internal.h index f46ed5516..1d3343127 100755 --- a/nuttx/configs/avr32dev1/src/avr32dev1_internal.h +++ b/nuttx/configs/avr32dev1/src/avr32dev1_internal.h @@ -43,11 +43,22 @@ #include #include +#include "at91uc3_config.h" /************************************************************************************ * Definitions ************************************************************************************/ +/* Configuration ********************************************************************/ + +#if (CONFIG_AVR32_GPIOIRQSETB & 4) == 1 +# define CONFIG_AVR32DEV_BUTTON1_IRQ 1 +#endif + +#if (CONFIG_AVR32_GPIOIRQSETB & 8) == 1 +# define CONFIG_AVR32DEV_BUTTON2_IRQ 1 +#endif + /* AVRDEV1 GPIO Pin Definitions *****************************************************/ /* LEDs * @@ -68,8 +79,23 @@ * PIN 25 PB3 KEY2 */ -#define PINMUX_GPIO_BUTTON1 (GPIO_ENABLE | GPIO_INPUT | GPIO_PORTB | 2) -#define PINMUX_GPIO_BUTTON2 (GPIO_ENABLE | GPIO_INPUT | GPIO_PORTB | 3) +#if CONFIG_AVR32DEV_BUTTON1_IRQ +# define PINMUX_GPIO_BUTTON1 (GPIO_ENABLE | GPIO_INPUT | GPIO_INTR | \ + GPIO_INTMODE_BOTH | GPIO_GLITCH | GPIO_PORTB | 2) +# define GPIO_BUTTON1_IRQ AVR32_IRQ_GPIO_PB2 +#else +# define PINMUX_GPIO_BUTTON1 (GPIO_ENABLE | GPIO_INPUT | GPIO_GLITCH | \ + GPIO_PORTB | 2) +#endif + +#if CONFIG_AVR32DEV_BUTTON2_IRQ +# define PINMUX_GPIO_BUTTON2 (GPIO_ENABLE | GPIO_INPUT | GPIO_INTR | \ + GPIO_INTMODE_BOTH | GPIO_GLITCH | GPIO_PORTB | 3) +# define GPIO_BUTTON2_IRQ AVR32_IRQ_GPIO_PB3 +#else +# define PINMUX_GPIO_BUTTON2 (GPIO_ENABLE | GPIO_INPUT | GPIO_GLITCH | \ + GPIO_PORTB | 3) +#endif /************************************************************************************ * Public Types diff --git a/nuttx/configs/avr32dev1/src/up_buttons.c b/nuttx/configs/avr32dev1/src/up_buttons.c index 37434d656..b891d8698 100755 --- a/nuttx/configs/avr32dev1/src/up_buttons.c +++ b/nuttx/configs/avr32dev1/src/up_buttons.c @@ -38,7 +38,9 @@ ****************************************************************************/ #include +#include "at91uc3_config.h" +#include #include #include @@ -59,9 +61,6 @@ * Private Data ****************************************************************************/ -static xcpt_t g_irqbutton1; -static xcpt_t g_irqbutton2; - /**************************************************************************** * Private Functions ****************************************************************************/ @@ -89,7 +88,7 @@ uint8_t up_buttons(void) uint8_t retval; retval = at91uc3_gpioread(PINMUX_GPIO_BUTTON1) ? 0 : BUTTON1; - retval |= sat91uc3_gpioread(PINMUX_GPIO_BUTTON2) ? 0 : BUTTON2; + retval |= at91uc3_gpioread(PINMUX_GPIO_BUTTON2) ? 0 : BUTTON2; return retval; } @@ -98,30 +97,33 @@ uint8_t up_buttons(void) * Name: up_irqbutton1 ****************************************************************************/ -#ifdef CONFIG_GPIOB_IRQ +#ifdef CONFIG_AVR32_GPIOIRQ xcpt_t up_irqbutton1(xcpt_t irqhandler) { +#ifdef CONFIG_AVR32DEV_BUTTON1_IRQ xcpt_t oldhandler; - irqstate_t flags; - - /* Disable interrupts until we are done */ - - flags = irqsave(); - /* Get the old button interrupt handler and save the new one */ + /* Attach the handler */ - oldhandler = g_irqbutton1; - g_irqbutton1 = irqhandler; + gpio_irqattach(GPIO_BUTTON1_IRQ, irqhandler, &oldhandler); - /* Configure and enable the interrupt */ + /* Enable/disable the interrupt */ -#warning "Missing Logic" - - irqrestore(flags); + if (irqhandler) + { + gpio_irqenable(GPIO_BUTTON1_IRQ); + } + else + { + gpio_irqdisable(GPIO_BUTTON1_IRQ); + } /* Return the old button handler (so that it can be restored) */ return oldhandler; +#else + return NULL; +#endif } #endif @@ -129,30 +131,33 @@ xcpt_t up_irqbutton1(xcpt_t irqhandler) * Name: up_irqbutton2 ****************************************************************************/ -#ifdef CONFIG_GPIOB_IRQ +#ifdef CONFIG_AVR32_GPIOIRQ xcpt_t up_irqbutton2(xcpt_t irqhandler) { +#ifdef CONFIG_AVR32DEV_BUTTON2_IRQ xcpt_t oldhandler; - irqstate_t flags; - /* Disable interrupts until we are done */ + /* Attach the handler */ - flags = irqsave(); + gpio_irqattach(GPIO_BUTTON2_IRQ, irqhandler, &oldhandler); - /* Get the old button interrupt handler and save the new one */ + /* Enable/disable the interrupt */ - oldhandler = g_irqbutton2; - g_irqbutton2 = irqhandler; - - /* Configure and enable the interrupt */ - -#warning "Missing Logic" - - irqrestore(flags); + if (irqhandler) + { + gpio_irqenable(GPIO_BUTTON2_IRQ); + } + else + { + gpio_irqdisable(GPIO_BUTTON2_IRQ); + } /* Return the old button handler (so that it can be restored) */ return oldhandler; +#else + return NULL; +#endif } #endif -- cgit v1.2.3