diff --git a/arch/xtensa/src/esp32s2/esp32s2_systemreset.c b/arch/xtensa/src/esp32s2/esp32s2_systemreset.c index 9b26e597d7..8d03f9994c 100644 --- a/arch/xtensa/src/esp32s2/esp32s2_systemreset.c +++ b/arch/xtensa/src/esp32s2/esp32s2_systemreset.c @@ -31,11 +31,88 @@ #include "xtensa.h" #include "hardware/esp32s2_rtccntl.h" +#include "esp32s2_systemreset.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define SHUTDOWN_HANDLERS_NO 4 + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static shutdown_handler_t shutdown_handlers[SHUTDOWN_HANDLERS_NO]; /**************************************************************************** * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: esp32s2_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 esp32s2_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: esp32s2_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 esp32s2_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_systemreset * diff --git a/arch/xtensa/src/esp32s2/esp32s2_systemreset.h b/arch/xtensa/src/esp32s2/esp32s2_systemreset.h new file mode 100644 index 0000000000..2e314ed995 --- /dev/null +++ b/arch/xtensa/src/esp32s2/esp32s2_systemreset.h @@ -0,0 +1,105 @@ +/**************************************************************************** + * arch/xtensa/src/esp32s2/esp32s2_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: esp32s2_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 esp32s2_register_shutdown_handler(shutdown_handler_t handler); + +/**************************************************************************** + * Name: esp32s2_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 esp32s2_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_ESP32S2_ESP32S2_SYSTEMRESET_H */