|
| 1 | + |
| 2 | +/*** |
| 3 | +
|
| 4 | +
|
| 5 | +*/ |
| 6 | + |
| 7 | +#include "nrf54l15_enga_application.h" |
| 8 | +#include "nrf54l15_enga_global.h" |
| 9 | +#include "nrf54l15_enga_types.h" |
| 10 | +#include "tfm_hal_platform.h" |
| 11 | +#include "tfm_plat_defs.h" |
| 12 | +#include <hal/nrf_tampc.h> |
| 13 | +#include <helpers/nrfx_reset_reason.h> |
| 14 | + |
| 15 | +bool boot_reason_sectamper; |
| 16 | + |
| 17 | +#define RESET_BY_PERIPHERAL false |
| 18 | +#define TAMPER_EVENT_HANDLER tfm_core_panic |
| 19 | + |
| 20 | +#define TAMPC_REASON (((volatile uint32_t *)0x4010E600)[0]) |
| 21 | +void tampc_enable(void); |
| 22 | +void tampc_disable(void); |
| 23 | + |
| 24 | +int init_tampc(void) { |
| 25 | + |
| 26 | + if (TAMPC_REASON & NRFX_RESET_REASON_SECTAMPER_MASK) { |
| 27 | + TAMPC_REASON = NRFX_RESET_REASON_SECTAMPER_MASK; |
| 28 | + boot_reason_sectamper = true; |
| 29 | + } |
| 30 | + |
| 31 | + nrf_tampc_event_clear(NRF_TAMPC, NRF_TAMPC_EVENT_TAMPER); |
| 32 | + nrf_tampc_event_clear(NRF_TAMPC, NRF_TAMPC_EVENT_WRITE_ERROR); |
| 33 | + |
| 34 | + tampc_enable(); |
| 35 | + nrf_tampc_int_enable(NRF_TAMPC, NRF_TAMPC_ALL_INTS_MASK); |
| 36 | + |
| 37 | + nrf_tampc_protector_ctrl_value_set(NRF_TAMPC, NRF_TAMPC_PROTECT_RESETEN_INT, |
| 38 | + RESET_BY_PERIPHERAL); |
| 39 | + |
| 40 | + NVIC_ClearPendingIRQ(TAMPC_IRQn); |
| 41 | + NVIC_ClearTargetState(TAMPC_IRQn); |
| 42 | + NVIC_EnableIRQ(TAMPC_IRQn); |
| 43 | + |
| 44 | + return TFM_PLAT_ERR_SUCCESS; |
| 45 | +} |
| 46 | + |
| 47 | +void tampc_enable(void) { |
| 48 | + nrf_tampc_protector_ctrl_value_set( |
| 49 | + NRF_TAMPC, NRF_TAMPC_PROTECT_GLITCH_DOMAIN_FAST, true); |
| 50 | + nrf_tampc_protector_ctrl_value_set( |
| 51 | + NRF_TAMPC, NRF_TAMPC_PROTECT_GLITCH_DOMAIN_SLOW, true); |
| 52 | +} |
| 53 | + |
| 54 | +void tampc_disable(void) { |
| 55 | + nrf_tampc_protector_ctrl_value_set( |
| 56 | + NRF_TAMPC, NRF_TAMPC_PROTECT_GLITCH_DOMAIN_FAST, false); |
| 57 | + nrf_tampc_protector_ctrl_value_set( |
| 58 | + NRF_TAMPC, NRF_TAMPC_PROTECT_GLITCH_DOMAIN_SLOW, false); |
| 59 | +} |
| 60 | + |
| 61 | +void TAMPC_Handler(void) { |
| 62 | + SPMLOG_ERRMSG("TAMPC Exception:\r\n"); |
| 63 | + |
| 64 | + if (nrf_tampc_event_check(NRF_TAMPC, NRF_TAMPC_EVENT_WRITE_ERROR)) { |
| 65 | + SPMLOG_ERRMSG("\tWrite error.\r\n"); |
| 66 | + nrf_tampc_event_clear(NRF_TAMPC, NRF_TAMPC_EVENT_WRITE_ERROR); |
| 67 | + NVIC_ClearPendingIRQ(TAMPC_IRQn); |
| 68 | + tfm_core_panic(); |
| 69 | + } |
| 70 | + |
| 71 | + if (nrf_tampc_event_check(NRF_TAMPC, NRF_TAMPC_EVENT_TAMPER)) { |
| 72 | + SPMLOG_ERRMSG("\tTamper event.\r\n"); |
| 73 | + nrf_tampc_event_clear(NRF_TAMPC, NRF_TAMPC_EVENT_TAMPER); |
| 74 | + NVIC_ClearPendingIRQ(TAMPC_IRQn); |
| 75 | + TAMPER_EVENT_HANDLER(); |
| 76 | + } |
| 77 | +} |
0 commit comments