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

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 7223ec3dbe add support to userleds
7223ec3dbe is described below

commit 7223ec3dbe4c6db0c4b09bb1b1493ccaabbf176e
Author: halyssonJr <halysson1...@gmail.com>
AuthorDate: Sun Jul 7 16:25:27 2024 -0300

    add support to userleds
---
 boards/Kconfig                                     |   1 +
 .../arm/rp2040/seeed-xiao-rp2040/include/board.h   |  56 +++++-
 boards/arm/rp2040/seeed-xiao-rp2040/src/Make.defs  |   6 +
 .../rp2040/seeed-xiao-rp2040/src/rp2040_autoleds.c | 180 +++++++++++++++++
 .../seeed-xiao-rp2040/src/rp2040_boardinitialize.c |  14 +-
 .../rp2040/seeed-xiao-rp2040/src/rp2040_bringup.c  |  15 ++
 .../arm/rp2040/seeed-xiao-rp2040/src/rp2040_gpio.c |  10 +-
 .../arm/rp2040/seeed-xiao-rp2040/src/rp2040_pico.h |   6 +
 .../rp2040/seeed-xiao-rp2040/src/rp2040_userleds.c | 224 +++++++++++++++++++++
 9 files changed, 505 insertions(+), 7 deletions(-)

diff --git a/boards/Kconfig b/boards/Kconfig
index dc90052624..49dcb4b655 100644
--- a/boards/Kconfig
+++ b/boards/Kconfig
@@ -1900,6 +1900,7 @@ config ARCH_BOARD_ADAFRUIT_FEATHER_RP2040
 config ARCH_BOARD_SEEED_XIAO_RP2040
        bool "Seeed Studio XIAO RP2040 board"
        depends on ARCH_CHIP_RP2040
+       select ARCH_HAVE_LEDS
        ---help---
                This is a port to the Seeed Studio XIAO RP2040 board.
                Support is derived from Raspberry Pi Pico support.
diff --git a/boards/arm/rp2040/seeed-xiao-rp2040/include/board.h 
b/boards/arm/rp2040/seeed-xiao-rp2040/include/board.h
index 58b0f5a607..99f1330ad4 100644
--- a/boards/arm/rp2040/seeed-xiao-rp2040/include/board.h
+++ b/boards/arm/rp2040/seeed-xiao-rp2040/include/board.h
@@ -62,11 +62,63 @@
 
 /* GPIO definitions *********************************************************/
 
-#define BOARD_GPIO_LED_PIN      25
-#define BOARD_NGPIOOUT          1
+#define BOARD_GPIO_LED_PIN_B  25
+#define BOARD_GPIO_LED_PIN_R  17
+#define BOARD_GPIO_LED_PIN_G  16
+
+#define BOARD_NGPIOOUT          3
 #define BOARD_NGPIOIN           1
 #define BOARD_NGPIOINT          1
 
