From 26ac9361e7192d639c27b48ef9f24d4f85f7d266 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Wed, 11 Mar 2015 14:41:58 -0600 Subject: [PATCH] SAMV7-XULT: Integrate button support and apps/examples/buttons into the NSH configuration --- configs/samv71-xult/README.txt | 34 +++++++++++++++++-- configs/samv71-xult/nsh/defconfig | 25 +++++++++++--- configs/samv71-xult/src/sam_buttons.c | 47 ++++++++++++++++++++++----- 3 files changed, 92 insertions(+), 14 deletions(-) diff --git a/configs/samv71-xult/README.txt b/configs/samv71-xult/README.txt index 46de8ec0b0..86ca768c3f 100644 --- a/configs/samv71-xult/README.txt +++ b/configs/samv71-xult/README.txt @@ -279,10 +279,39 @@ Configuration sub-directories 3. NSH built-in applications are supported. Binary Formats: - CONFIG_BUILTIN=y : Enable support for built-in programs + CONFIG_BUILTIN=y : Enable support for built-in programs Application Configuration: - CONFIG_NSH_BUILTIN_APPS=y : Enable starting apps from NSH command line + CONFIG_NSH_BUILTIN_APPS=y : Enable starting apps from NSH command line + + 3. The button test at apps/examples/buttons is included in the + configuration. This configuration illustrates (1) use of the buttons + on the evaluation board, and (2) the use of PIO interrupts. Example + usage: + + NuttShell (NSH) NuttX-7.8 + nsh> help + help usage: help [-v] [] + ... + Builtin Apps: + buttons + nsh> buttons 3 + maxbuttons: 3 + Attached handler at 4078f7 to button 0 [SW0], oldhandler:0 + Attached handler at 4078e9 to button 1 [SW1], oldhandler:0 + IRQ:125 Button 1:SW1 SET:00: + SW1 released + IRQ:125 Button 1:SW1 SET:02: + SW1 depressed + IRQ:125 Button 1:SW1 SET:00: + SW1 released + IRQ:90 Button 0:SW0 SET:01: + SW0 depressed + IRQ:90 Button 0:SW0 SET:00: + SW0 released + IRQ:125 Button 1:SW1 SET:02: + SW1 depressed + nsh> 4. Performance-related Configuration settings: @@ -290,5 +319,6 @@ Configuration sub-directories CONFIG_ARMV7M_DCACHE=y : Data cache is enabled CONFIG_ARCH_FPU=y : H/W floating point support is enabled CONFIG_ARCH_DPFPU=y : 64-bit H/W floating point support is enabled + # CONFIG_ARMV7M_ITCM is not set : Support not yet in place # CONFIG_ARMV7M_DTCM is not set : Support not yet in place diff --git a/configs/samv71-xult/nsh/defconfig b/configs/samv71-xult/nsh/defconfig index 6d08445870..13106ffd2b 100644 --- a/configs/samv71-xult/nsh/defconfig +++ b/configs/samv71-xult/nsh/defconfig @@ -225,7 +225,12 @@ CONFIG_SAMV7_UART3=y # CONFIG_SAMV7_USART2 is not set # CONFIG_SAMV7_WDT0 is not set # CONFIG_SAMV7_WDT1 is not set -# CONFIG_SAMV7_GPIO_IRQ is not set +CONFIG_SAMV7_GPIO_IRQ=y +CONFIG_SAMV7_GPIOA_IRQ=y +CONFIG_SAMV7_GPIOB_IRQ=y +# CONFIG_SAMV7_GPIOC_IRQ is not set +# CONFIG_SAMV7_GPIOD_IRQ is not set +# CONFIG_SAMV7_GPIOE_IRQ is not set # # Architecture Options @@ -296,8 +301,9 @@ CONFIG_ARCH_BOARD="samv71-xult" CONFIG_ARCH_HAVE_LEDS=y CONFIG_ARCH_LEDS=y CONFIG_ARCH_HAVE_BUTTONS=y -# CONFIG_ARCH_BUTTONS is not set +CONFIG_ARCH_BUTTONS=y CONFIG_ARCH_HAVE_IRQBUTTONS=y +CONFIG_ARCH_IRQBUTTONS=y CONFIG_NSH_MMCSDMINOR=0 # @@ -510,7 +516,6 @@ CONFIG_MCU_SERIAL=y CONFIG_STANDARD_SERIAL=y # CONFIG_SERIAL_IFLOWCONTROL is not set # CONFIG_SERIAL_OFLOWCONTROL is not set -# CONFIG_SERIAL_TIOCSERGSTRUCT is not set CONFIG_ARCH_HAVE_SERIAL_TERMIOS=y # CONFIG_SERIAL_TERMIOS is not set CONFIG_UART3_SERIAL_CONSOLE=y @@ -673,7 +678,19 @@ CONFIG_BUILTIN_PROXY_STACKSIZE=1024 # # Examples # -# CONFIG_EXAMPLES_BUTTONS is not set +CONFIG_EXAMPLES_BUTTONS=y +CONFIG_EXAMPLES_BUTTONS_MIN=0 +CONFIG_EXAMPLES_BUTTONS_MAX=1 +CONFIG_EXAMPLES_IRQBUTTONS_MIN=0 +CONFIG_EXAMPLES_IRQBUTTONS_MAX=1 +CONFIG_EXAMPLES_BUTTONS_NAME0="SW0" +CONFIG_EXAMPLES_BUTTONS_NAME1="SW1" +CONFIG_EXAMPLES_BUTTONS_NAME2="Button 2" +CONFIG_EXAMPLES_BUTTONS_NAME3="Button 3" +CONFIG_EXAMPLES_BUTTONS_NAME4="Button 4" +CONFIG_EXAMPLES_BUTTONS_NAME5="Button 5" +CONFIG_EXAMPLES_BUTTONS_NAME6="Button 6" +CONFIG_EXAMPLES_BUTTONS_NAME7="Button 7" # CONFIG_EXAMPLES_CAN is not set # CONFIG_EXAMPLES_CONFIGDATA is not set # CONFIG_EXAMPLES_CPUHOG is not set diff --git a/configs/samv71-xult/src/sam_buttons.c b/configs/samv71-xult/src/sam_buttons.c index 7be2dbae0b..b3836de278 100644 --- a/configs/samv71-xult/src/sam_buttons.c +++ b/configs/samv71-xult/src/sam_buttons.c @@ -48,8 +48,10 @@ #include #include +#include "up_arch.h" #include "sam_gpio.h" -#include "samv7i-xult.h" +#include "chip/sam_matrix.h" +#include "samv71-xult.h" #ifdef CONFIG_ARCH_BUTTONS @@ -61,10 +63,19 @@ * Private Data ****************************************************************************/ -#if defined(CONFIG_SAM34_GPIOA_IRQ) && defined(CONFIG_ARCH_IRQBUTTONS) +#define HAVE_IRQBUTTONS 1 +#if !defined(CONFIG_SAMV7_GPIO1_IRQ) && !defined(CONFIG_SAMV7_GPIOB_IRQ) +# undef HAVE_IRQBUTTONS +#endif + +#ifdef CONFIG_ARCH_IRQBUTTONS +#ifdef CONFIG_SAMV7_GPIOA_IRQ static xcpt_t g_irq_sw0; +#endif +#ifdef CONFIG_SAMV7_GPIOB_IRQ static xcpt_t g_irq_sw1; #endif +#endif /**************************************************************************** * Private Functions @@ -78,7 +89,7 @@ static xcpt_t g_irq_sw1; * ****************************************************************************/ -#if defined(CONFIG_SAM34_GPIOA_IRQ) && defined(CONFIG_ARCH_IRQBUTTONS) +#ifdef HAVE_IRQBUTTONS static xcpt_t board_button_irqx(gpio_pinset_t pinset, int irq, xcpt_t irqhandler, xcpt_t *store) { @@ -139,10 +150,18 @@ static xcpt_t board_button_irqx(gpio_pinset_t pinset, int irq, void board_button_initialize(void) { -#warning Missing logic - * - PB12 is set up as a system flash ERASE pin when the firmware boots. To - * use the SW1, PB12 has to be configured as a normal regular I/O pin in - * the MATRIX module. For more information see the SAM V71 datasheet. + uint32_t regval; + + /* PB12 is set up as a system flash ERASE pin when the firmware boots. To + * use the SW1, PB12 has to be configured as a normal regular I/O pin in + * the MATRIX module. For more information see the SAM V71 datasheet. + */ + + regval = getreg32(SAM_MATRIX_CCFG_SYSIO); + regval |= MATRIX_CCFG_SYSIO_SYSIO12; + putreg32(regval, SAM_MATRIX_CCFG_SYSIO); + + /* Configure button PIOs */ (void)sam_configgpio(GPIO_SW0); (void)sam_configgpio(GPIO_SW1); @@ -187,20 +206,32 @@ uint8_t board_buttons(void) * ****************************************************************************/ -#if defined(CONFIG_SAM34_GPIOA_IRQ) && defined(CONFIG_ARCH_IRQBUTTONS) +#ifdef CONFIG_ARCH_IRQBUTTONS xcpt_t board_button_irq(int id, xcpt_t irqhandler) { +#ifdef HAVE_IRQBUTTONS + switch (id) { +#ifdef CONFIG_SAMV7_GPIOA_IRQ case BUTTON_SW0: return board_button_irqx(GPIO_SW0, IRQ_SW0, irqhandler, &g_irq_sw0); +#endif +#ifdef CONFIG_SAMV7_GPIOB_IRQ case BUTTON_SW1: return board_button_irqx(GPIO_SW1, IRQ_SW1, irqhandler, &g_irq_sw1); +#endif default: return NULL; } + +#else + + return NULL; + +#endif } #endif