You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ma...@apache.org on 2021/10/17 08:30:07 UTC

[incubator-nuttx] branch master updated: boards: k210: Add initial gpio user space support

This is an automated email from the ASF dual-hosted git repository.

masayuki 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 5c15fe6  boards: k210: Add initial gpio user space support
5c15fe6 is described below

commit 5c15fe6ec104798cd656ea498abd0593d1c83f78
Author: Matheus Castello <ma...@castello.eng.br>
AuthorDate: Sun Oct 17 00:36:41 2021 -0300

    boards: k210: Add initial gpio user space support
    
    Signed-off-by: Matheus Castello <ma...@castello.eng.br>
---
 boards/risc-v/k210/maix-bit/include/board.h    |   5 +
 boards/risc-v/k210/maix-bit/src/Makefile       |   4 +
 boards/risc-v/k210/maix-bit/src/k210_bringup.c |  10 ++
 boards/risc-v/k210/maix-bit/src/k210_gpio.c    | 173 +++++++++++++++++++++++++
 boards/risc-v/k210/maix-bit/src/maix-bit.h     |   4 +
 5 files changed, 196 insertions(+)

diff --git a/boards/risc-v/k210/maix-bit/include/board.h b/boards/risc-v/k210/maix-bit/include/board.h
index 796c9e6..bf69b83 100644
--- a/boards/risc-v/k210/maix-bit/include/board.h
+++ b/boards/risc-v/k210/maix-bit/include/board.h
@@ -55,6 +55,11 @@
 #define LED_ASSERTION     6  /* N/C */
 #define LED_PANIC         7  /* blink */
 
+/* GPIO pins used by the GPIO Subsystem */
+
+#define BOARD_NGPIOOUT    2 /* Amount of GPIO Output pins */
+#define BOARD_NGPIOINT    0 /* Amount of GPIO Input */
+
 /****************************************************************************
  * Public Types
  ****************************************************************************/
diff --git a/boards/risc-v/k210/maix-bit/src/Makefile b/boards/risc-v/k210/maix-bit/src/Makefile
index e70a4d1..8c2db77 100644
--- a/boards/risc-v/k210/maix-bit/src/Makefile
+++ b/boards/risc-v/k210/maix-bit/src/Makefile
@@ -30,4 +30,8 @@ ifeq ($(CONFIG_ARCH_LEDS),y)
 CSRCS += k210_leds.c
 endif
 
+ifeq ($(CONFIG_DEV_GPIO),y)
+CSRCS += k210_gpio.c
+endif
+
 include $(TOPDIR)/boards/Board.mk
diff --git a/boards/risc-v/k210/maix-bit/src/k210_bringup.c b/boards/risc-v/k210/maix-bit/src/k210_bringup.c
index 2dc3d09..c722275 100644
--- a/boards/risc-v/k210/maix-bit/src/k210_bringup.c
+++ b/boards/risc-v/k210/maix-bit/src/k210_bringup.c
@@ -33,6 +33,7 @@
 #include <nuttx/fs/fs.h>
 
 #include "k210.h"