+/* LED definitions **********************************************************/
+
+/* If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs
+ * in any way. The following definitions are used to access individual LEDs.
+ */
+
+/* LED index values for use with board_userled() */
+
+#define BOARD_LED1        0
+#define BOARD_LED2        1
+#define BOARD_LED3        2
+
+#define BOARD_NLEDS       3
+
+#define BOARD_LED_BLUE    BOARD_LED1
+#define BOARD_LED_RED     BOARD_LED2
+#define BOARD_LED_GREEN   BOARD_LED3
+
+/* LED bits for use with board_userled_all() */
+
+#define BOARD_LED1_BIT    (1 << BOARD_LED1)
+#define BOARD_LED2_BIT    (1 << BOARD_LED2)
+#define BOARD_LED3_BIT    (1 << BOARD_LED3)
+
+/* This LED is not used by the board port unless CONFIG_ARCH_LEDS is
+ * defined.  In that case, the usage by the board port is defined in
+ * include/board.h and src/rp2040_autoleds.c. The LED is used to encode
+ * OS-related events as follows:
+ *
+ *   -------------------- ----------------------------- ------
+ *   SYMBOL                   Meaning                   LED
+ *   -------------------- ----------------------------- ------
+ */
+
+#define LED_STARTED       0  /* NuttX has been started  OFF    */
+#define LED_HEAPALLOCATE  0  /* Heap has been allocated OFF    */
+#define LED_IRQSENABLED   0  /* Interrupts enabled      OFF    */
+#define LED_STACKCREATED  1  /* Idle stack created      ON     */
+#define LED_INIRQ         2  /* In an interrupt         N/C    */
+#define LED_SIGNAL        2  /* In a signal handler     N/C    */
+#define LED_ASSERTION     2  /* An assertion failed     N/C    */
+#define LED_PANIC         3  /* The system has crashed  FLASH  */
+#undef  LED_IDLE             /* Not used                       */
+
+/* Thus if the LED is statically on, NuttX has successfully  booted and is,
+ * apparently, running normally.  If the LED is flashing at approximately
+ * 2Hz, then a fatal error has been detected and the system has halted.
+ */
+
 /****************************************************************************
  * Public Types
  ****************************************************************************/
diff --git a/boards/arm/rp2040/seeed-xiao-rp2040/src/Make.defs 
b/boards/arm/rp2040/seeed-xiao-rp2040/src/Make.defs
index 1988bff080..6f0fa641b1 100644
--- a/boards/arm/rp2040/seeed-xiao-rp2040/src/Make.defs
+++ b/boards/arm/rp2040/seeed-xiao-rp2040/src/Make.defs
@@ -28,6 +28,12 @@ ifeq ($(CONFIG_DEV_GPIO),y)
 CSRCS += rp2040_gpio.c
 endif
 
+ifeq ($(CONFIG_ARCH_LEDS),y)
+CSRCS += rp2040_autoleds.c
+else
+CSRCS += rp2040_userleds.c
+endif
+
 DEPPATH += --dep-path board
 VPATH += :board
 CFLAGS += 
