PIC32MZ Starter Kit: Add support for on-board buttons

This commit is contained in:
Gregory Nutt 2015-03-02 10:01:10 -06:00
parent 7621e9ed22
commit 2ac70b053b
6 changed files with 213 additions and 3 deletions

View File

@ -573,6 +573,8 @@ config ARCH_BOARD_PIC32MZ_STARTERKIT
bool "Microchip PIC32MZ Ethernet Starter Kit ((DM320006)" bool "Microchip PIC32MZ Ethernet Starter Kit ((DM320006)"
depends on ARCH_CHIP_PIC32MZ2048ECH || ARCH_CHIP_PIC32MZ2048ECM depends on ARCH_CHIP_PIC32MZ2048ECH || ARCH_CHIP_PIC32MZ2048ECM
select ARCH_HAVE_LEDS select ARCH_HAVE_LEDS
select ARCH_HAVE_BUTTONS
select ARCH_HAVE_IRQBUTTONS if PIC32MZ_GPIOIRQ_PORTB
---help--- ---help---
This is the port of NuttX to the Microchip PIC32MZ Embedded This is the port of NuttX to the Microchip PIC32MZ Embedded
Connectivity (EC) Starter Kit. There are two configurations of the Connectivity (EC) Starter Kit. There are two configurations of the

View File

@ -229,6 +229,15 @@
* are grounded when pressed. * are grounded when pressed.
*/ */
#define BUTTON_SW1 0
#define BUTTON_SW2 1
#define BUTTON_SW3 2
#define NUM_BUTTONS 3
#define BUTTON_SW1_BIT (1 << BUTTON_SW1)
#define BUTTON_SW2_BIT (1 << BUTTON_SW2)
#define BUTTON_SW3_BIT (1 << BUTTON_SW3)
/* UARTS ********************************************************************/ /* UARTS ********************************************************************/
/* If the PIC32MZEC Adaptor Board is connected, then UART1 signals are /* If the PIC32MZEC Adaptor Board is connected, then UART1 signals are
* available at these locations on the adaptor board: * available at these locations on the adaptor board:

View File

@ -147,6 +147,7 @@ CONFIG_PIC32MZ_UART1=y
# CONFIG_PIC32MZ_CAN2 is not set # CONFIG_PIC32MZ_CAN2 is not set
# CONFIG_PIC32MZ_ETHERNET is not set # CONFIG_PIC32MZ_ETHERNET is not set
# CONFIG_PIC32MZ_CTMU is not set # CONFIG_PIC32MZ_CTMU is not set
# CONFIG_PIC32MZ_GPIOIRQ is not set
# CONFIG_PIC32MZ_T1_SOSC is not set # CONFIG_PIC32MZ_T1_SOSC is not set
# #
@ -240,6 +241,8 @@ CONFIG_ARCH_BOARD="pic32mz-starterkit"
# #
CONFIG_ARCH_HAVE_LEDS=y CONFIG_ARCH_HAVE_LEDS=y
CONFIG_ARCH_LEDS=y CONFIG_ARCH_LEDS=y
CONFIG_ARCH_HAVE_BUTTONS=y
# CONFIG_ARCH_BUTTONS is not set
CONFIG_NSH_MMCSDMINOR=0 CONFIG_NSH_MMCSDMINOR=0
CONFIG_NSH_MMCSDSLOTNO=0 CONFIG_NSH_MMCSDSLOTNO=0
@ -745,6 +748,7 @@ CONFIG_NSH_BUILTIN_APPS=y
# CONFIG_NSH_DISABLE_MKRD is not set # CONFIG_NSH_DISABLE_MKRD is not set
# CONFIG_NSH_DISABLE_MH is not set # CONFIG_NSH_DISABLE_MH is not set
# CONFIG_NSH_DISABLE_MOUNT is not set # CONFIG_NSH_DISABLE_MOUNT is not set
# CONFIG_NSH_DISABLE_MV is not set
# CONFIG_NSH_DISABLE_MW is not set # CONFIG_NSH_DISABLE_MW is not set
# CONFIG_NSH_DISABLE_PS is not set # CONFIG_NSH_DISABLE_PS is not set
# CONFIG_NSH_DISABLE_PUT is not set # CONFIG_NSH_DISABLE_PUT is not set

View File

@ -46,6 +46,10 @@ else
CSRCS += pic32mz_userleds.c CSRCS += pic32mz_userleds.c
endif endif
ifeq ($(CONFIG_ARCH_BUTTONS),y)
CSRCS += pic32mz_buttons.c
endif
ifeq ($(CONFIG_NSH_ARCHINIT),y) ifeq ($(CONFIG_NSH_ARCHINIT),y)
CSRCS += pic32mz_nsh.c CSRCS += pic32mz_nsh.c
endif endif

View File

@ -146,6 +146,13 @@
* are grounded when pressed. * are grounded when pressed.
*/ */
#define GPIO_SW_1 (GPIO_INPUT | GPIO_INTERRUPT | GPIO_PULLUP | \
GPIO_PORTB | GPIO_PIN12)
#define GPIO_SW_2 (GPIO_INPUT | GPIO_INTERRUPT | GPIO_PULLUP | \
GPIO_PORTB | GPIO_PIN13)
#define GPIO_SW_3 (GPIO_INPUT | GPIO_INTERRUPT | GPIO_PULLUP | \
GPIO_PORTB | GPIO_PIN14)
/**************************************************************************** /****************************************************************************
* Public Types * Public Types
****************************************************************************/ ****************************************************************************/

