Add a button upper/lower half driver

This commit is contained in:
Gregory Nutt
2015-10-12 14:29:43 -06:00
parent e9bd8bceb4
commit 613798027e
10 changed files with 1110 additions and 9 deletions
+3
View File
@@ -11021,3 +11021,6 @@
(2015-10-9).
* fs/tmpfs: TMPFS file system is code complete and bascially functional
although it has not been heavilay tested (2015-10-9).
* drivers/input/buttons/c and include/nuttx/input/buttons.h: Add a
driver to support application access to board buttons (2015-10-12).
+1 -1
Submodule arch updated: 8a9c89d35a...9f6b9305b1
+16
View File
@@ -322,6 +322,22 @@ config STMPE811_REGDEBUG
endif # INPUT_STMPE811
config BUTTONS
bool "Button Inputs"
default n
depends on ARCH_BUTTONS
---help---
Enable standard button upper half driver.
if BUTTONS
config BUTTONS_NPOLLWAITERS
int "Max Number of Poll Waiters"
default 2
depends on !DISABLE_POLL
endif # BUTTONS
config DJOYSTICK
bool "Discrete Joystick"
default n
+4
View File
@@ -71,6 +71,10 @@ ifneq ($(CONFIG_INPUT_STMPE811_TEMP_DISABLE),y)
endif
endif
ifeq ($(CONFIG_BUTTONS),y)
CSRCS += buttons.c
endif
ifeq ($(CONFIG_DJOYSTICK),y)
CSRCS += djoystick.c
endif
+6 -6
View File
@@ -67,11 +67,11 @@
* Private Types
****************************************************************************/
/* This structure provides the state of one discrete joystick driver */
/* This structure provides the state of one analog joystick driver */
struct ajoy_upperhalf_s
{
/* Saved binding to the lower half discrete joystick driver */
/* Saved binding to the lower half analog joystick driver */
FAR const struct ajoy_lowerhalf_s *au_lower;
@@ -823,15 +823,15 @@ errout_with_dusem:
* Name: ajoy_register
*
* Description:
* Bind the lower half discrete joystick driver to an instance of the
* upper half discrete joystick driver and register the composite character
* Bind the lower half analog joystick driver to an instance of the
* upper half analog joystick driver and register the composite character
* driver as the specific device.
*
* Input Parameters:
* devname - The name of the discrete joystick device to be registers.
* devname - The name of the analog joystick device to be registers.
* This should be a string of the form "/priv/ajoyN" where N is the the
* minor device number.
* lower - An instance of the platform-specific discrete joystick lower
* lower - An instance of the platform-specific analog joystick lower
* half driver.
*
* Returned Values:
File diff suppressed because it is too large Load Diff
+8 -1
View File
@@ -77,7 +77,8 @@
#define _RTCBASE (0x1800) /* RTC ioctl commands */
#define _RELAYBASE (0x1900) /* Relay devices ioctl commands */
#define _CANBASE (0x1a00) /* CAN ioctl commands */
#define _BOARDBASE (0x1b00) /* boardctl ioctl commands */
#define _BTNBASE (0x1b00) /* Button ioctl commands */
#define _BOARDBASE (0x1c00) /* boardctl ioctl commands */
/* Macros used to manage ioctl commands */
@@ -336,6 +337,12 @@
#define _CANIOCVALID(c) (_IOC_TYPE(c)==_CANBASE)
#define _CANIOC(nr) _IOC(_CANBASE,nr)
/* Button driver ioctl definitions ******************************************/
/* (see nuttx/can.h */
#define _BTNIOCVALID(c) (_IOC_TYPE(c)==_BTNBASE)
#define _BTNIOC(nr) _IOC(_BTNBASE,nr)
/* boardctl() command definitions *******************************************/
#define _BOARDIOCVALID(c) (_IOC_TYPE(c)==_BOARDBASE)
+1 -1
View File
@@ -275,7 +275,7 @@ extern "C"
* driver as the specified device.
*
* Input Parameters:
* devname - The name of the analog joystick device to be registers.
* devname - The name of the analog joystick device to be registered.
* This should be a string of the form "/dev/ajoyN" where N is the the
* minor device number.
* lower - An instance of the platform-specific analog joystick lower
+185
View File
@@ -0,0 +1,185 @@
/************************************************************************************
* include/nuttx/input/buttons.h
*
* 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.
*
************************************************************************************/
#ifndef __INCLUDE_NUTTX_INPUT_BUTTONS_H
#define __INCLUDE_NUTTX_INPUT_BUTTONS_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/fs/ioctl.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Configuration ************************************************************/
#ifndef CONFIG_BUTTONS_NPOLLWAITERS
# define CONFIG_BUTTONS_NPOLLWAITERS 2
#endif
/* ioctl commands */
/* Command: BTNIOC_SUPPORTED
* Description: Report the set of button events supported by the hardware;
* Argument: A pointer to writeable btn_buttonset_t value in which to
* return the set of supported buttons.
* Return: Zero (OK) on success. Minus one will be returned on failure
* with the errno value set appropriately.
*/
#define BTNIOC_SUPPORTED _BTNIOC(0x0001)
/* Command: BTNIOC_REGISTER
* Description: Register to receive a signal whenever there is a change in
* the state of button inputs. This feature, of course, depends
* upon interrupt GPIO support from the platform.
* Argument: A read-only pointer to an instance of struct btn_notify_s
* Return: Zero (OK) on success. Minus one will be returned on failure
* with the errno value set appropriately.
*/
#define BTNIOC_REGISTER _BTNIOC(0x0002)
/****************************************************************************
* Public Types
****************************************************************************/
/* This type is a bit set that contains the state of all buttons as defined
* in arch/board/board.h. This is the value that is returned when reading
* from the button driver.
*/
typedef uint8_t btn_buttonset_t;
/* A reference to this structure is provided with the BTNIOC_REGISTER IOCTL
* command and describes the conditions under which the client would like
* to receive notification.
*/
struct btn_notify_s
{
btn_buttonset_t bn_press; /* Set of button depressions to be notified */
btn_buttonset_t bn_release; /* Set of button releases to be notified */
uint8_t bn_signo; /* Signal number to use in the notification */
};
/* This is the type of the button interrupt handler used with the struct
* btn_lowerhalf_s enable() method.
*/
struct btn_lowerhalf_s;
typedef CODE void (*btn_handler_t)
(FAR const struct btn_lowerhalf_s *lower, FAR void *arg);
/* The button driver is a two-part driver:
*
* 1) A common upper half driver that provides the common user interface to
* the buttons,
* 2) Platform-specific lower half drivers that provide the interface
* between the common upper half and the platform discrete button inputs.
*
* This structure defines the interface between an instance of the lower
* half driver and the common upper half driver. Such an instance is
* passed to the upper half driver when the driver is initialized, binding
* the upper and lower halves into one driver.
*/
struct btn_lowerhalf_s
{
/* Return the set of buttons supported by the board */
CODE btn_buttonset_t (*bl_supported)(FAR const struct btn_lowerhalf_s *lower);
/* Return the current state of button data (only) */
CODE btn_buttonset_t (*bl_buttons)(FAR const struct btn_lowerhalf_s *lower);
/* Enable interrupts on the selected set of buttons. An empty set will
* disable all interrupts.
*/
CODE void (*bl_enable)(FAR const struct btn_lowerhalf_s *lower,
btn_buttonset_t press, btn_buttonset_t release,
btn_handler_t handler, FAR void *arg);
};
/****************************************************************************
* Public Data
****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
/****************************************************************************
* Name: btn_register
*
* Description:
* Bind the lower half button driver to an instance of the upper half
* button driver and register the composite character driver as the
* specified device.
*
* Input Parameters:
* devname - The name of the button device to be registered.
* This should be a string of the form "/dev/btnN" where N is the the
* minor device number.
* lower - An instance of the platform-specific button lower half driver.
*
* Returned Values:
* Zero (OK) is returned on success. Otherwise a negated errno value is
* returned to indicate the nature of the failure.
*
****************************************************************************/
int btn_register(FAR const char *devname,
FAR const struct btn_lowerhalf_s *lower);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __INCLUDE_NUTTX_INPUT_BUTTONS_H */
+4
View File
@@ -688,6 +688,8 @@ int main(int argc, char **argv, char **envp)
else if (line[n+1] == ')')
{
/* REVISIT: This gives false alarms on syntax like *--ptr */
if (line[n-1] != ' ')
{
fprintf(stderr,
@@ -748,6 +750,8 @@ int main(int argc, char **argv, char **envp)
n++;
}
/* REVISIT: This gives false alarms on syntax like *--ptr */
if (line[curr] != '-' && line[next] != ' ' && line[next] != '\n')
{
fprintf(stderr,