@@ -44,6 +44,8 @@ NOTICE: This file has been modified by Nordic Semiconductor ASA.
44
44
45
45
/* Errata are only handled in secure mode since they usually need access to FICR. */
46
46
#if !defined(NRF_TRUSTZONE_NONSECURE )
47
+ static bool uicr_HFXOSRC_erased (void );
48
+ static bool uicr_HFXOCNT_erased (void );
47
49
static bool errata_6 (void );
48
50
static bool errata_14 (void );
49
51
static bool errata_15 (void );
@@ -78,18 +80,26 @@ void SystemInit(void)
78
80
#endif
79
81
}
80
82
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 () ) {
83
85
/* Wait for pending NVMC operations to finish */
84
86
while (NRF_NVMC_S -> READY != NVMC_READY_READY_Ready );
85
87
86
88
/* Enable write mode in NVMC */
87
89
NRF_NVMC_S -> CONFIG = NVMC_CONFIG_WEN_Wen ;
88
90
while (NRF_NVMC_S -> READY != NVMC_READY_READY_Ready );
89
91
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
+ }
93
103
94
104
/* Enable read mode in NVMC */
95
105
NRF_NVMC_S -> CONFIG = NVMC_CONFIG_WEN_Ren ;
@@ -133,6 +143,25 @@ void SystemInit(void)
133
143
134
144
135
145
#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
+
136
165
bool errata_6 ()
137
166
{
138
167
if (* (uint32_t * )0x00FF0130 == 0x9ul ){
0 commit comments