You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ag...@apache.org on 2020/07/14 22:34:15 UTC
[incubator-nuttx] branch master updated: Add buttons support to
iMXRT1060
This is an automated email from the ASF dual-hosted git repository.
aguettouche pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new bc95500 Add buttons support to iMXRT1060
bc95500 is described below
commit bc95500babc5465a74689eb200c404cd4bb31fef
Author: Dave Marples <da...@marples.net>
AuthorDate: Tue Jul 14 18:37:34 2020 -0300
Add buttons support to iMXRT1060
---
arch/arm/src/imxrt/hardware/imxrt_gpio.h | 3 ++
arch/arm/src/imxrt/imxrt_gpio.h | 17 ++++++--
arch/arm/src/imxrt/imxrt_gpioirq.c | 40 +++++++++++------
boards/arm/imxrt/imxrt1060-evk/src/imxrt1060-evk.h | 14 +++---
boards/arm/imxrt/imxrt1060-evk/src/imxrt_bringup.c | 18 ++++++++
boards/arm/imxrt/imxrt1060-evk/src/imxrt_buttons.c | 50 ++++++++++++++++++----
6 files changed, 109 insertions(+), 33 deletions(-)
diff --git a/arch/arm/src/imxrt/hardware/imxrt_gpio.h b/arch/arm/src/imxrt/hardware/imxrt_gpio.h
index fd87465..2d63141 100644
--- a/arch/arm/src/imxrt/hardware/imxrt_gpio.h
+++ b/arch/arm/src/imxrt/hardware/imxrt_gpio.h
@@ -90,4 +90,7 @@
#define GPIO_ICR_MASK(n) (3 << GPIO_ICR_SHIFT(n))
#define GPIO_ICR(i,n) ((uint32_t)(i) << GPIO_ICR_SHIFT(n))
+#define GPIO_EDGE_MASK(n) (1 << n)
+#define GPIO_EDGE(i,n) ((uint32_t)(i) << n)
+
#endif /* __ARCH_ARM_SRC_IMXRT_HARDWARE_IMXRT_GPIO_H */
diff --git a/arch/arm/src/imxrt/imxrt_gpio.h b/arch/arm/src/imxrt/imxrt_gpio.h
index 56c28e7..aad7e22 100644
--- a/arch/arm/src/imxrt/imxrt_gpio.h
+++ b/arch/arm/src/imxrt/imxrt_gpio.h
@@ -58,8 +58,8 @@
* 3322 2222 2222 1111 1111 1100 0000 0000
* 1098 7654 3210 9876 5432 1098 7654 3210
* ENCODING IIXX XXXX XXXX XXXX MMMM MMMM MMMM MMMM
- * GPIO INPUT 00.. .EEG GGGP PPPP MMMM MMMM MMMM MMMM
- * INT INPUT 11.. .EEG GGGP PPPP MMMM MMMM MMMM MMMM
+ * GPIO INPUT 00.. BEEG GGGP PPPP MMMM MMMM MMMM MMMM
+ * INT INPUT 11.. BEEG GGGP PPPP MMMM MMMM MMMM MMMM
* GPIO OUTPUT 01V. ..SG GGGP PPPP MMMM MMMM MMMM MMMM
* PERIPHERAL 10AA AAS. IIII IIII MMMM MMMM MMMM MMMM
*/
@@ -95,7 +95,7 @@
*/
#define GPIO_PORT_SHIFT (21) /* Bits 21-23: GPIO port index */
-#define GPIO_PORT_MASK (15 << GPIO_PORT_SHIFT)
+#define GPIO_PORT_MASK (7 << GPIO_PORT_SHIFT)
# define GPIO_PORT1 (GPIO1 << GPIO_PORT_SHIFT) /* GPIO1 */
# define GPIO_PORT2 (GPIO2 << GPIO_PORT_SHIFT) /* GPIO2 */
# define GPIO_PORT3 (GPIO3 << GPIO_PORT_SHIFT) /* GPIO3 */
@@ -195,6 +195,17 @@
# define GPIO_INT_RISINGEDGE (GPIO_ICR_RISINGEDGE << GPIO_INTCFG_SHIFT)
# define GPIO_INT_FALLINGEDGE (GPIO_ICR_FALLINGEDGE << GPIO_INTCFG_SHIFT)
+/* Interrupt on both edges configuration
+ *
+ * 3322 2222 2222 1111 1111 1100 0000 0000
+ * 1098 7654 3210 9876 5432 1098 7654 3210
+ * INT INPUT 11.. B... .... .... .... .... .... ....
+ */
+
+#define GPIO_INTBOTHCFG_SHIFT (27) /* Bit 27: Interrupt both edges configuration */
+#define GPIO_INTBOTHCFG_MASK (1 << GPIO_INTBOTHCFG_SHIFT)
+# define GPIO_INTBOTH_EDGES (1 << GPIO_INTBOTHCFG_SHIFT)
+
/* Pad Mux Register Index:
*
* 3322 2222 2222 1111 1111 1100 0000 0000
diff --git a/arch/arm/src/imxrt/imxrt_gpioirq.c b/arch/arm/src/imxrt/imxrt_gpioirq.c
index 92d647b..cca24f4 100644
--- a/arch/arm/src/imxrt/imxrt_gpioirq.c
+++ b/arch/arm/src/imxrt/imxrt_gpioirq.c
@@ -617,18 +617,21 @@ static int imxrt_gpio5_16_31_interrupt(int irq, FAR void *context,
return OK;
}
+
#endif
+
/****************************************************************************
* Public Functions
****************************************************************************/
-/************************************************************************************
+/****************************************************************************
* Name: imxrt_gpioirq_initialize
*
* Description:
- * Initialize logic to support a second level of interrupt decoding for GPIO pins.
+ * Initialize logic to support a second level of interrupt decoding for
+ * GPIO pins.
*
- ************************************************************************************/
+ ****************************************************************************/
void imxrt_gpioirq_initialize(void)
{
@@ -695,7 +698,7 @@ void imxrt_gpioirq_initialize(void)
#ifdef CONFIG_IMXRT_GPIO2_0_15_IRQ
DEBUGVERIFY(irq_attach(IMXRT_IRQ_GPIO2_0_15,
- imxrt_gpio2_0_15_interrupt,NULL));
+ imxrt_gpio2_0_15_interrupt, NULL));
up_enable_irq(IMXRT_IRQ_GPIO2_0_15);
#endif
@@ -744,13 +747,13 @@ void imxrt_gpioirq_initialize(void)
#endif
}
-/************************************************************************************
+/****************************************************************************
* Name: imxrt_gpioirq_configure
*
* Description:
* Configure an interrupt for the specified GPIO pin.
*
- ************************************************************************************/
+ ****************************************************************************/
int imxrt_gpioirq_configure(gpio_pinset_t pinset)
{
@@ -759,12 +762,15 @@ int imxrt_gpioirq_configure(gpio_pinset_t pinset)
uintptr_t regaddr;
uint32_t regval;
uint32_t icr;
+ uint32_t bothedge;
/* Decode information in the pin configuration */
- port = ((unsigned int)pinset & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT;
- pin = ((unsigned int)pinset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT;
- icr = ((uint32_t)pinset & GPIO_INTCFG_MASK) >> GPIO_INTCFG_SHIFT;
+ port = ((unsigned int)pinset & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT;
+ pin = ((unsigned int)pinset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT;
+ icr = ((uint32_t)pinset & GPIO_INTCFG_MASK) >> GPIO_INTCFG_SHIFT;
+ bothedge = ((uint32_t)pinset & GPIO_INTBOTHCFG_MASK) >>
+ GPIO_INTBOTHCFG_SHIFT;
/* Set the right field in the right ICR register */
@@ -774,16 +780,24 @@ int imxrt_gpioirq_configure(gpio_pinset_t pinset)
regval |= GPIO_ICR(icr, pin);
putreg32(regval, regaddr);
+ /* Add any both-edge setup (overrides above see User Manual 12.5.9) */
+
+ regaddr = IMXRT_GPIO_EDGE(port);
+ regval = getreg32(regaddr);
+ regval &= ~GPIO_EDGE_MASK(pin);
+ regval |= GPIO_EDGE(bothedge, pin);
+ putreg32(regval, regaddr);
+
return OK;
}
-/************************************************************************************
+/****************************************************************************
* Name: imxrt_gpioirq_enable
*
* Description:
* Enable the interrupt for specified GPIO IRQ
*
- ************************************************************************************/
+ ****************************************************************************/
int imxrt_gpioirq_enable(int irq)
{
@@ -800,13 +814,13 @@ int imxrt_gpioirq_enable(int irq)
return ret;
}
-/************************************************************************************
+/****************************************************************************
* Name: imxrt_gpioirq_disable
*
* Description:
* Disable the interrupt for specified GPIO IRQ
*
- ************************************************************************************/
+ ****************************************************************************/
int imxrt_gpioirq_disable(int irq)
{
diff --git a/boards/arm/imxrt/imxrt1060-evk/src/imxrt1060-evk.h b/boards/arm/imxrt/imxrt1060-evk/src/imxrt1060-evk.h
index 87ddbb9..eb6e011 100644
--- a/boards/arm/imxrt/imxrt1060-evk/src/imxrt1060-evk.h
+++ b/boards/arm/imxrt/imxrt1060-evk/src/imxrt1060-evk.h
@@ -88,17 +88,19 @@
#define GPIO_LED (GPIO_OUTPUT | IOMUX_LED_DEFAULT | \
GPIO_OUTPUT_ZERO | GPIO_PORT1 | GPIO_PIN9) /* AD_BO_09 */
-/* Buttons ****************************************************************/
+/* Buttons ******************************************************************/
/* The IMXRT board has one external user button
*
* 1. SW8 (IRQ88) GPIO5-00
*/
-#define GPIO_SW8 (GPIO_INTERRUPT | GPIO_INT_FALLINGEDGE | \
+#define GPIO_SW8 (GPIO_INTERRUPT | GPIO_INTBOTH_EDGES | \
IOMUX_SW_DEFAULT | \
GPIO_PORT5 | GPIO_PIN0) /* WAKEUP */
+#define GPIO_SW8_INT (_IMXRT_GPIO5_0_15_BASE+0)
+
/* LCD Backlight */
#define GPIO_LCD_BL (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | GPIO_PORT2 | \
@@ -177,7 +179,7 @@
#define GPIO_FT5X06_CTRSTn (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | \
GPIO_PORT1 | GPIO_PIN2 | IOMUX_FT5X06_RST) /* AD_B0_02 */
-/* Test Pins **************************************************************/
+/* Test Pins ****************************************************************/
#define BOARD_NGPIOIN 0 /* Amount of GPIO Input pins */
#define BOARD_NGPIOOUT 4 /* Amount of GPIO Output pins */
@@ -210,10 +212,6 @@
#ifndef __ASSEMBLY__
/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
* Name: imxrt_bringup
*
* Description:
@@ -235,7 +233,7 @@ int imxrt_bringup(void);
void imxrt_spidev_initialize(void);
-/*****************************************************************************
+/****************************************************************************
* Name: imxrt_mmcsd_spi_initialize
*
* Description:
diff --git a/boards/arm/imxrt/imxrt1060-evk/src/imxrt_bringup.c b/boards/arm/imxrt/imxrt1060-evk/src/imxrt_bringup.c
index ef41376..8584f9e 100644
--- a/boards/arm/imxrt/imxrt1060-evk/src/imxrt_bringup.c
+++ b/boards/arm/imxrt/imxrt1060-evk/src/imxrt_bringup.c
@@ -49,6 +49,7 @@
#include <nuttx/video/fb.h>
#include <imxrt_lpi2c.h>
#include <imxrt_lpspi.h>
+#include <nuttx/input/buttons.h>
#ifdef CONFIG_IMXRT_USDHC
# include "imxrt_usdhc.h"
@@ -238,6 +239,23 @@ int imxrt_bringup(void)
imxrt_lcd_initialize();
#endif
+#ifdef CONFIG_BUTTONS
+#ifdef CONFIG_BUTTONS_LOWER
+ /* Register the BUTTON driver */
+
+ ret = btn_lower_initialize("/dev/buttons");
+ if (ret != OK)
+ {
+ syslog(LOG_ERR, "ERROR: btn_lower_initialize() failed: %d\n", ret);
+ return ret;
+ }
+#else
+ /* Enable BUTTON support for some other purpose */
+
+ board_button_initialize();
+#endif /* CONFIG_BUTTONS_LOWER */
+#endif /* CONFIG_BUTTONS */
+
#ifdef CONFIG_VIDEO_FB
/* Initialize and register the framebuffer driver */
diff --git a/boards/arm/imxrt/imxrt1060-evk/src/imxrt_buttons.c b/boards/arm/imxrt/imxrt1060-evk/src/imxrt_buttons.c
index 75e4f4c..ae38e0c 100644
--- a/boards/arm/imxrt/imxrt1060-evk/src/imxrt_buttons.c
+++ b/boards/arm/imxrt/imxrt1060-evk/src/imxrt_buttons.c
@@ -4,6 +4,7 @@
* Copyright (C) 2018 Gregory Nutt. All rights reserved.
* Authors: Gregory Nutt <gn...@nuttx.org>
* David Sidrane <da...@nscdg.com>
+ * Dave Marples <da...@marples.net>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -65,6 +66,15 @@
* 1. SW8 (IRQ88) GPIO5-00
*/
+const uint32_t gpio_pins[NUM_BUTTONS] =
+ {
+ GPIO_SW8
+ };
+const uint32_t gpio_pins_int[NUM_BUTTONS] =
+ {
+ GPIO_SW8_INT
+ };
+
/****************************************************************************
* Public Functions
****************************************************************************/
@@ -82,9 +92,15 @@
uint32_t board_button_initialize(void)
{
- /* Configure the button as input */
+ uint32_t i;
+
+ /* Configure the buttons as input */
+
+ for (i = 0; i < NUM_BUTTONS; i++)
+ {
+ imxrt_config_gpio(gpio_pins[i]);
+ }
- imxrt_config_gpio(GPIO_SW8);
return NUM_BUTTONS;
}
@@ -102,10 +118,11 @@ uint32_t board_button_initialize(void)
uint8_t board_buttons(void)
{
uint8_t ret = 0;
+ uint8_t i = 0;
- if (!imxrt_gpio_read(GPIO_SW8))
+ for (i = 0; i < NUM_BUTTONS; i++)
{
- ret |= BUTTON_SW8_BIT;
+ ret |= ((!imxrt_gpio_read(gpio_pins[i])) << i);
}
return ret;
@@ -124,7 +141,7 @@ uint8_t board_buttons(void)
****************************************************************************/
#ifdef CONFIG_ARCH_IRQBUTTONS
-int board_button_irq(int id, xcpt_t irqhandler)
+int board_button_irq(int id, xcpt_t irqhandler, FAR void *arg)
{
int ret = -EINVAL;
@@ -134,11 +151,26 @@ int board_button_irq(int id, xcpt_t irqhandler)
* Attach the new button handler.
*/
- ret = irq_attach(id, irqhandler, NULL);
-
- /* Then make sure that interrupts are enabled on the pin */
+ if (id < NUM_BUTTONS)
+ {
+ uint32_t irqnum = gpio_pins_int[id];
+ if (irqhandler)
+ {
+ ret = irq_attach(irqnum, irqhandler, arg);
+ imxrt_gpioirq_enable (irqnum);
+
+ /* Then make sure that interrupts are enabled on the pin */
+
+ up_enable_irq(irqnum);
+ }
+ else
+ {
+ up_disable_irq(irqnum);
+ imxrt_gpioirq_disable(irqnum);
+ ret = OK;
+ }
+ }
- up_enable_irq(id);
return ret;
}
#endif