7a8d454e22
The soc_secure_* function are used by the non-secure application to access hardware resources which are mapped as secure. Using these functions for hardware resources mapped as non-secure is missleading. We have some soc_secure_* functions which read FICR values. In nRF91 and nRF53 platforms this made sense since FICR has hardware fixed mapping as secure. For nRF54 though the FICR has hardware fixed mapping as non-secure. This change refactors the soc_secure.h to exclude the functions which read FICR values from being included when FICR is mapped as non-secure. Also updates the hwinfo and ieee802154 drivers to adjust to this change. Signed-off-by: Georgios Vasilakis <georgios.vasilakis@nordicsemi.no>
171 lines
3.6 KiB
C
171 lines
3.6 KiB
C
/*
|
|
* Copyright (c) 2018 Alexander Wachter
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <soc.h>
|
|
#include <zephyr/drivers/hwinfo.h>
|
|
#include <string.h>
|
|
#include <zephyr/sys/byteorder.h>
|
|
#ifndef CONFIG_BOARD_QEMU_CORTEX_M0
|
|
#include <helpers/nrfx_reset_reason.h>
|
|
#endif
|
|
|
|
#if defined(CONFIG_TRUSTED_EXECUTION_NONSECURE) && defined(NRF_FICR_S)
|
|
#include <soc_secure.h>
|
|
#else
|
|
#include <hal/nrf_ficr.h>
|
|
#endif
|
|
|
|
struct nrf_uid {
|
|
uint32_t id[2];
|
|
};
|
|
|
|
ssize_t z_impl_hwinfo_get_device_id(uint8_t *buffer, size_t length)
|
|
{
|
|
struct nrf_uid dev_id;
|
|
uint32_t deviceid[2];
|
|
|
|
#if defined(CONFIG_TRUSTED_EXECUTION_NONSECURE) && defined(NRF_FICR_S)
|
|
soc_secure_read_deviceid(deviceid);
|
|
#else
|
|
deviceid[0] = nrf_ficr_deviceid_get(NRF_FICR, 0);
|
|
deviceid[1] = nrf_ficr_deviceid_get(NRF_FICR, 1);
|
|
#endif
|
|
|
|
dev_id.id[0] = sys_cpu_to_be32(deviceid[1]);
|
|
dev_id.id[1] = sys_cpu_to_be32(deviceid[0]);
|
|
|
|
if (length > sizeof(dev_id.id)) {
|
|
length = sizeof(dev_id.id);
|
|
}
|
|
|
|
memcpy(buffer, dev_id.id, length);
|
|
|
|
return length;
|
|
}
|
|
|
|
#ifndef CONFIG_BOARD_QEMU_CORTEX_M0
|
|
int z_impl_hwinfo_get_reset_cause(uint32_t *cause)
|
|
{
|
|
uint32_t flags = 0;
|
|
|
|
uint32_t reason = nrfx_reset_reason_get();
|
|
|
|
if (reason & NRFX_RESET_REASON_RESETPIN_MASK) {
|
|
flags |= RESET_PIN;
|
|
}
|
|
if (reason & NRFX_RESET_REASON_DOG_MASK) {
|
|
flags |= RESET_WATCHDOG;
|
|
}
|
|
if (reason & NRFX_RESET_REASON_LOCKUP_MASK) {
|
|
flags |= RESET_CPU_LOCKUP;
|
|
}
|
|
if (reason & NRFX_RESET_REASON_OFF_MASK) {
|
|
flags |= RESET_LOW_POWER_WAKE;
|
|
}
|
|
if (reason & NRFX_RESET_REASON_DIF_MASK) {
|
|
flags |= RESET_DEBUG;
|
|
}
|
|
if (reason & NRFX_RESET_REASON_SREQ_MASK) {
|
|
flags |= RESET_SOFTWARE;
|
|
}
|
|
|
|
#if NRFX_RESET_REASON_HAS_CTRLAP
|
|
if (reason & NRFX_RESET_REASON_CTRLAP_MASK) {
|
|
flags |= RESET_DEBUG;
|
|
}
|
|
#endif
|
|
#if NRFX_RESET_REASON_HAS_LPCOMP
|
|
if (reason & NRFX_RESET_REASON_LPCOMP_MASK) {
|
|
flags |= RESET_LOW_POWER_WAKE;
|
|
}
|
|
#endif
|
|
#if NRFX_RESET_REASON_HAS_NFC
|
|
if (reason & NRFX_RESET_REASON_NFC_MASK) {
|
|
flags |= RESET_LOW_POWER_WAKE;
|
|
}
|
|
#endif
|
|
#if NRFX_RESET_REASON_HAS_VBUS
|
|
if (reason & NRFX_RESET_REASON_VBUS_MASK) {
|
|
flags |= RESET_POR;
|
|
}
|
|
#endif
|
|
#if NRFX_RESET_REASON_HAS_CTRLAPSOFT
|
|
if (reason & NRFX_RESET_REASON_CTRLAPSOFT_MASK) {
|
|
flags |= RESET_DEBUG;
|
|
}
|
|
#endif
|
|
#if NRFX_RESET_REASON_HAS_CTRLAPHARD
|
|
if (reason & NRFX_RESET_REASON_CTRLAPHARD_MASK) {
|
|
flags |= RESET_DEBUG;
|
|
}
|
|
#endif
|
|
#if NRFX_RESET_REASON_HAS_CTRLAPPIN
|
|
if (reason & NRFX_RESET_REASON_CTRLAPPIN_MASK) {
|
|
flags |= RESET_DEBUG;
|
|
}
|
|
#endif
|
|
#if !NRF_POWER_HAS_RESETREAS
|
|
if (reason & NRFX_RESET_REASON_DOG1_MASK) {
|
|
flags |= RESET_WATCHDOG;
|
|
}
|
|
#endif
|
|
#if NRFX_RESET_REASON_HAS_GRTC
|
|
if (reason & NRFX_RESET_REASON_GRTC_MASK) {
|
|
flags |= RESET_CLOCK;
|
|
}
|
|
#endif
|
|
#if NRFX_RESET_REASON_HAS_NETWORK
|
|
if (reason & NRFX_RESET_REASON_LSREQ_MASK) {
|
|
flags |= RESET_SOFTWARE;
|
|
}
|
|
if (reason & NRFX_RESET_REASON_LLOCKUP_MASK) {
|
|
flags |= RESET_CPU_LOCKUP;
|
|
}
|
|
if (reason & NRFX_RESET_REASON_LDOG_MASK) {
|
|
flags |= RESET_WATCHDOG;
|
|
}
|
|
if (reason & NRFX_RESET_REASON_LCTRLAP_MASK) {
|
|
flags |= RESET_DEBUG;
|
|
}
|
|
#endif
|
|
#if defined(NRFX_RESET_REASON_TAMPC_MASK)
|
|
if (reason & NRFX_RESET_REASON_TAMPC_MASK) {
|
|
flags |= RESET_SECURITY;
|
|
}
|
|
#endif
|
|
#if defined(NRFX_RESET_REASON_SECTAMPER_MASK)
|
|
if (reason & NRFX_RESET_REASON_SECTAMPER_MASK) {
|
|
flags |= RESET_SECURITY;
|
|
}
|
|
#endif
|
|
|
|
*cause = flags;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int z_impl_hwinfo_clear_reset_cause(void)
|
|
{
|
|
uint32_t reason = -1;
|
|
|
|
nrfx_reset_reason_clear(reason);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int z_impl_hwinfo_get_supported_reset_cause(uint32_t *supported)
|
|
{
|
|
*supported = (RESET_PIN
|
|
| RESET_WATCHDOG
|
|
| RESET_SOFTWARE
|
|
| RESET_CPU_LOCKUP
|
|
| RESET_LOW_POWER_WAKE
|
|
| RESET_DEBUG);
|
|
|
|
return 0;
|
|
}
|
|
#endif
|