arch/samv7: add function to retrieve reset cause from HW

SAMv7 reset controller stores the cause of last reset (SW reset, power up,
pin reset etc.) in status register. This commit adds function that allows
the board to retrieve this information. This function should be called
from board support layer either during initialization or based on
incoming ioctl call.

Adding the sam_get_reset_cause() to sam_systemreset.c also resulted in
always compiling this file by default and only putting up_systemreset()
under CONFIG_SAMV7_SYSTEMRESET option.

Also header file sam_systemreset.h was created as it defines reset types
in comfortable manner for future processing in board layer. This is done
to avoid passing boardctl dependent structure to architecture layer.

Signed-off-by: Michal Lenc <michallenc@seznam.cz>
This commit is contained in:
Michal Lenc 2024-02-06 15:53:28 +01:00 committed by Alan Carvalho de Assis
parent 31817335e4
commit 2849cd7c6d
3 changed files with 112 additions and 6 deletions

View File

@ -29,6 +29,7 @@ include armv7-m/Make.defs
CHIP_CSRCS = sam_start.c sam_clockconfig.c sam_irq.c sam_allocateheap.c
CHIP_CSRCS += sam_lowputc.c sam_serial.c sam_gpio.c sam_pck.c sam_uid.c
CHIP_CSRCS += sam_systemreset.c
# Configuration-dependent SAMV7 files
@ -59,10 +60,6 @@ ifeq ($(CONFIG_SAMV7_RSWDT),y)
CHIP_CSRCS += sam_rswdt.c
endif
ifeq ($(CONFIG_SAMV7_SYSTEMRESET),y)
CHIP_CSRCS += sam_systemreset.c
endif
ifeq ($(CONFIG_SAMV7_1WIREDRIVER),y)
CHIP_CSRCS += sam_1wire.c
endif

View File

@ -33,13 +33,59 @@
#include "arm_internal.h"
#include "hardware/sam_rstc.h"
#ifdef CONFIG_SAMV7_SYSTEMRESET
#include "sam_systemreset.h"
/****************************************************************************
* 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.
*
****************************************************************************/
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 = SAMV7_RESET_PWRUP;
break;
case RSTC_SR_RSTTYP_BACKUP:
ret = SAMV7_RESET_BACKUP;
break;
case RSTC_SR_RSTTYP_WDOG:
ret = SAMV7_RESET_WDOG;
break;
case RSTC_SR_RSTTYP_SWRST:
ret = SAMV7_RESET_SWRST;
break;
case RSTC_SR_RSTTYP_NRST:
ret = SAMV7_RESET_NRST;
break;
default:
ret = -1;
break;
}
return ret;
}
/****************************************************************************
* Name: up_systemreset
*
@ -48,6 +94,7 @@
*
****************************************************************************/
#ifdef CONFIG_SAMV7_SYSTEMRESET
void up_systemreset(void)
{
uint32_t rstcr;

View File

@ -0,0 +1,62 @@
/****************************************************************************
* arch/arm/src/samv7/sam_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_ARM_SRC_SAMV7_SAM_SYSTEMRESET_H
#define __ARCH_ARM_SRC_SAMV7_SAM_SYSTEMRESET_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdint.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#define SAMV7_RESET_PWRUP 1
#define SAMV7_RESET_BACKUP 2
#define SAMV7_RESET_WDOG 3
#define SAMV7_RESET_SWRST 4
#define SAMV7_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_SAMV7_SAM_SYSTEMRESET_H */