zephyr/drivers/hwinfo/hwinfo_smartbond.c
Jerzy Kasenberg 4e7950e4bd drivers: hwinfo: implemented hardware info support for Smartbond
Only reset cause is supported as there is no common unique id
present on those chips.
Unique ID can be put in OTP but there is no single specification for this.

Signed-off-by: Jerzy Kasenberg <jerzy.kasenberg@codecoup.pl>
2023-12-27 15:56:44 +00:00

64 lines
1.2 KiB
C

/*
* Copyright (c) 2023 Jerzy Kasenberg.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/device.h>
#include <zephyr/drivers/hwinfo.h>
#include <soc.h>
int z_impl_hwinfo_get_reset_cause(uint32_t *cause)
{
int ret = 0;
uint32_t reason = CRG_TOP->RESET_STAT_REG;
uint32_t flags = 0;
/*
* When POR is detected other bits are not valid.
*/
if (reason & CRG_TOP_RESET_STAT_REG_PORESET_STAT_Msk) {
flags = RESET_POR;
} else {
if (reason & CRG_TOP_RESET_STAT_REG_HWRESET_STAT_Msk) {
flags |= RESET_PIN;
}
if (reason & CRG_TOP_RESET_STAT_REG_SWRESET_STAT_Msk) {
flags |= RESET_SOFTWARE;
}
if (reason & CRG_TOP_RESET_STAT_REG_WDOGRESET_STAT_Msk) {
flags |= RESET_WATCHDOG;
}
if (reason & CRG_TOP_RESET_STAT_REG_CMAC_WDOGRESET_STAT_Msk) {
flags |= RESET_WATCHDOG;
}
if (reason & CRG_TOP_RESET_STAT_REG_SWD_HWRESET_STAT_Msk) {
flags |= RESET_DEBUG;
}
}
*cause = flags;
return ret;
}
int z_impl_hwinfo_clear_reset_cause(void)
{
int ret = 0;
CRG_TOP->RESET_STAT_REG = 0;
return ret;
}
int z_impl_hwinfo_get_supported_reset_cause(uint32_t *supported)
{
*supported = (RESET_PIN
| RESET_SOFTWARE
| RESET_POR
| RESET_WATCHDOG
| RESET_DEBUG);
return 0;
}