${INCDIR_PREFIX}$(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board
diff --git a/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_autoleds.c 
b/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_autoleds.c
new file mode 100644
index 0000000000..772253f31f
--- /dev/null
+++ b/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_autoleds.c
@@ -0,0 +1,180 @@
+/****************************************************************************
+ * boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_autoleds.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.
+ *
+ ****************************************************************************/
+
+/* There are four LED status indicators located on the EVK Board.  The
+ * functions of these LEDs include:
+ *
+ *   - Main Power Supply(D3)
+ *     Green: DC 5V main supply is normal.
+ *     Red:   J2 input voltage is over 5.6V.
+ *     Off:   The board is not powered.
+ *   - Reset RED LED(D15)
+ *   - OpenSDA LED(D16)
+ *   - USER LED(D18)
+ *
+ * Only a single LED, D18, is under software control.
+ *
+ * This LED is not used by the board port unless CONFIG_ARCH_LEDS is
+ * defined.  In that case, the usage by the board port is defined in
+ * include/board.h and src/rp2040_autoleds.c. The LED is used to encode
+ * OS-related events as follows:
+ *
+ *   -------------------- ----------------------- ------
+ *   SYMBOL               Meaning                 LED
+ *   -------------------- ----------------------- ------
+ *
+ *   LED_STARTED       0  NuttX has been started  OFF
+ *   LED_HEAPALLOCATE  0  Heap has been allocated OFF
+ *   LED_IRQSENABLED   0  Interrupts enabled      OFF
+ *   LED_STACKCREATED  1  Idle stack created      ON
+ *   LED_INIRQ         2  In an interrupt         N/C
+ *   LED_SIGNAL        2  In a signal handler     N/C
+ *   LED_ASSERTION     2  An assertion failed     N/C
+ *   LED_PANIC         3  The system has crashed  FLASH
+ *   LED_IDLE             Not used
+ *
+ * Thus if the LED is statically on, NuttX has successfully  booted and is,
+ * apparently, running normally.  If the LED is flashing at approximately
+ * 2Hz, then a fatal error has been detected and the system has halted.
+ */
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/board.h>
+#include <arch/board/board.h>
+
+#include "arm_internal.h"
+#include "chip.h"
+#include "rp2040_gpio.h"
+
+#include "rp2040_pico.h"
+
+#ifdef CONFIG_ARCH_LEDS
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rp2040_autoled_initialize
+ *
+ * Description:
+ *   Initialize NuttX-controlled LED logic
+ *
+ * Input Parameters:
+ *   None
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+void board_autoled_initialize(void)
+{
+  /* Configure LED GPIO for output */
+
+  rp2040_gpio_init(GPIO_LED1);
+  rp2040_gpio_init(GPIO_LED2);
+  rp2040_gpio_init(GPIO_LED3);
+
+  rp2040_gpio_setdir(GPIO_LED1, true);
+  rp2040_gpio_setdir(GPIO_LED2, true);
+  rp2040_gpio_setdir(GPIO_LED3, true);
+}
+
+/****************************************************************************
+ * Name: board_autoled_on
+ *
+ * Description:
+ *   Turn on the "logical" LED state
+ *
+ * Input Parameters:
+ *   led - Identifies the "logical" LED state (see definitions in
+ *         include/board.h)
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+void board_autoled_on(int led)
+{
+  bool ledon = true;
+
+  switch (led)
+    {
+      case 0:  /* LED Off */
+        ledon = false;
+        break;
+
+      case 2:  /* LED No change */
+        return;
+
+      case 1:  /* LED On */
+      case 3:  /* LED On */
+        break;
+    }
+
+  /* High illuminates */
+
+  rp2040_gpio_put(GPIO_LED1, ledon);
+  rp2040_gpio_put(GPIO_LED2, ledon);
+  rp2040_gpio_put(GPIO_LED3, ledon);
+}
+
+/****************************************************************************
+ * Name: board_autoled_off
+ *
+ * Description:
+ *   Turn off the "logical" LED state
+ *
+ * Input Parameters:
+ *   led - Identifies the "logical" LED state (see definitions in
+ *         include/board.h)
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+void board_autoled_off(int led)
+{
+  switch (led)
+    {
+      case 0:  /* LED Off */
+      case 1:  /* LED Off */
+      case 3:  /* LED Off */
+        break;
+
+      case 2:  /* LED No change */
+        return;
+    }
+
+  /* High illuminates */
+
+  rp2040_gpio_put(GPIO_LED1, false);
+  rp2040_gpio_put(GPIO_LED2, false);
+  rp2040_gpio_put(GPIO_LED3, false);
+}
+
+#endif /* CONFIG_ARCH_LEDS */
diff --git a/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_boardinitialize.c 
b/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_boardinitialize.c
index 3f4df88bd2..522877b4fd 100644
--- a/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_boardinitialize.c
+++ b/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_boardinitialize.c
@@ -65,9 +65,17 @@ void rp2040_boardearlyinitialize(void)
 
   /* Set board LED pin */
 
-  rp2040_gpio_init(BOARD_GPIO_LED_PIN);
-  rp2040_gpio_setdir(BOARD_GPIO_LED_PIN, true);
-  rp2040_gpio_put(BOARD_GPIO_LED_PIN, true);
+  rp2040_gpio_init(BOARD_GPIO_LED_PIN_R);
+  rp2040_gpio_init(BOARD_GPIO_LED_PIN_G);
+  rp2040_gpio_init(BOARD_GPIO_LED_PIN_B);
+
+  rp2040_gpio_setdir(BOARD_GPIO_LED_PIN_R, true);
+  rp2040_gpio_setdir(BOARD_GPIO_LED_PIN_G, true);
+  rp2040_gpio_setdir(BOARD_GPIO_LED_PIN_B, true);
+
+  rp2040_gpio_put(BOARD_GPIO_LED_PIN_R, true);
+  rp2040_gpio_put(BOARD_GPIO_LED_PIN_G, true);
+  rp2040_gpio_put(BOARD_GPIO_LED_PIN_B, true);
 }
 
 /****************************************************************************
diff --git a/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_bringup.c 
b/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_bringup.c
index 96380f9f52..29217f4b4a 100644
--- a/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_bringup.c
@@ -37,6 +37,10 @@
 #include "rp2040_common_bringup.h"
 #endif /* CONFIG_ARCH_BOARD_COMMON */
 