+#include "maix-bit.h"
 
 /****************************************************************************
  * Public Functions
@@ -56,5 +57,14 @@ int k210_bringup(void)
     }
 #endif
 
+#ifdef CONFIG_DEV_GPIO
+  ret = k210_gpio_init();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "Failed to initialize GPIO Driver: %d\n", ret);
+      return ret;
+    }
+#endif
+
   return ret;
 }
diff --git a/boards/risc-v/k210/maix-bit/src/k210_gpio.c b/boards/risc-v/k210/maix-bit/src/k210_gpio.c
new file mode 100644
index 0000000..0e631dc
--- /dev/null
+++ b/boards/risc-v/k210/maix-bit/src/k210_gpio.c
@@ -0,0 +1,173 @@
+/****************************************************************************
+ * boards/risc-v/k210/maix-bit/src/k210_gpio.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <syslog.h>
+#include <assert.h>
+#include <debug.h>
+#include <errno.h>
+
+#include <nuttx/irq.h>
+#include <arch/irq.h>
+
+#include <nuttx/ioexpander/gpio.h>
+
+#include <arch/board/board.h>
+
+#include "k210_fpioa.h"
+#include "k210_gpiohs.h"
+
+#if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_GPIO_LOWER_HALF)
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Pin 1 and 2 are used for this example as GPIO outputs. */
+
+#define GPIO_OUT1  12
+#define GPIO_OUT2  13
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct k210gpio_dev_s
+{
+  struct gpio_dev_s gpio;
+  uint8_t id;
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+#if BOARD_NGPIOOUT > 0
+static int gpout_read(FAR struct gpio_dev_s *dev, FAR bool *value);
+static int gpout_write(FAR struct gpio_dev_s *dev, bool value);
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+#if BOARD_NGPIOOUT > 0
+static const struct gpio_operations_s gpout_ops =
+{
+  .go_read   = gpout_read,
+  .go_write  = gpout_write,
+  .go_attach = NULL,
+  .go_enable = NULL,
+};
+
+/* This array maps the GPIO pins used as OUTPUT */
+
+static const uint32_t g_gpiooutputs[BOARD_NGPIOOUT] =
+{
+  GPIO_OUT1, GPIO_OUT2
+};
+
+static struct k210gpio_dev_s g_gpout[BOARD_NGPIOOUT];
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: gpout_read
+ ****************************************************************************/
+
+#if BOARD_NGPIOOUT > 0
+static int gpout_read(FAR struct gpio_dev_s *dev, FAR bool *value)
+{
+  FAR struct k210gpio_dev_s *k210gpio =
+    (FAR struct k210gpio_dev_s *)dev;
+
+  DEBUGASSERT(k210gpio != NULL && value != NULL);
+  DEBUGASSERT(k210gpio->id < BOARD_NGPIOOUT);
+  gpioinfo("Reading...\n");
+
+  *value = (int) k210_gpiohs_get_value(k210gpio->id + 1);
+  return OK;
+}
+
+/****************************************************************************
+ * Name: gpout_write
+ ****************************************************************************/
+
+static int gpout_write(FAR struct gpio_dev_s *dev, bool value)
+{
+  FAR struct k210gpio_dev_s *k210gpio =
+    (FAR struct k210gpio_dev_s *)dev;
+
+  DEBUGASSERT(k210gpio != NULL);
+  DEBUGASSERT(k210gpio->id < BOARD_NGPIOOUT);
+  gpioinfo("Writing %d\n", (int)value);
+
+  k210_gpiohs_set_value(k210gpio->id + 1, !value);
+
+  return OK;
+}
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: k210_gpio_init
+ ****************************************************************************/
+
+int k210_gpio_init(void)
+{
+  int i;
+  int pincount = 0;
+
+#if BOARD_NGPIOOUT > 0
+  for (i = 0; i < BOARD_NGPIOOUT; i++)
+    {
+      /* Setup and register the GPIO pin */
+
+      g_gpout[i].gpio.gp_pintype = GPIO_OUTPUT_PIN;
+      g_gpout[i].gpio.gp_ops     = &gpout_ops;
+      g_gpout[i].id              = i;
+      gpio_pin_register(&g_gpout[i].gpio, pincount);
+
+      /* Configure the pins that will be used as output */
+
+      k210_fpioa_config(g_gpiooutputs[i],
+                        (K210_IO_FUNC_GPIOHS1 + i) | K210_IOFLAG_GPIOHS);
+      k210_gpiohs_set_direction(i + 1, true);
+      k210_gpiohs_set_value(i + 1, true);
+
+      pincount++;
+    }
+#endif
+
+  return OK;
+}
+#endif /* CONFIG_DEV_GPIO && !CONFIG_GPIO_LOWER_HALF */
diff --git a/boards/risc-v/k210/maix-bit/src/maix-bit.h b/boards/risc-v/k210/maix-bit/src/maix-bit.h
index 9aec864..a0cb761 100644
--- a/boards/risc-v/k210/maix-bit/src/maix-bit.h
+++ b/boards/risc-v/k210/maix-bit/src/maix-bit.h
@@ -29,4 +29,8 @@
 
 int k210_bringup(void);
 
+#ifdef CONFIG_DEV_GPIO
+int k210_gpio_init(void);
+#endif
+
 #endif /* __BOARDS_RISCV_K210_MAIX_BIT_SRC_MAIX_BIT_H */