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

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

commit 1fc73087da3f555b94dc236a48e38ee7abaa8d29
Author: Tiago Medicci Serrano <[email protected]>
AuthorDate: Wed Feb 8 09:35:44 2023 -0300

    esp32s3: add reset/shutdown handler to run registered callbacks
---
 arch/xtensa/src/esp32s3/esp32s3_systemreset.c      |  96 +++++++++++++++++++
 arch/xtensa/src/esp32s3/esp32s3_systemreset.h      | 105 +++++++++++++++++++++
 .../esp32s3/esp32s3-devkit/src/esp32s3_reset.c     |  22 +++++
 3 files changed, 223 insertions(+)

diff --git a/arch/xtensa/src/esp32s3/esp32s3_systemreset.c 
b/arch/xtensa/src/esp32s3/esp32s3_systemreset.c
index 9d71639bba..a1f349331f 100644
--- a/arch/xtensa/src/esp32s3/esp32s3_systemreset.c
+++ b/arch/xtensa/src/esp32s3/esp32s3_systemreset.c
@@ -31,11 +31,107 @@
 
 #include "xtensa.h"
 #include "hardware/esp32s3_rtccntl.h"
+#include "esp32s3_systemreset.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define SHUTDOWN_HANDLERS_NO 4
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static shutdown_handler_t shutdown_handlers[SHUTDOWN_HANDLERS_NO];
 
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
 
+/****************************************************************************
+ * Name: esp32s3_register_shutdown_handler
+ *
+ * Description:
+ *   This function allows you to register a handler that gets invoked before
+ *   the application is restarted.
+ *
+ * Input Parameters:
+ *   handler - Function to execute on restart
+ *
+ * Returned Value:
+ *   OK on success (positive non-zero values are cmd-specific)
+ *   Negated errno returned on failure.
+ *
+ ****************************************************************************/
+
+int esp32s3_register_shutdown_handler(shutdown_handler_t handler)
+{
+  for (int i = 0; i < SHUTDOWN_HANDLERS_NO; i++)
+    {
+      if (shutdown_handlers[i] == handler)
+        {
+          return -EEXIST;
+        }
+      else if (shutdown_handlers[i] == NULL)
+        {
+          shutdown_handlers[i] = handler;
+          return OK;
+        }
+    }
+
+  return -ENOMEM;
+}
+
+/****************************************************************************
+ * Name: esp32s3_unregister_shutdown_handler
+ *
+ * Description:
+ *   This function allows you to unregister a handler which was previously
+ *   registered using up_register_shutdown_handler function.
+ *
+ * Input Parameters:
+ *   handler - Function to execute on restart
+ *
+ * Returned Value:
+ *   OK on success (positive non-zero values are cmd-specific)
+ *   Negated errno returned on failure.
+ *
+ ****************************************************************************/
+
+int esp32s3_unregister_shutdown_handler(shutdown_handler_t handler)
+{
+  for (int i = 0; i < SHUTDOWN_HANDLERS_NO; i++)
+    {
+      if (shutdown_handlers[i] == handler)
+        {
+          shutdown_handlers[i] = NULL;
+          return OK;
+        }
+    }
+
+  return -EINVAL;
+}
+
+/****************************************************************************
+ * Name: up_shutdown_handler
+ *
+ * Description:
+ *   Process all registered shutdown callback functions.
+ *
+ ****************************************************************************/
+
+void up_shutdown_handler(void)
+{
+  for (int i = SHUTDOWN_HANDLERS_NO - 1; i >= 0; i--)
+    {
+      if (shutdown_handlers[i])
+        {
+          shutdown_handlers[i]();
+        }
+    }
+}
+
 /****************************************************************************
  * Name: up_systemreset
  *
diff --git a/arch/xtensa/src/esp32s3/esp32s3_systemreset.h 
b/arch/xtensa/src/esp32s3/esp32s3_systemreset.h
new file mode 100644
index 0000000000..ebbd138733
--- /dev/null
+++ b/arch/xtensa/src/esp32s3/esp32s3_systemreset.h
@@ -0,0 +1,105 @@
+/****************************************************************************
+ * arch/xtensa/src/esp32s3/esp32s3_systemreset.h
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_XTENSA_SRC_ESP32S3_ESP32S3_SYSTEMRESET_H
+#define __ARCH_XTENSA_SRC_ESP32S3_ESP32S3_SYSTEMRESET_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+#include <stdint.h>
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/* Shutdown handler type */
+
+typedef void (*shutdown_handler_t)(void);
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: esp32s3_register_shutdown_handler
+ *
+ * Description:
+ *   This function allows you to register a handler that gets invoked before
+ *   the application is restarted.
+ *
+ * Input Parameters:
+ *   handler - Function to execute on restart
+ *
+ * Returned Value:
+ *   OK on success (positive non-zero values are cmd-specific)
+ *   Negated errno returned on failure.
+ *
+ ****************************************************************************/
+
+int esp32s3_register_shutdown_handler(shutdown_handler_t handler);
+
+/****************************************************************************
+ * Name: esp32s3_unregister_shutdown_handler
+ *
+ * Description:
+ *   This function allows you to unregister a handler which was previously
+ *   registered using up_register_shutdown_handler function.
+ *
+ * Input Parameters:
+ *   handler - Function to execute on restart
+ *
+ * Returned Value:
+ *   OK on success (positive non-zero values are cmd-specific)
+ *   Negated errno returned on failure.
+ *
+ ****************************************************************************/
+
+int esp32s3_unregister_shutdown_handler(shutdown_handler_t handler);
+
+/****************************************************************************
+ * Name: up_shutdown_handler
+ *
+ * Description:
+ *   Process all registered shutdown callback functions.
+ *
+ ****************************************************************************/
+
+void up_shutdown_handler(void);
+
+#ifdef __cplusplus
+}
+#endif
+#undef EXTERN
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ARCH_XTENSA_SRC_ESP32S3_ESP32S3_SYSTEMRESET_H */
diff --git a/boards/xtensa/esp32s3/esp32s3-devkit/src/esp32s3_reset.c 
b/boards/xtensa/esp32s3/esp32s3-devkit/src/esp32s3_reset.c
index 309a550c0e..e47ba976a4 100644
--- a/boards/xtensa/esp32s3/esp32s3-devkit/src/esp32s3_reset.c
+++ b/boards/xtensa/esp32s3/esp32s3-devkit/src/esp32s3_reset.c
@@ -24,11 +24,20 @@
 
 #include <nuttx/config.h>
 
+#include <stdlib.h>
+#include <debug.h>
+#include <assert.h>
 #include <nuttx/arch.h>
 #include <nuttx/board.h>
 
+#include "esp32s3_systemreset.h"
+
 #ifdef CONFIG_BOARDCTL_RESET
 
+#if CONFIG_BOARD_ASSERT_RESET_VALUE == EXIT_SUCCESS
+#  error "CONFIG_BOARD_ASSERT_RESET_VALUE must not be equal to EXIT_SUCCESS"
+#endif
+
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -55,6 +64,19 @@
 
 int board_reset(int status)
 {
+  syslog(LOG_INFO, "reboot status=%d\n", status);
+
+  switch (status)
+    {
+      case EXIT_SUCCESS:
+        up_shutdown_handler();
+        break;
+      case CONFIG_BOARD_ASSERT_RESET_VALUE:
+        break;
+      default:
+        break;
+    }
+
   up_systemreset();
 
   return 0;

Reply via email to