diff --git a/arch/arm/src/sama5/sam_systemreset.c b/arch/arm/src/sama5/sam_systemreset.c index 24bed5e441..b54387d5fd 100644 --- a/arch/arm/src/sama5/sam_systemreset.c +++ b/arch/arm/src/sama5/sam_systemreset.c @@ -35,6 +35,7 @@ #include "arm_internal.h" #include "hardware/sam_rstc.h" +#include "sam_systemreset.h" #ifdef CONFIG_SAMA5_SYSTEMRESET @@ -42,6 +43,55 @@ * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: sam_get_reset_cause + * + * Description: + * Get cause of the last CPU reset. This is done by reading reset status + * registger. + * + * Returned Value: + * CPU reset cause in form of macros defined in sam_systemreset.h. This is + * to avoid passing boardctl dependent structure to architecture layer. + * Board level specific code should include sam_systemreset.h and set + * boardctl result according to that. -1 is returned in case of invalid + * value in status register. + * + ****************************************************************************/ + +#ifdef CONFIG_BOARDCTL_RESET_CAUSE +int sam_get_reset_cause(void) +{ + int ret; + uint32_t rstsr; + + rstsr = getreg32(SAM_RSTC_SR); + switch (rstsr & RSTC_SR_RSTTYP_MASK) + { + case RSTC_SR_RSTTYP_PWRUP: + ret = SAMA5_RESET_PWRUP; + break; + case RSTC_SR_RSTTYP_BACKUP: + ret = SAMA5_RESET_BACKUP; + break; + case RSTC_SR_RSTTYP_WDOG: + ret = SAMA5_RESET_WDOG; + break; + case RSTC_SR_RSTTYP_SWRST: + ret = SAMA5_RESET_SWRST; + break; + case RSTC_SR_RSTTYP_NRST: + ret = SAMA5_RESET_NRST; + break; + default: + ret = -1; + break; + } + + return ret; +} +#endif + /**************************************************************************** * Name: up_systemreset * diff --git a/arch/arm/src/sama5/sam_systemreset.h b/arch/arm/src/sama5/sam_systemreset.h new file mode 100644 index 0000000000..2063e26ab7 --- /dev/null +++ b/arch/arm/src/sama5/sam_systemreset.h @@ -0,0 +1,64 @@ +/**************************************************************************** + * arch/arm/src/sama5/sam_systemreset.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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_ARM_SRC_SAMA5_SAM_SYSTEMRESET_H +#define __ARCH_ARM_SRC_SAMA5_SAM_SYSTEMRESET_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define SAMA5_RESET_PWRUP 1 +#define SAMA5_RESET_BACKUP 2 +#define SAMA5_RESET_WDOG 3 +#define SAMA5_RESET_SWRST 4 +#define SAMA5_RESET_NRST 5 + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: sam_get_reset_cause + * + * Description: + * Get cause of the last CPU reset. This is done by reading reset status + * registger. + * + * Returned Value: + * CPU reset cause in form of macros defined in sam_systemreset.h. This is + * to avoid passing boardctl dependent structure to architecture layer. + * Board level specific code should include sam_systemreset.h and set + * boardctl result according to that. -1 is returned in case of invalid + * value in status register. + * + ****************************************************************************/ + +int sam_get_reset_cause(void); + +#endif /* __ARCH_ARM_SRC_SAMA5_SAM_SYSTEMRESET_H */