View File

@ -0,0 +1,184 @@
/****************************************************************************
* configs/pic32mz-starterkit/src/pic32mz_buttons.c
*
* Copyright (C) 2015 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
#include <nuttx/arch.h>
#include <nuttx/board.h>
#include <arch/board/board.h>
#include "pic32mz-gpio.h"
#include "pic32mz-starterkit.h"
#ifdef CONFIG_ARCH_BUTTONS
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
/* Pin configuration for each start kit switch. This array is indexed by
* the BUTTON_* definitions in board.h
*/
static const pinset_t g_buttons[NUM_BUTTONS] =
{
GPIO_SW_1, GPIO_SW_2, GPIO_SW_3
};
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: board_button_initialize
*
* Description:
* board_button_initialize() must be called to initialize button resources.
* After that, board_buttons() may be called to collect the current state
* of all buttons or board_button_irq() may be called to register button
* interrupt handlers.
*
****************************************************************************/
void board_button_initialize(void)
{
int i;
/* Configure the GPIO pins as inputs. NOTE that EXTI interrupts are
* configured for all pins.
*/
for (i = 0; i < NUM_BUTTONS; i++)
{
pic32mz_configgpio(g_buttons[i]);
}
}
/****************************************************************************
* Name: board_buttons
****************************************************************************/
uint8_t board_buttons(void)
{
uint8_t ret = 0;
int i;
/* Check that state of each key */
for (i = 0; i < NUM_BUTTONS; i++)
{
/* A LOW value means that the key is pressed. */
bool released = pic32mz_gpioread(g_buttons[i]);
/* Accumulate the set of depressed (not released) keys */
if (!released)
{
ret |= (1 << i);
}
}
return ret;
}
/*****************************************************************************
* Button interrupt support.
*
* Description:
* board_button_initialize() must be called to initialize button resources.
* After that, board_buttons() may be called to collect the current state
* of all buttons or board_button_irq() may be called to register button
* interrupthandlers.
*
* After board_button_initialize() has been called, board_buttons() may be
* called to collect the state of all buttons. board_buttons() returns an
* 8-bit bit set with each bit associated with a button. See the
* BUTTON_*_BIT definitions in board.h for the meaning of each bit.
*
* board_button_irq() may be called to register an interrupt handler that
* will be called when a button is depressed or released. The ID value is
* a button enumeration value that uniquely identifies a button resource.
* See the BUTTON_* definitions in board.h for the meaning of enumeration
* value. The previous interrupt handler address is returned (so that it
* may restored, if so desired).
*
*****************************************************************************/
#ifdef CONFIG_ARCH_IRQBUTTONS
xcpt_t board_button_irq(int id, xcpt_t irqhandler)
{
#ifdef CONFIG_PIC32MZ_GPIOIRQ_PORTB
xcpt_t oldhandler = NULL;
if ((unsigned)id < NUM_BUTTONS)
{
/* Perform the attach/detach operation */
oldhandler = pic32mz_gpioattach(g_buttons[id], irqhandler);
/* The interrupt is now disabled. Are we attaching or detaching from
* button interrupt?
*/
if (irqhandler)
{
/* Attaching... enable button interrupts now */
pic32mz_gpioirqenable(g_buttons[id]);
}
}
return oldhandler;
#else
return NULL;
#endif
}
#endif
#endif /* CONFIG_ARCH_BUTTONS */