+#ifdef CONFIG_USERLED
+#  include <nuttx/leds/userled.h>
+#endif
+
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -59,5 +63,16 @@ int rp2040_bringup(void)
 
   /* --- Place any board specific bringup code here --- */
 
+#ifdef CONFIG_USERLED
+  /* Register the LED driver */
+
+  ret = userled_lower_initialize("/dev/userleds");
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, \
+      "ERROR: userled_lower_initialize() failed: %d\n", ret);
+    }
+#endif
+
   return OK;
 }
diff --git a/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_gpio.c 
b/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_gpio.c
index ba00486b52..a3b256a062 100644
--- a/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_gpio.c
+++ b/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_gpio.c
@@ -41,10 +41,14 @@
 
 #if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_GPIO_LOWER_HALF)
 
-/* Output pins. GPIO25 is onboard LED any other outputs could be used.
+/**
+ * Output pins. Those pins are onboard LEDs
+ * any other outputs could be used
  */
 
 #define GPIO_OUT1     25
+#define GPIO_OUT2     17
+#define GPIO_OUT3     16
 
 /* Input pins.
  */
@@ -109,7 +113,9 @@ static const struct gpio_operations_s gpout_ops =
 
 static const uint32_t g_gpiooutputs[BOARD_NGPIOOUT] =
 {
-  GPIO_OUT1
+  GPIO_OUT1,
+  GPIO_OUT2,
+  GPIO_OUT3,
 };
 
 static struct rp2040gpio_dev_s g_gpout[BOARD_NGPIOOUT];
diff --git a/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_pico.h 
b/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_pico.h
index 8e5c5ffaef..acacfd20e7 100644
--- a/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_pico.h
+++ b/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_pico.h
@@ -27,6 +27,12 @@
 
 #include <nuttx/config.h>
 
+/* LEDs connected on-board */
+
+#define GPIO_LED1       25 /* LED color is BLUE */
+#define GPIO_LED2       17 /* LED color is RED */
+#define GPIO_LED3       16 /* LED color is GREEN */
+
 int rp2040_bringup(void);
 
 #ifdef CONFIG_DEV_GPIO
