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 + +#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 +#include +#include +#include #include #include +#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;