1 // SPDX-License-Identifier: GPL-2.0-or-later
3 /***************************************************************************
4 * Copyright (C) 2013 Synapse Product Development *
5 * Andrey Smirnov <andrew.smironv@gmail.com> *
6 * Angus Gratton <gus@projectgus.com> *
7 * Erdem U. Altunyurt <spamjunkeater@gmail.com> *
8 ***************************************************************************/
15 #include <helper/binarybuffer.h>
16 #include <target/algorithm.h>
17 #include <target/armv7m.h>
18 #include <helper/types.h>
19 #include <helper/time_support.h>
21 /* Both those values are constant across the current spectrum ofr nRF5 devices */
22 #define WATCHDOG_REFRESH_REGISTER 0x40010600
23 #define WATCHDOG_REFRESH_VALUE 0x6e524635
26 NRF5_FLASH_BASE
= 0x00000000,
29 enum nrf5_ficr_registers
{
30 NRF5_FICR_BASE
= 0x10000000, /* Factory Information Configuration Registers */
32 #define NRF5_FICR_REG(offset) (NRF5_FICR_BASE + offset)
34 NRF5_FICR_CODEPAGESIZE
= NRF5_FICR_REG(0x010),
35 NRF5_FICR_CODESIZE
= NRF5_FICR_REG(0x014),
37 NRF51_FICR_CLENR0
= NRF5_FICR_REG(0x028),
38 NRF51_FICR_PPFC
= NRF5_FICR_REG(0x02C),
39 NRF51_FICR_NUMRAMBLOCK
= NRF5_FICR_REG(0x034),
40 NRF51_FICR_SIZERAMBLOCK0
= NRF5_FICR_REG(0x038),
41 NRF51_FICR_SIZERAMBLOCK1
= NRF5_FICR_REG(0x03C),
42 NRF51_FICR_SIZERAMBLOCK2
= NRF5_FICR_REG(0x040),
43 NRF51_FICR_SIZERAMBLOCK3
= NRF5_FICR_REG(0x044),
45 /* CONFIGID is documented on nRF51 series only.
46 * On nRF52 is present but not documented */
47 NRF5_FICR_CONFIGID
= NRF5_FICR_REG(0x05C),
49 NRF5_FICR_DEVICEID0
= NRF5_FICR_REG(0x060),
50 NRF5_FICR_DEVICEID1
= NRF5_FICR_REG(0x064),
51 NRF5_FICR_ER0
= NRF5_FICR_REG(0x080),
52 NRF5_FICR_ER1
= NRF5_FICR_REG(0x084),
53 NRF5_FICR_ER2
= NRF5_FICR_REG(0x088),
54 NRF5_FICR_ER3
= NRF5_FICR_REG(0x08C),
55 NRF5_FICR_IR0
= NRF5_FICR_REG(0x090),
56 NRF5_FICR_IR1
= NRF5_FICR_REG(0x094),
57 NRF5_FICR_IR2
= NRF5_FICR_REG(0x098),
58 NRF5_FICR_IR3
= NRF5_FICR_REG(0x09C),
59 NRF5_FICR_DEVICEADDRTYPE
= NRF5_FICR_REG(0x0A0),
60 NRF5_FICR_DEVICEADDR0
= NRF5_FICR_REG(0x0A4),
61 NRF5_FICR_DEVICEADDR1
= NRF5_FICR_REG(0x0A8),
63 NRF51_FICR_OVERRIDEN
= NRF5_FICR_REG(0x0AC),
64 NRF51_FICR_NRF_1MBIT0
= NRF5_FICR_REG(0x0B0),
65 NRF51_FICR_NRF_1MBIT1
= NRF5_FICR_REG(0x0B4),
66 NRF51_FICR_NRF_1MBIT2
= NRF5_FICR_REG(0x0B8),
67 NRF51_FICR_NRF_1MBIT3
= NRF5_FICR_REG(0x0BC),
68 NRF51_FICR_NRF_1MBIT4
= NRF5_FICR_REG(0x0C0),
69 NRF51_FICR_BLE_1MBIT0
= NRF5_FICR_REG(0x0EC),
70 NRF51_FICR_BLE_1MBIT1
= NRF5_FICR_REG(0x0F0),
71 NRF51_FICR_BLE_1MBIT2
= NRF5_FICR_REG(0x0F4),
72 NRF51_FICR_BLE_1MBIT3
= NRF5_FICR_REG(0x0F8),
73 NRF51_FICR_BLE_1MBIT4
= NRF5_FICR_REG(0x0FC),
75 /* Following registers are available on nRF52 and on nRF51 since rev 3 */
76 NRF5_FICR_INFO_PART
= NRF5_FICR_REG(0x100),
77 NRF5_FICR_INFO_VARIANT
= NRF5_FICR_REG(0x104),
78 NRF5_FICR_INFO_PACKAGE
= NRF5_FICR_REG(0x108),
79 NRF5_FICR_INFO_RAM
= NRF5_FICR_REG(0x10C),
80 NRF5_FICR_INFO_FLASH
= NRF5_FICR_REG(0x110),
83 enum nrf5_uicr_registers
{
84 NRF5_UICR_BASE
= 0x10001000, /* User Information
85 * Configuration Registers */
87 #define NRF5_UICR_REG(offset) (NRF5_UICR_BASE + offset)
89 NRF51_UICR_CLENR0
= NRF5_UICR_REG(0x000),
90 NRF51_UICR_RBPCONF
= NRF5_UICR_REG(0x004),
91 NRF51_UICR_XTALFREQ
= NRF5_UICR_REG(0x008),
92 NRF51_UICR_FWID
= NRF5_UICR_REG(0x010),
95 enum nrf5_nvmc_registers
{
96 NRF5_NVMC_BASE
= 0x4001E000, /* Non-Volatile Memory
97 * Controller Registers */
99 #define NRF5_NVMC_REG(offset) (NRF5_NVMC_BASE + offset)
101 NRF5_NVMC_READY
= NRF5_NVMC_REG(0x400),
102 NRF5_NVMC_CONFIG
= NRF5_NVMC_REG(0x504),
103 NRF5_NVMC_ERASEPAGE
= NRF5_NVMC_REG(0x508),
104 NRF5_NVMC_ERASEALL
= NRF5_NVMC_REG(0x50C),
105 NRF5_NVMC_ERASEUICR
= NRF5_NVMC_REG(0x514),
107 NRF5_BPROT_BASE
= 0x40000000,
110 enum nrf5_nvmc_config_bits
{
111 NRF5_NVMC_CONFIG_REN
= 0x00,
112 NRF5_NVMC_CONFIG_WEN
= 0x01,
113 NRF5_NVMC_CONFIG_EEN
= 0x02,
117 struct nrf52_ficr_info
{
126 NRF5_FEATURE_SERIES_51
= 1 << 0,
127 NRF5_FEATURE_SERIES_52
= 1 << 1,
128 NRF5_FEATURE_BPROT
= 1 << 2,
129 NRF5_FEATURE_ACL_PROT
= 1 << 3,
132 struct nrf5_device_spec
{
136 const char *build_code
;
137 unsigned int flash_size_kb
;
138 enum nrf5_features features
;
142 unsigned int refcount
;
145 struct nrf5_info
*chip
;
148 struct target
*target
;
150 /* chip identification stored in nrf5_probe() for use in nrf5_info() */
151 bool ficr_info_valid
;
152 struct nrf52_ficr_info ficr_info
;
153 const struct nrf5_device_spec
*spec
;
155 enum nrf5_features features
;
156 unsigned int flash_size_kb
;
157 unsigned int ram_size_kb
;
160 #define NRF51_DEVICE_DEF(id, pt, var, bcode, fsize) \
165 .build_code = bcode, \
166 .flash_size_kb = (fsize), \
167 .features = NRF5_FEATURE_SERIES_51, \
171 * The table maps known HWIDs to the part numbers, variant
172 * build code and some other info. For nRF51 rev 1 and 2 devices
173 * this is the only way how to get the part number and variant.
175 * All tested nRF51 rev 3 devices have FICR INFO fields
176 * but the fields are not documented in RM so we keep HWIDs in
179 * nRF52 and newer devices have FICR INFO documented, the autodetection
180 * can rely on it and HWIDs table is not used.
182 * The known devices table below is derived from the "nRF5x series
183 * compatibility matrix" documents.
185 * Up to date with Matrix v2.0, plus some additional HWIDs.
187 * The additional HWIDs apply where the build code in the matrix is
188 * shown as Gx0, Bx0, etc. In these cases the HWID in the matrix is
189 * for x==0, x!=0 means different (unspecified) HWIDs.
191 static const struct nrf5_device_spec nrf5_known_devices_table
[] = {
192 /* nRF51822 Devices (IC rev 1). */
193 NRF51_DEVICE_DEF(0x001D, "51822", "QFAA", "CA/C0", 256),
194 NRF51_DEVICE_DEF(0x0026, "51822", "QFAB", "AA", 128),
195 NRF51_DEVICE_DEF(0x0027, "51822", "QFAB", "A0", 128),
196 NRF51_DEVICE_DEF(0x0020, "51822", "CEAA", "BA", 256),
197 NRF51_DEVICE_DEF(0x002F, "51822", "CEAA", "B0", 256),
199 /* Some early nRF51-DK (PCA10028) & nRF51-Dongle (PCA10031) boards
200 with built-in jlink seem to use engineering samples not listed
201 in the nRF51 Series Compatibility Matrix V1.0. */
202 NRF51_DEVICE_DEF(0x0071, "51822", "QFAC", "AB", 256),
204 /* nRF51822 Devices (IC rev 2). */
205 NRF51_DEVICE_DEF(0x002A, "51822", "QFAA", "FA0", 256),
206 NRF51_DEVICE_DEF(0x0044, "51822", "QFAA", "GC0", 256),
207 NRF51_DEVICE_DEF(0x003C, "51822", "QFAA", "G0", 256),
208 NRF51_DEVICE_DEF(0x0057, "51822", "QFAA", "G2", 256),
209 NRF51_DEVICE_DEF(0x0058, "51822", "QFAA", "G3", 256),
210 NRF51_DEVICE_DEF(0x004C, "51822", "QFAB", "B0", 128),
211 NRF51_DEVICE_DEF(0x0040, "51822", "CEAA", "CA0", 256),
212 NRF51_DEVICE_DEF(0x0047, "51822", "CEAA", "DA0", 256),
213 NRF51_DEVICE_DEF(0x004D, "51822", "CEAA", "D00", 256),
215 /* nRF51822 Devices (IC rev 3). */
216 NRF51_DEVICE_DEF(0x0072, "51822", "QFAA", "H0", 256),
217 NRF51_DEVICE_DEF(0x00D1, "51822", "QFAA", "H2", 256),
218 NRF51_DEVICE_DEF(0x007B, "51822", "QFAB", "C0", 128),
219 NRF51_DEVICE_DEF(0x0083, "51822", "QFAC", "A0", 256),
220 NRF51_DEVICE_DEF(0x0084, "51822", "QFAC", "A1", 256),
221 NRF51_DEVICE_DEF(0x007D, "51822", "CDAB", "A0", 128),
222 NRF51_DEVICE_DEF(0x0079, "51822", "CEAA", "E0", 256),
223 NRF51_DEVICE_DEF(0x0087, "51822", "CFAC", "A0", 256),
224 NRF51_DEVICE_DEF(0x008F, "51822", "QFAA", "H1", 256),
226 /* nRF51422 Devices (IC rev 1). */
227 NRF51_DEVICE_DEF(0x001E, "51422", "QFAA", "CA", 256),
228 NRF51_DEVICE_DEF(0x0024, "51422", "QFAA", "C0", 256),
229 NRF51_DEVICE_DEF(0x0031, "51422", "CEAA", "A0A", 256),
231 /* nRF51422 Devices (IC rev 2). */
232 NRF51_DEVICE_DEF(0x002D, "51422", "QFAA", "DAA", 256),
233 NRF51_DEVICE_DEF(0x002E, "51422", "QFAA", "E0", 256),
234 NRF51_DEVICE_DEF(0x0061, "51422", "QFAB", "A00", 128),
235 NRF51_DEVICE_DEF(0x0050, "51422", "CEAA", "B0", 256),
237 /* nRF51422 Devices (IC rev 3). */
238 NRF51_DEVICE_DEF(0x0073, "51422", "QFAA", "F0", 256),
239 NRF51_DEVICE_DEF(0x007C, "51422", "QFAB", "B0", 128),
240 NRF51_DEVICE_DEF(0x0085, "51422", "QFAC", "A0", 256),
241 NRF51_DEVICE_DEF(0x0086, "51422", "QFAC", "A1", 256),
242 NRF51_DEVICE_DEF(0x007E, "51422", "CDAB", "A0", 128),
243 NRF51_DEVICE_DEF(0x007A, "51422", "CEAA", "C0", 256),
244 NRF51_DEVICE_DEF(0x0088, "51422", "CFAC", "A0", 256),
246 /* The driver fully autodetects nRF52 series devices by FICR INFO,
247 * no need for nRF52xxx HWIDs in this table */
250 struct nrf5_device_package
{
255 /* Newer devices have FICR INFO.PACKAGE.
256 * This table converts its value to two character code */
257 static const struct nrf5_device_package nrf52_packages_table
[] = {
262 { 0x2004, "QI/CA" }, /* differs nRF52805, 810, 811: CA, nRF52833, 840: QI */
269 const struct flash_driver nrf5_flash
, nrf51_flash
;
271 static bool nrf5_bank_is_probed(const struct flash_bank
*bank
)
273 struct nrf5_bank
*nbank
= bank
->driver_priv
;
277 return nbank
->probed
;
279 static int nrf5_probe(struct flash_bank
*bank
);
281 static int nrf5_get_probed_chip_if_halted(struct flash_bank
*bank
, struct nrf5_info
**chip
)
283 if (bank
->target
->state
!= TARGET_HALTED
) {
284 LOG_ERROR("Target not halted");
285 return ERROR_TARGET_NOT_HALTED
;
288 struct nrf5_bank
*nbank
= bank
->driver_priv
;
291 if (nrf5_bank_is_probed(bank
))
294 return nrf5_probe(bank
);
297 static int nrf5_wait_for_nvmc(struct nrf5_info
*chip
)
301 int timeout_ms
= 340;
302 int64_t ts_start
= timeval_ms();
305 res
= target_read_u32(chip
->target
, NRF5_NVMC_READY
, &ready
);
306 if (res
!= ERROR_OK
) {
307 LOG_ERROR("Error waiting NVMC_READY: generic flash write/erase error (check protection etc...)");
311 if (ready
== 0x00000001)
316 } while ((timeval_ms()-ts_start
) < timeout_ms
);
318 LOG_DEBUG("Timed out waiting for NVMC_READY");
319 return ERROR_FLASH_BUSY
;
322 static int nrf5_nvmc_erase_enable(struct nrf5_info
*chip
)
325 res
= target_write_u32(chip
->target
,
327 NRF5_NVMC_CONFIG_EEN
);
329 if (res
!= ERROR_OK
) {
330 LOG_ERROR("Failed to enable erase operation");
335 According to NVMC examples in Nordic SDK busy status must be
336 checked after writing to NVMC_CONFIG
338 res
= nrf5_wait_for_nvmc(chip
);
340 LOG_ERROR("Erase enable did not complete");
345 static int nrf5_nvmc_write_enable(struct nrf5_info
*chip
)
348 res
= target_write_u32(chip
->target
,
350 NRF5_NVMC_CONFIG_WEN
);
352 if (res
!= ERROR_OK
) {
353 LOG_ERROR("Failed to enable write operation");
358 According to NVMC examples in Nordic SDK busy status must be
359 checked after writing to NVMC_CONFIG
361 res
= nrf5_wait_for_nvmc(chip
);
363 LOG_ERROR("Write enable did not complete");
368 static int nrf5_nvmc_read_only(struct nrf5_info
*chip
)
371 res
= target_write_u32(chip
->target
,
373 NRF5_NVMC_CONFIG_REN
);
375 if (res
!= ERROR_OK
) {
376 LOG_ERROR("Failed to enable read-only operation");
380 According to NVMC examples in Nordic SDK busy status must be
381 checked after writing to NVMC_CONFIG
383 res
= nrf5_wait_for_nvmc(chip
);
385 LOG_ERROR("Read only enable did not complete");
390 static int nrf5_nvmc_generic_erase(struct nrf5_info
*chip
,
391 uint32_t erase_register
, uint32_t erase_value
)
395 res
= nrf5_nvmc_erase_enable(chip
);
399 res
= target_write_u32(chip
->target
,
405 res
= nrf5_wait_for_nvmc(chip
);
409 return nrf5_nvmc_read_only(chip
);
412 nrf5_nvmc_read_only(chip
);
414 LOG_ERROR("Failed to erase reg: 0x%08"PRIx32
" val: 0x%08"PRIx32
,
415 erase_register
, erase_value
);
419 static int nrf5_protect_check_clenr0(struct flash_bank
*bank
)
423 struct nrf5_bank
*nbank
= bank
->driver_priv
;
424 struct nrf5_info
*chip
= nbank
->chip
;
428 res
= target_read_u32(chip
->target
, NRF51_FICR_CLENR0
,
430 if (res
!= ERROR_OK
) {
431 LOG_ERROR("Couldn't read code region 0 size[FICR]");
435 if (clenr0
== 0xFFFFFFFF) {
436 res
= target_read_u32(chip
->target
, NRF51_UICR_CLENR0
,
438 if (res
!= ERROR_OK
) {
439 LOG_ERROR("Couldn't read code region 0 size[UICR]");
444 for (unsigned int i
= 0; i
< bank
->num_sectors
; i
++)
445 bank
->sectors
[i
].is_protected
=
446 clenr0
!= 0xFFFFFFFF && bank
->sectors
[i
].offset
< clenr0
;
451 static int nrf5_protect_check_bprot(struct flash_bank
*bank
)
453 struct nrf5_bank
*nbank
= bank
->driver_priv
;
454 struct nrf5_info
*chip
= nbank
->chip
;
458 static uint32_t nrf5_bprot_offsets
[4] = { 0x600, 0x604, 0x610, 0x614 };
459 uint32_t bprot_reg
= 0;
462 for (unsigned int i
= 0; i
< bank
->num_sectors
; i
++) {
463 unsigned int bit
= i
% 32;
465 unsigned int n_reg
= i
/ 32;
466 if (n_reg
>= ARRAY_SIZE(nrf5_bprot_offsets
))
469 res
= target_read_u32(chip
->target
, NRF5_BPROT_BASE
+ nrf5_bprot_offsets
[n_reg
], &bprot_reg
);
473 bank
->sectors
[i
].is_protected
= (bprot_reg
& (1 << bit
)) ? 1 : 0;
478 static int nrf5_protect_check(struct flash_bank
*bank
)
480 /* UICR cannot be write protected so just return early */
481 if (bank
->base
== NRF5_UICR_BASE
)
484 struct nrf5_bank
*nbank
= bank
->driver_priv
;
485 struct nrf5_info
*chip
= nbank
->chip
;
489 if (chip
->features
& NRF5_FEATURE_BPROT
)
490 return nrf5_protect_check_bprot(bank
);
492 if (chip
->features
& NRF5_FEATURE_SERIES_51
)
493 return nrf5_protect_check_clenr0(bank
);
495 LOG_WARNING("Flash protection of this nRF device is not supported");
496 return ERROR_FLASH_OPER_UNSUPPORTED
;
499 static int nrf5_protect_clenr0(struct flash_bank
*bank
, int set
, unsigned int first
,
503 uint32_t clenr0
, ppfc
;
504 struct nrf5_bank
*nbank
= bank
->driver_priv
;
505 struct nrf5_info
*chip
= nbank
->chip
;
508 LOG_ERROR("Code region 0 must start at the beginning of the bank");
512 res
= target_read_u32(chip
->target
, NRF51_FICR_PPFC
,
514 if (res
!= ERROR_OK
) {
515 LOG_ERROR("Couldn't read PPFC register");
519 if ((ppfc
& 0xFF) == 0x00) {
520 LOG_ERROR("Code region 0 size was pre-programmed at the factory, can't change flash protection settings");
524 res
= target_read_u32(chip
->target
, NRF51_UICR_CLENR0
,
526 if (res
!= ERROR_OK
) {
527 LOG_ERROR("Couldn't read code region 0 size from UICR");
531 if (!set
|| clenr0
!= 0xFFFFFFFF) {
532 LOG_ERROR("You need to perform chip erase before changing the protection settings");
536 res
= nrf5_nvmc_write_enable(chip
);
540 clenr0
= bank
->sectors
[last
].offset
+ bank
->sectors
[last
].size
;
541 res
= target_write_u32(chip
->target
, NRF51_UICR_CLENR0
, clenr0
);
543 int res2
= nrf5_wait_for_nvmc(chip
);
549 LOG_INFO("A reset or power cycle is required for the new protection settings to take effect.");
551 LOG_ERROR("Couldn't write code region 0 size to UICR");
554 nrf5_nvmc_read_only(chip
);
559 static int nrf5_protect(struct flash_bank
*bank
, int set
, unsigned int first
,
563 struct nrf5_info
*chip
;
565 /* UICR cannot be write protected so just bail out early */
566 if (bank
->base
== NRF5_UICR_BASE
) {
567 LOG_ERROR("UICR page does not support protection");
568 return ERROR_FLASH_OPER_UNSUPPORTED
;
571 res
= nrf5_get_probed_chip_if_halted(bank
, &chip
);
575 if (chip
->features
& NRF5_FEATURE_SERIES_51
)
576 return nrf5_protect_clenr0(bank
, set
, first
, last
);
578 LOG_ERROR("Flash protection setting is not supported on this nRF5 device");
579 return ERROR_FLASH_OPER_UNSUPPORTED
;
582 static bool nrf5_info_variant_to_str(uint32_t variant
, char *bf
)
586 h_u32_to_be(b
, variant
);
587 if (isalnum(b
[0]) && isalnum(b
[1]) && isalnum(b
[2]) && isalnum(b
[3])) {
597 static const char *nrf5_decode_info_package(uint32_t package
)
599 for (size_t i
= 0; i
< ARRAY_SIZE(nrf52_packages_table
); i
++) {
600 if (nrf52_packages_table
[i
].package
== package
)
601 return nrf52_packages_table
[i
].code
;
606 static int get_nrf5_chip_type_str(const struct nrf5_info
*chip
, char *buf
, unsigned int buf_size
)
610 res
= snprintf(buf
, buf_size
, "nRF%s-%s(build code: %s)",
611 chip
->spec
->part
, chip
->spec
->variant
, chip
->spec
->build_code
);
612 } else if (chip
->ficr_info_valid
) {
614 nrf5_info_variant_to_str(chip
->ficr_info
.variant
, variant
);
615 res
= snprintf(buf
, buf_size
, "nRF%" PRIx32
"-%s%.2s(build code: %s)",
616 chip
->ficr_info
.part
,
617 nrf5_decode_info_package(chip
->ficr_info
.package
),
618 variant
, &variant
[2]);
620 res
= snprintf(buf
, buf_size
, "nRF51xxx (HWID 0x%04" PRIx16
")", chip
->hwid
);
624 if (res
<= 0 || (unsigned int)res
>= buf_size
) {
625 LOG_ERROR("BUG: buffer problem in %s", __func__
);
631 static int nrf5_info(struct flash_bank
*bank
, struct command_invocation
*cmd
)
633 struct nrf5_bank
*nbank
= bank
->driver_priv
;
634 struct nrf5_info
*chip
= nbank
->chip
;
636 char chip_type_str
[256];
637 if (get_nrf5_chip_type_str(chip
, chip_type_str
, sizeof(chip_type_str
)) != ERROR_OK
)
640 command_print_sameline(cmd
, "%s %ukB Flash, %ukB RAM",
641 chip_type_str
, chip
->flash_size_kb
, chip
->ram_size_kb
);
645 static int nrf5_read_ficr_info(struct nrf5_info
*chip
)
648 struct target
*target
= chip
->target
;
650 chip
->ficr_info_valid
= false;
652 res
= target_read_u32(target
, NRF5_FICR_INFO_PART
, &chip
->ficr_info
.part
);
653 if (res
!= ERROR_OK
) {
654 LOG_DEBUG("Couldn't read FICR INFO.PART register");
658 uint32_t series
= chip
->ficr_info
.part
& 0xfffff000;
661 chip
->features
= NRF5_FEATURE_SERIES_51
;
665 chip
->features
= NRF5_FEATURE_SERIES_52
;
667 switch (chip
->ficr_info
.part
) {
670 chip
->features
|= NRF5_FEATURE_BPROT
;
674 chip
->features
|= NRF5_FEATURE_ACL_PROT
;
680 LOG_DEBUG("FICR INFO likely not implemented. Invalid PART value 0x%08"
681 PRIx32
, chip
->ficr_info
.part
);
682 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
685 /* Now we know the device has FICR INFO filled by something relevant:
686 * Although it is not documented, the tested nRF51 rev 3 devices
687 * have FICR INFO.PART, RAM and FLASH of the same format as nRF52.
688 * VARIANT and PACKAGE coding is unknown for a nRF51 device.
689 * nRF52 devices have FICR INFO documented and always filled. */
691 res
= target_read_u32(target
, NRF5_FICR_INFO_VARIANT
, &chip
->ficr_info
.variant
);
695 res
= target_read_u32(target
, NRF5_FICR_INFO_PACKAGE
, &chip
->ficr_info
.package
);
699 res
= target_read_u32(target
, NRF5_FICR_INFO_RAM
, &chip
->ficr_info
.ram
);
703 res
= target_read_u32(target
, NRF5_FICR_INFO_FLASH
, &chip
->ficr_info
.flash
);
707 chip
->ficr_info_valid
= true;
711 static int nrf5_get_ram_size(struct target
*target
, uint32_t *ram_size
)
717 uint32_t numramblock
;
718 res
= target_read_u32(target
, NRF51_FICR_NUMRAMBLOCK
, &numramblock
);
719 if (res
!= ERROR_OK
) {
720 LOG_DEBUG("Couldn't read FICR NUMRAMBLOCK register");
724 if (numramblock
< 1 || numramblock
> 4) {
725 LOG_DEBUG("FICR NUMRAMBLOCK strange value %" PRIx32
, numramblock
);
726 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
729 for (unsigned int i
= 0; i
< numramblock
; i
++) {
730 uint32_t sizeramblock
;
731 res
= target_read_u32(target
, NRF51_FICR_SIZERAMBLOCK0
+ sizeof(uint32_t)*i
, &sizeramblock
);
732 if (res
!= ERROR_OK
) {
733 LOG_DEBUG("Couldn't read FICR NUMRAMBLOCK register");
736 if (sizeramblock
< 1024 || sizeramblock
> 65536)
737 LOG_DEBUG("FICR SIZERAMBLOCK strange value %" PRIx32
, sizeramblock
);
739 *ram_size
+= sizeramblock
;
744 static int nrf5_probe(struct flash_bank
*bank
)
747 struct nrf5_bank
*nbank
= bank
->driver_priv
;
748 struct nrf5_info
*chip
= nbank
->chip
;
749 struct target
*target
= chip
->target
;
752 res
= target_read_u32(target
, NRF5_FICR_CONFIGID
, &configid
);
753 if (res
!= ERROR_OK
) {
754 LOG_ERROR("Couldn't read CONFIGID register");
758 /* HWID is stored in the lower two bytes of the CONFIGID register */
759 chip
->hwid
= configid
& 0xFFFF;
761 /* guess a nRF51 series if the device has no FICR INFO and we don't know HWID */
762 chip
->features
= NRF5_FEATURE_SERIES_51
;
764 /* Don't bail out on error for the case that some old engineering
765 * sample has FICR INFO registers unreadable. We can proceed anyway. */
766 (void)nrf5_read_ficr_info(chip
);
769 for (size_t i
= 0; i
< ARRAY_SIZE(nrf5_known_devices_table
); i
++) {
770 if (chip
->hwid
== nrf5_known_devices_table
[i
].hwid
) {
771 chip
->spec
= &nrf5_known_devices_table
[i
];
772 chip
->features
= chip
->spec
->features
;
777 if (chip
->spec
&& chip
->ficr_info_valid
) {
778 /* check if HWID table gives the same part as FICR INFO */
779 if (chip
->ficr_info
.part
!= strtoul(chip
->spec
->part
, NULL
, 16))
780 LOG_WARNING("HWID 0x%04" PRIx32
" mismatch: FICR INFO.PART %"
781 PRIx32
, chip
->hwid
, chip
->ficr_info
.part
);
784 if (chip
->ficr_info_valid
) {
785 chip
->ram_size_kb
= chip
->ficr_info
.ram
;
788 nrf5_get_ram_size(target
, &ram_size
);
789 chip
->ram_size_kb
= ram_size
/ 1024;
792 /* The value stored in NRF5_FICR_CODEPAGESIZE is the number of bytes in one page of FLASH. */
793 uint32_t flash_page_size
;
794 res
= target_read_u32(chip
->target
, NRF5_FICR_CODEPAGESIZE
,
796 if (res
!= ERROR_OK
) {
797 LOG_ERROR("Couldn't read code page size");
801 /* Note the register name is misleading,
802 * NRF5_FICR_CODESIZE is the number of pages in flash memory, not the number of bytes! */
803 uint32_t num_sectors
;
804 res
= target_read_u32(chip
->target
, NRF5_FICR_CODESIZE
, &num_sectors
);
805 if (res
!= ERROR_OK
) {
806 LOG_ERROR("Couldn't read code memory size");
810 chip
->flash_size_kb
= num_sectors
* flash_page_size
/ 1024;
812 if (!chip
->bank
[0].probed
&& !chip
->bank
[1].probed
) {
813 char chip_type_str
[256];
814 if (get_nrf5_chip_type_str(chip
, chip_type_str
, sizeof(chip_type_str
)) != ERROR_OK
)
816 const bool device_is_unknown
= (!chip
->spec
&& !chip
->ficr_info_valid
);
817 LOG_INFO("%s%s %ukB Flash, %ukB RAM",
818 device_is_unknown
? "Unknown device: " : "",
826 if (bank
->base
== NRF5_FLASH_BASE
) {
828 if (chip
->spec
&& chip
->flash_size_kb
!= chip
->spec
->flash_size_kb
)
829 LOG_WARNING("Chip's reported Flash capacity does not match expected one");
830 if (chip
->ficr_info_valid
&& chip
->flash_size_kb
!= chip
->ficr_info
.flash
)
831 LOG_WARNING("Chip's reported Flash capacity does not match FICR INFO.FLASH");
833 bank
->num_sectors
= num_sectors
;
834 bank
->size
= num_sectors
* flash_page_size
;
836 bank
->sectors
= alloc_block_array(0, flash_page_size
, num_sectors
);
840 chip
->bank
[0].probed
= true;
843 bank
->num_sectors
= 1;
844 bank
->size
= flash_page_size
;
846 bank
->sectors
= alloc_block_array(0, flash_page_size
, num_sectors
);
850 bank
->sectors
[0].is_protected
= 0;
852 chip
->bank
[1].probed
= true;
858 static int nrf5_auto_probe(struct flash_bank
*bank
)
860 if (nrf5_bank_is_probed(bank
))
863 return nrf5_probe(bank
);
866 static int nrf5_erase_all(struct nrf5_info
*chip
)
868 LOG_DEBUG("Erasing all non-volatile memory");
869 return nrf5_nvmc_generic_erase(chip
,
874 static int nrf5_erase_page(struct flash_bank
*bank
,
875 struct nrf5_info
*chip
,
876 struct flash_sector
*sector
)
880 LOG_DEBUG("Erasing page at 0x%"PRIx32
, sector
->offset
);
882 if (bank
->base
== NRF5_UICR_BASE
) {
883 if (chip
->features
& NRF5_FEATURE_SERIES_51
) {
885 res
= target_read_u32(chip
->target
, NRF51_FICR_PPFC
,
887 if (res
!= ERROR_OK
) {
888 LOG_ERROR("Couldn't read PPFC register");
892 if ((ppfc
& 0xFF) == 0xFF) {
893 /* We can't erase the UICR. Double-check to
894 see if it's already erased before complaining. */
895 default_flash_blank_check(bank
);
896 if (sector
->is_erased
== 1)
899 LOG_ERROR("The chip was not pre-programmed with SoftDevice stack and UICR cannot be erased separately. Please issue mass erase before trying to write to this region");
904 res
= nrf5_nvmc_generic_erase(chip
,
910 res
= nrf5_nvmc_generic_erase(chip
,
918 /* Start a low level flash write for the specified region */
919 static int nrf5_ll_flash_write(struct nrf5_info
*chip
, uint32_t address
, const uint8_t *buffer
, uint32_t bytes
)
921 struct target
*target
= chip
->target
;
922 uint32_t buffer_size
= 8192;
923 struct working_area
*write_algorithm
;
924 struct working_area
*source
;
925 struct reg_param reg_params
[6];
926 struct armv7m_algorithm armv7m_info
;
927 int retval
= ERROR_OK
;
929 static const uint8_t nrf5_flash_write_code
[] = {
930 #include "../../../contrib/loaders/flash/nrf5/nrf5.inc"
933 LOG_DEBUG("Writing buffer to flash address=0x%"PRIx32
" bytes=0x%"PRIx32
, address
, bytes
);
934 assert(bytes
% 4 == 0);
936 /* allocate working area with flash programming code */
937 if (target_alloc_working_area(target
, sizeof(nrf5_flash_write_code
),
938 &write_algorithm
) != ERROR_OK
) {
939 LOG_WARNING("no working area available, falling back to slow memory writes");
941 for (; bytes
> 0; bytes
-= 4) {
942 retval
= target_write_memory(target
, address
, 4, 1, buffer
);
943 if (retval
!= ERROR_OK
)
946 retval
= nrf5_wait_for_nvmc(chip
);
947 if (retval
!= ERROR_OK
)
957 retval
= target_write_buffer(target
, write_algorithm
->address
,
958 sizeof(nrf5_flash_write_code
),
959 nrf5_flash_write_code
);
960 if (retval
!= ERROR_OK
)
964 while (target_alloc_working_area(target
, buffer_size
, &source
) != ERROR_OK
) {
966 buffer_size
&= ~3UL; /* Make sure it's 4 byte aligned */
967 if (buffer_size
<= 256) {
968 /* free working area, write algorithm already allocated */
969 target_free_working_area(target
, write_algorithm
);
971 LOG_WARNING("No large enough working area available, can't do block memory writes");
972 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
976 armv7m_info
.common_magic
= ARMV7M_COMMON_MAGIC
;
977 armv7m_info
.core_mode
= ARM_MODE_THREAD
;
979 init_reg_param(®_params
[0], "r0", 32, PARAM_IN_OUT
); /* byte count */
980 init_reg_param(®_params
[1], "r1", 32, PARAM_OUT
); /* buffer start */
981 init_reg_param(®_params
[2], "r2", 32, PARAM_OUT
); /* buffer end */
982 init_reg_param(®_params
[3], "r3", 32, PARAM_IN_OUT
); /* target address */
983 init_reg_param(®_params
[4], "r6", 32, PARAM_OUT
); /* watchdog refresh value */
984 init_reg_param(®_params
[5], "r7", 32, PARAM_OUT
); /* watchdog refresh register address */
986 buf_set_u32(reg_params
[0].value
, 0, 32, bytes
);
987 buf_set_u32(reg_params
[1].value
, 0, 32, source
->address
);
988 buf_set_u32(reg_params
[2].value
, 0, 32, source
->address
+ source
->size
);
989 buf_set_u32(reg_params
[3].value
, 0, 32, address
);
990 buf_set_u32(reg_params
[4].value
, 0, 32, WATCHDOG_REFRESH_VALUE
);
991 buf_set_u32(reg_params
[5].value
, 0, 32, WATCHDOG_REFRESH_REGISTER
);
993 retval
= target_run_flash_async_algorithm(target
, buffer
, bytes
/4, 4,
995 ARRAY_SIZE(reg_params
), reg_params
,
996 source
->address
, source
->size
,
997 write_algorithm
->address
, write_algorithm
->address
+ sizeof(nrf5_flash_write_code
) - 2,
1000 target_free_working_area(target
, source
);
1001 target_free_working_area(target
, write_algorithm
);
1003 destroy_reg_param(®_params
[0]);
1004 destroy_reg_param(®_params
[1]);
1005 destroy_reg_param(®_params
[2]);
1006 destroy_reg_param(®_params
[3]);
1007 destroy_reg_param(®_params
[4]);
1008 destroy_reg_param(®_params
[5]);
1013 static int nrf5_write(struct flash_bank
*bank
, const uint8_t *buffer
,
1014 uint32_t offset
, uint32_t count
)
1016 struct nrf5_info
*chip
;
1018 int res
= nrf5_get_probed_chip_if_halted(bank
, &chip
);
1019 if (res
!= ERROR_OK
)
1022 assert(offset
% 4 == 0);
1023 assert(count
% 4 == 0);
1025 /* UICR CLENR0 based protection used on nRF51 is somewhat clumsy:
1026 * RM reads: Code running from code region 1 will not be able to write
1028 * Unfortunately the flash loader running from RAM can write to both
1029 * code regions without any hint the protection is violated.
1031 * Update protection state and check if any flash sector to be written
1033 if (chip
->features
& NRF5_FEATURE_SERIES_51
) {
1035 res
= nrf5_protect_check_clenr0(bank
);
1036 if (res
!= ERROR_OK
)
1039 for (unsigned int sector
= 0; sector
< bank
->num_sectors
; sector
++) {
1040 struct flash_sector
*bs
= &bank
->sectors
[sector
];
1042 /* Start offset in or before this sector? */
1043 /* End offset in or behind this sector? */
1044 if ((offset
< (bs
->offset
+ bs
->size
))
1045 && ((offset
+ count
- 1) >= bs
->offset
)
1046 && bs
->is_protected
== 1) {
1047 LOG_ERROR("Write refused, sector %d is protected", sector
);
1048 return ERROR_FLASH_PROTECTED
;
1053 res
= nrf5_nvmc_write_enable(chip
);
1054 if (res
!= ERROR_OK
)
1057 res
= nrf5_ll_flash_write(chip
, bank
->base
+ offset
, buffer
, count
);
1058 if (res
!= ERROR_OK
)
1061 return nrf5_nvmc_read_only(chip
);
1064 nrf5_nvmc_read_only(chip
);
1065 LOG_ERROR("Failed to write to nrf5 flash");
1069 static int nrf5_erase(struct flash_bank
*bank
, unsigned int first
,
1073 struct nrf5_info
*chip
;
1075 res
= nrf5_get_probed_chip_if_halted(bank
, &chip
);
1076 if (res
!= ERROR_OK
)
1079 /* UICR CLENR0 based protection used on nRF51 prevents erase
1080 * absolutely silently. NVMC has no flag to indicate the protection
1083 * Update protection state and check if any flash sector to be erased
1085 if (chip
->features
& NRF5_FEATURE_SERIES_51
) {
1087 res
= nrf5_protect_check_clenr0(bank
);
1088 if (res
!= ERROR_OK
)
1092 /* For each sector to be erased */
1093 for (unsigned int s
= first
; s
<= last
&& res
== ERROR_OK
; s
++) {
1095 if (chip
->features
& NRF5_FEATURE_SERIES_51
1096 && bank
->sectors
[s
].is_protected
== 1) {
1097 LOG_ERROR("Flash sector %d is protected", s
);
1098 return ERROR_FLASH_PROTECTED
;
1101 res
= nrf5_erase_page(bank
, chip
, &bank
->sectors
[s
]);
1102 if (res
!= ERROR_OK
) {
1103 LOG_ERROR("Error erasing sector %d", s
);
1111 static void nrf5_free_driver_priv(struct flash_bank
*bank
)
1113 struct nrf5_bank
*nbank
= bank
->driver_priv
;
1114 struct nrf5_info
*chip
= nbank
->chip
;
1119 if (chip
->refcount
== 0) {
1121 bank
->driver_priv
= NULL
;
1125 static struct nrf5_info
*nrf5_get_chip(struct target
*target
)
1127 struct flash_bank
*bank_iter
;
1129 /* iterate over nrf5 banks of same target */
1130 for (bank_iter
= flash_bank_list(); bank_iter
; bank_iter
= bank_iter
->next
) {
1131 if (bank_iter
->driver
!= &nrf5_flash
&& bank_iter
->driver
!= &nrf51_flash
)
1134 if (bank_iter
->target
!= target
)
1137 struct nrf5_bank
*nbank
= bank_iter
->driver_priv
;
1147 FLASH_BANK_COMMAND_HANDLER(nrf5_flash_bank_command
)
1149 struct nrf5_info
*chip
;
1150 struct nrf5_bank
*nbank
= NULL
;
1152 if (bank
->driver
== &nrf51_flash
)
1153 LOG_WARNING("Flash driver 'nrf51' is deprecated! Use 'nrf5' instead.");
1155 switch (bank
->base
) {
1156 case NRF5_FLASH_BASE
:
1157 case NRF5_UICR_BASE
:
1160 LOG_ERROR("Invalid bank address " TARGET_ADDR_FMT
, bank
->base
);
1164 chip
= nrf5_get_chip(bank
->target
);
1166 /* Create a new chip */
1167 chip
= calloc(1, sizeof(*chip
));
1171 chip
->target
= bank
->target
;
1174 switch (bank
->base
) {
1175 case NRF5_FLASH_BASE
:
1176 nbank
= &chip
->bank
[0];
1178 case NRF5_UICR_BASE
:
1179 nbank
= &chip
->bank
[1];
1186 nbank
->probed
= false;
1187 bank
->driver_priv
= nbank
;
1188 bank
->write_start_alignment
= bank
->write_end_alignment
= 4;
1193 COMMAND_HANDLER(nrf5_handle_mass_erase_command
)
1196 struct flash_bank
*bank
= NULL
;
1197 struct target
*target
= get_current_target(CMD_CTX
);
1199 res
= get_flash_bank_by_addr(target
, NRF5_FLASH_BASE
, true, &bank
);
1200 if (res
!= ERROR_OK
)
1205 struct nrf5_info
*chip
;
1207 res
= nrf5_get_probed_chip_if_halted(bank
, &chip
);
1208 if (res
!= ERROR_OK
)
1211 if (chip
->features
& NRF5_FEATURE_SERIES_51
) {
1213 res
= target_read_u32(target
, NRF51_FICR_PPFC
,
1215 if (res
!= ERROR_OK
) {
1216 LOG_ERROR("Couldn't read PPFC register");
1220 if ((ppfc
& 0xFF) == 0x00) {
1221 LOG_ERROR("Code region 0 size was pre-programmed at the factory, "
1222 "mass erase command won't work.");
1227 res
= nrf5_erase_all(chip
);
1228 if (res
== ERROR_OK
) {
1229 LOG_INFO("Mass erase completed.");
1230 if (chip
->features
& NRF5_FEATURE_SERIES_51
)
1231 LOG_INFO("A reset or power cycle is required if the flash was protected before.");
1234 LOG_ERROR("Failed to erase the chip");
1240 COMMAND_HANDLER(nrf5_handle_info_command
)
1243 struct flash_bank
*bank
= NULL
;
1244 struct target
*target
= get_current_target(CMD_CTX
);
1246 res
= get_flash_bank_by_addr(target
, NRF5_FLASH_BASE
, true, &bank
);
1247 if (res
!= ERROR_OK
)
1252 struct nrf5_info
*chip
;
1254 res
= nrf5_get_probed_chip_if_halted(bank
, &chip
);
1255 if (res
!= ERROR_OK
)
1259 const uint32_t address
;
1262 { .address
= NRF5_FICR_CODEPAGESIZE
},
1263 { .address
= NRF5_FICR_CODESIZE
},
1264 { .address
= NRF51_FICR_CLENR0
},
1265 { .address
= NRF51_FICR_PPFC
},
1266 { .address
= NRF51_FICR_NUMRAMBLOCK
},
1267 { .address
= NRF51_FICR_SIZERAMBLOCK0
},
1268 { .address
= NRF51_FICR_SIZERAMBLOCK1
},
1269 { .address
= NRF51_FICR_SIZERAMBLOCK2
},
1270 { .address
= NRF51_FICR_SIZERAMBLOCK3
},
1271 { .address
= NRF5_FICR_CONFIGID
},
1272 { .address
= NRF5_FICR_DEVICEID0
},
1273 { .address
= NRF5_FICR_DEVICEID1
},
1274 { .address
= NRF5_FICR_ER0
},
1275 { .address
= NRF5_FICR_ER1
},
1276 { .address
= NRF5_FICR_ER2
},
1277 { .address
= NRF5_FICR_ER3
},
1278 { .address
= NRF5_FICR_IR0
},
1279 { .address
= NRF5_FICR_IR1
},
1280 { .address
= NRF5_FICR_IR2
},
1281 { .address
= NRF5_FICR_IR3
},
1282 { .address
= NRF5_FICR_DEVICEADDRTYPE
},
1283 { .address
= NRF5_FICR_DEVICEADDR0
},
1284 { .address
= NRF5_FICR_DEVICEADDR1
},
1285 { .address
= NRF51_FICR_OVERRIDEN
},
1286 { .address
= NRF51_FICR_NRF_1MBIT0
},
1287 { .address
= NRF51_FICR_NRF_1MBIT1
},
1288 { .address
= NRF51_FICR_NRF_1MBIT2
},
1289 { .address
= NRF51_FICR_NRF_1MBIT3
},
1290 { .address
= NRF51_FICR_NRF_1MBIT4
},
1291 { .address
= NRF51_FICR_BLE_1MBIT0
},
1292 { .address
= NRF51_FICR_BLE_1MBIT1
},
1293 { .address
= NRF51_FICR_BLE_1MBIT2
},
1294 { .address
= NRF51_FICR_BLE_1MBIT3
},
1295 { .address
= NRF51_FICR_BLE_1MBIT4
},
1297 { .address
= NRF51_UICR_CLENR0
, },
1298 { .address
= NRF51_UICR_RBPCONF
},
1299 { .address
= NRF51_UICR_XTALFREQ
},
1300 { .address
= NRF51_UICR_FWID
},
1303 for (size_t i
= 0; i
< ARRAY_SIZE(ficr
); i
++) {
1304 res
= target_read_u32(chip
->target
, ficr
[i
].address
,
1306 if (res
!= ERROR_OK
) {
1307 LOG_ERROR("Couldn't read %" PRIx32
, ficr
[i
].address
);
1312 for (size_t i
= 0; i
< ARRAY_SIZE(uicr
); i
++) {
1313 res
= target_read_u32(chip
->target
, uicr
[i
].address
,
1315 if (res
!= ERROR_OK
) {
1316 LOG_ERROR("Couldn't read %" PRIx32
, uicr
[i
].address
);
1322 "\n[factory information control block]\n\n"
1323 "code page size: %"PRIu32
"B\n"
1324 "code memory size: %"PRIu32
"kB\n"
1325 "code region 0 size: %"PRIu32
"kB\n"
1326 "pre-programmed code: %s\n"
1327 "number of ram blocks: %"PRIu32
"\n"
1328 "ram block 0 size: %"PRIu32
"B\n"
1329 "ram block 1 size: %"PRIu32
"B\n"
1330 "ram block 2 size: %"PRIu32
"B\n"
1331 "ram block 3 size: %"PRIu32
"B\n"
1332 "config id: %" PRIx32
"\n"
1333 "device id: 0x%"PRIx32
"%08"PRIx32
"\n"
1334 "encryption root: 0x%08"PRIx32
"%08"PRIx32
"%08"PRIx32
"%08"PRIx32
"\n"
1335 "identity root: 0x%08"PRIx32
"%08"PRIx32
"%08"PRIx32
"%08"PRIx32
"\n"
1336 "device address type: 0x%"PRIx32
"\n"
1337 "device address: 0x%"PRIx32
"%08"PRIx32
"\n"
1338 "override enable: %"PRIx32
"\n"
1339 "NRF_1MBIT values: %"PRIx32
" %"PRIx32
" %"PRIx32
" %"PRIx32
" %"PRIx32
"\n"
1340 "BLE_1MBIT values: %"PRIx32
" %"PRIx32
" %"PRIx32
" %"PRIx32
" %"PRIx32
"\n"
1341 "\n[user information control block]\n\n"
1342 "code region 0 size: %"PRIu32
"kB\n"
1343 "read back protection configuration: %"PRIx32
"\n"
1344 "reset value for XTALFREQ: %"PRIx32
"\n"
1345 "firmware id: 0x%04"PRIx32
,
1347 (ficr
[1].value
* ficr
[0].value
) / 1024,
1348 (ficr
[2].value
== 0xFFFFFFFF) ? 0 : ficr
[2].value
/ 1024,
1349 ((ficr
[3].value
& 0xFF) == 0x00) ? "present" : "not present",
1352 (ficr
[6].value
== 0xFFFFFFFF) ? 0 : ficr
[6].value
,
1353 (ficr
[7].value
== 0xFFFFFFFF) ? 0 : ficr
[7].value
,
1354 (ficr
[8].value
== 0xFFFFFFFF) ? 0 : ficr
[8].value
,
1356 ficr
[10].value
, ficr
[11].value
,
1357 ficr
[12].value
, ficr
[13].value
, ficr
[14].value
, ficr
[15].value
,
1358 ficr
[16].value
, ficr
[17].value
, ficr
[18].value
, ficr
[19].value
,
1360 ficr
[21].value
, ficr
[22].value
,
1362 ficr
[24].value
, ficr
[25].value
, ficr
[26].value
, ficr
[27].value
, ficr
[28].value
,
1363 ficr
[29].value
, ficr
[30].value
, ficr
[31].value
, ficr
[32].value
, ficr
[33].value
,
1364 (uicr
[0].value
== 0xFFFFFFFF) ? 0 : uicr
[0].value
/ 1024,
1365 uicr
[1].value
& 0xFFFF,
1366 uicr
[2].value
& 0xFF,
1367 uicr
[3].value
& 0xFFFF);
1372 static const struct command_registration nrf5_exec_command_handlers
[] = {
1374 .name
= "mass_erase",
1375 .handler
= nrf5_handle_mass_erase_command
,
1376 .mode
= COMMAND_EXEC
,
1377 .help
= "Erase all flash contents of the chip.",
1382 .handler
= nrf5_handle_info_command
,
1383 .mode
= COMMAND_EXEC
,
1384 .help
= "Show FICR and UICR info.",
1387 COMMAND_REGISTRATION_DONE
1390 static const struct command_registration nrf5_command_handlers
[] = {
1393 .mode
= COMMAND_ANY
,
1394 .help
= "nrf5 flash command group",
1396 .chain
= nrf5_exec_command_handlers
,
1400 .mode
= COMMAND_ANY
,
1401 .help
= "nrf51 flash command group",
1403 .chain
= nrf5_exec_command_handlers
,
1405 COMMAND_REGISTRATION_DONE
1408 const struct flash_driver nrf5_flash
= {
1410 .commands
= nrf5_command_handlers
,
1411 .flash_bank_command
= nrf5_flash_bank_command
,
1413 .erase
= nrf5_erase
,
1414 .protect
= nrf5_protect
,
1415 .write
= nrf5_write
,
1416 .read
= default_flash_read
,
1417 .probe
= nrf5_probe
,
1418 .auto_probe
= nrf5_auto_probe
,
1419 .erase_check
= default_flash_blank_check
,
1420 .protect_check
= nrf5_protect_check
,
1421 .free_driver_priv
= nrf5_free_driver_priv
,
1424 /* We need to retain the flash-driver name as well as the commands
1425 * for backwards compatibility */
1426 const struct flash_driver nrf51_flash
= {
1428 .commands
= nrf5_command_handlers
,
1429 .flash_bank_command
= nrf5_flash_bank_command
,
1431 .erase
= nrf5_erase
,
1432 .protect
= nrf5_protect
,
1433 .write
= nrf5_write
,
1434 .read
= default_flash_read
,
1435 .probe
= nrf5_probe
,
1436 .auto_probe
= nrf5_auto_probe
,
1437 .erase_check
= default_flash_blank_check
,
1438 .protect_check
= nrf5_protect_check
,
1439 .free_driver_priv
= nrf5_free_driver_priv
,
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)