diff --git a/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_userleds.c 
b/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_userleds.c
new file mode 100644
index 0000000000..07e8244f5e
--- /dev/null
+++ b/boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_userleds.c
@@ -0,0 +1,224 @@
+/****************************************************************************
+ * boards/arm/rp2040/seeed-xiao-rp2040/src/rp2040_userleds.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 <stdint.h>
+#include <stdbool.h>
+#include <debug.h>
+
+#include <nuttx/board.h>
+#include <nuttx/power/pm.h>
+#include <arch/board/board.h>
+
+#include "arm_internal.h"
+#include "chip.h"
+#include "rp2040_gpio.h"
+
+#include "rp2040_pico.h"
+
+#ifndef CONFIG_ARCH_LEDS
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/* This array maps an LED number to GPIO pin configuration */
+
+static uint32_t g_ledcfg[BOARD_NLEDS] =
+{
+  GPIO_LED1,
+  GPIO_LED2,
+  GPIO_LED3,
+};
+
+/****************************************************************************
+ * Private Function Protototypes
+ ****************************************************************************/
+
+/* LED Power Management */
+
+#ifdef CONFIG_PM
+static void led_pm_notify(struct pm_callback_s *cb, int domain,
+                          enum pm_state_e pmstate);
+static int led_pm_prepare(struct pm_callback_s *cb, int domain,
+                          enum pm_state_e pmstate);
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+#ifdef CONFIG_PM
+static struct pm_callback_s g_ledscb =
+{
+  .notify  = led_pm_notify,
+  .prepare = led_pm_prepare,
+};
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: led_pm_notify
+ *
+ * Description:
+ *   Notify the driver of new power state. This callback is called after
+ *   all drivers have had the opportunity to prepare for the new power state.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_PM
+static void led_pm_notify(struct pm_callback_s *cb, int domain,
+                          enum pm_state_e pmstate)
+{
+  switch (pmstate)
+    {
+      case(PM_NORMAL):
+        {
+          /* Restore normal LEDs operation */
+
+          board_userled(BOARD_LED, true);
+        }
+        break;
+
+      case(PM_IDLE):
+        {
+          /* Entering IDLE mode - Turn leds off */
+
+          board_userled(BOARD_LED, false);
+        }
+        break;
+
+      case(PM_STANDBY):
+        {
+          /* Entering STANDBY mode - Logic for PM_STANDBY goes here */
+        }
+        break;
+
+      case(PM_SLEEP):
+        {
+          /* Entering SLEEP mode - Logic for PM_SLEEP goes here */
+        }
+        break;
+
+      default:
+        {
+          /* Should not get here */
+        }
+        break;
+    }
+}
+#endif
+
+/****************************************************************************
+ * Name: led_pm_prepare
+ *
+ * Description:
+ *   Request the driver to prepare for a new power state. This is a warning
+ *   that the system is about to enter into a new power state. The driver
+ *   should begin whatever operations that may be required to enter power
+ *   state. The driver may abort the state change mode by returning a
+ *   non-zero value from the callback function.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_PM
+static int led_pm_prepare(struct pm_callback_s *cb, int domain,
+                          enum pm_state_e pmstate)
+{
+  /* No preparation to change power modes is required by the LEDs driver.
+   * We always accept the state change by returning OK.
+   */
+
+  return OK;
+}
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_userled_initialize
+ ****************************************************************************/
+
+uint32_t board_userled_initialize(void)
+{
+  /* Configure LED GPIO for output */
+
+  rp2040_gpio_init(GPIO_LED1);
+  rp2040_gpio_init(GPIO_LED2);
+  rp2040_gpio_init(GPIO_LED3);
+
+  rp2040_gpio_setdir(GPIO_LED1, true);
+  rp2040_gpio_setdir(GPIO_LED2, true);
+  rp2040_gpio_setdir(GPIO_LED3, true);
+
+  return BOARD_NLEDS;
+}
+
+/****************************************************************************
+ * Name: board_userled
+ ****************************************************************************/
+
+void board_userled(int led, bool ledon)
+{
+  if ((unsigned)led < BOARD_NLEDS)
+    {
+      rp2040_gpio_put(g_ledcfg[led], ledon);
+    }
+}
+
+/****************************************************************************
+ * Name: board_userled_all
+ ****************************************************************************/
+
+void board_userled_all(uint32_t ledset)
+{
+  rp2040_gpio_put(GPIO_LED1, (ledset & BOARD_LED1_BIT));
+  rp2040_gpio_put(GPIO_LED2, (ledset & BOARD_LED1_BIT));
+  rp2040_gpio_put(GPIO_LED3, (ledset & BOARD_LED1_BIT));
+}
+
+/****************************************************************************
+ * Name: rp2040_led_pminitialize
+ ****************************************************************************/
+
+#ifdef CONFIG_PM
+void rp2040_led_pminitialize(void)
+{
+  /* Register to receive power management callbacks */
+
+  int ret = pm_register(&g_ledscb);
+  if (ret != OK)
+    {
+      board_autoled_on(LED_ASSERTION);
+    }
+}
+#endif /* CONFIG_PM */
+
+#endif /* !CONFIG_ARCH_LEDS */

Reply via email to