Skip to content

Commit 82fe1f9

Browse files
Simen Tinderholtcarlescufi
Simen Tinderholt
authored andcommitted
[nrf toup] ext: hal: nrf: Set UICR HFCNT value to 0x20 if erased.
Set the UICR HFCNT value to a valid one if the UICR has been erased. Signed-off-by: Simen Tinderholt <[email protected]>
1 parent 34ab7c4 commit 82fe1f9

File tree

1 file changed

+34
-5
lines changed

1 file changed

+34
-5
lines changed

ext/hal/nordic/nrfx/mdk/system_nrf9160.c

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ NOTICE: This file has been modified by Nordic Semiconductor ASA.
4444

4545
/* Errata are only handled in secure mode since they usually need access to FICR. */
4646
#if !defined(NRF_TRUSTZONE_NONSECURE)
47+
static bool uicr_HFXOSRC_erased(void);
48+
static bool uicr_HFXOCNT_erased(void);
4749
static bool errata_6(void);
4850
static bool errata_14(void);
4951
static bool errata_15(void);
@@ -78,18 +80,26 @@ void SystemInit(void)
7880
#endif
7981
}
8082

81-
/* Make sure UICR->HFXOSRC is set */
82-
if ((NRF_UICR_S->HFXOSRC & UICR_HFXOSRC_HFXOSRC_Msk) != UICR_HFXOSRC_HFXOSRC_TCXO) {
83+
/* Set UICR->HFXOSRC and UICR->HFXOCNT to working defaults if UICR was erased */
84+
if (uicr_HFXOSRC_erased() || uicr_HFXOCNT_erased()) {
8385
/* Wait for pending NVMC operations to finish */
8486
while (NRF_NVMC_S->READY != NVMC_READY_READY_Ready);
8587

8688
/* Enable write mode in NVMC */
8789
NRF_NVMC_S->CONFIG = NVMC_CONFIG_WEN_Wen;
8890
while (NRF_NVMC_S->READY != NVMC_READY_READY_Ready);
8991

90-
/* Write new value to UICR->HFXOSRC */
91-
NRF_UICR_S->HFXOSRC = (NRF_UICR_S->HFXOSRC & ~UICR_HFXOSRC_HFXOSRC_Msk) | UICR_HFXOSRC_HFXOSRC_TCXO;
92-
while (NRF_NVMC_S->READY != NVMC_READY_READY_Ready);
92+
if (uicr_HFXOSRC_erased()){
93+
/* Write default value to UICR->HFXOSRC */
94+
NRF_UICR_S->HFXOSRC = (NRF_UICR_S->HFXOSRC & ~UICR_HFXOSRC_HFXOSRC_Msk) | UICR_HFXOSRC_HFXOSRC_TCXO;
95+
while (NRF_NVMC_S->READY != NVMC_READY_READY_Ready);
96+
}
97+
98+
if (uicr_HFXOCNT_erased()){
99+
/* Write default value to UICR->HFXOCNT */
100+
NRF_UICR_S->HFXOCNT = (NRF_UICR_S->HFXOCNT & ~UICR_HFXOCNT_HFXOCNT_Msk) | 0x20;
101+
while (NRF_NVMC_S->READY != NVMC_READY_READY_Ready);
102+
}
93103

94104
/* Enable read mode in NVMC */
95105
NRF_NVMC_S->CONFIG = NVMC_CONFIG_WEN_Ren;
@@ -133,6 +143,25 @@ void SystemInit(void)
133143

134144

135145
#if !defined(NRF_TRUSTZONE_NONSECURE)
146+
147+
bool uicr_HFXOCNT_erased()
148+
{
149+
if (NRF_UICR_S->HFXOCNT == 0xFFFFFFFFul) {
150+
return true;
151+
}
152+
return false;
153+
}
154+
155+
156+
bool uicr_HFXOSRC_erased()
157+
{
158+
if ((NRF_UICR_S->HFXOSRC & UICR_HFXOSRC_HFXOSRC_Msk) != UICR_HFXOSRC_HFXOSRC_TCXO) {
159+
return true;
160+
}
161+
return false;
162+
}
163+
164+
136165
bool errata_6()
137166
{
138167
if (*(uint32_t *)0x00FF0130 == 0x9ul){

0 commit comments

Comments
 (0)