Skip to content
This repository was archived by the owner on Mar 7, 2026. It is now read-only.

Commit d7e8d04

Browse files
committed
Draft of initial nRF91 support.
1 parent e5ebb80 commit d7e8d04

7 files changed

Lines changed: 119 additions & 1 deletion

File tree

src/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ SRC = \
4848
morse.c \
4949
msp432.c \
5050
nrf51.c \
51+
nrf91.c \
5152
nxpke04.c \
5253
platform.c \
5354
remote.c \

src/platforms/hosted/dap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ unsigned int dap_read_block(adiv5_access_port_s *ap, void *dest, uint32_t src, s
374374
unsigned int transferred = buf[0] + (buf[1] << 8U);
375375
if (buf[2] >= DAP_TRANSFER_FAULT) {
376376
DEBUG_WARN("dap_read_block @ %08" PRIx32 " fault -> line reset\n", src);
377-
dap_line_reset();
377+
//dap_line_reset();
378378
}
379379
if (sz != transferred)
380380
return 1;

src/target/adiv5.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ static const struct {
276276
#define SAMX5X_DSU_CTRLSTAT 0x41002100U
277277
#define SAMX5X_STATUSB_PROT (1U << 16U)
278278

279+
static void adiv5_dp_clear_sticky_errors(adiv5_debug_port_s *dp);
280+
279281
void adiv5_ap_ref(adiv5_access_port_s *ap)
280282
{
281283
if (ap->refcnt == 0)
@@ -467,6 +469,7 @@ static void adiv5_component_probe(
467469
const volatile uint32_t cidr = adiv5_ap_read_id(ap, addr + CIDR0_OFFSET);
468470
if (ap->dp->fault) {
469471
DEBUG_WARN("CIDR read timeout on AP%d, aborting.\n", ap->apsel);
472+
adiv5_dp_clear_sticky_errors(ap->dp);
470473
return;
471474
}
472475
if ((cidr & ~CID_CLASS_MASK) != CID_PREAMBLE)
@@ -665,6 +668,11 @@ adiv5_access_port_s *adiv5_new_ap(adiv5_debug_port_s *dp, uint8_t apsel)
665668
return NULL;
666669
}
667670

671+
if (tmpap.idr == 0x84770001) {
672+
// Clear HNONSEC bit to enable secure accesses.
673+
tmpap.csw &= ~(1U << 30U);
674+
}
675+
668676
/* It's valid to so create a heap copy */
669677
ap = malloc(sizeof(*ap));
670678
if (!ap) { /* malloc failed: heap exhaustion */

src/target/cortexm.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,7 @@ bool cortexm_probe(adiv5_access_port_s *ap)
662662
break;
663663
case JEP106_MANUFACTURER_NORDIC:
664664
PROBE(nrf51_probe);
665+
PROBE(nrf91_probe);
665666
break;
666667
case JEP106_MANUFACTURER_ATMEL:
667668
PROBE(samx7x_probe);

src/target/nrf91.c

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#include "general.h"
2+
#include "target.h"
3+
#include "target_internal.h"
4+
#include "cortexm.h"
5+
#include "adiv5.h"
6+
7+
/* Non-Volatile Memory Controller (NVMC) Registers */
8+
#define NRF91_NVMC 0x50039000U
9+
#define NRF91_NVMC_READY (NRF91_NVMC + 0x400U)
10+
#define NRF91_NVMC_CONFIG (NRF91_NVMC + 0x504U)
11+
#define NRF91_NVMC_ERASEALL (NRF91_NVMC + 0x50cU)
12+
13+
#define NRF91_NVMC_CONFIG_REN 0x0U // Read only access
14+
#define NRF91_NVMC_CONFIG_WEN 0x1U // Write enable
15+
#define NRF91_NVMC_CONFIG_EEN 0x2U // Erase enable
16+
#define NRF91_NVMC_CONFIG_PEEN 0x3U // Partial erase enable
17+
18+
static bool nrf91_wait_ready(target_s *const t, platform_timeout_s *const timeout)
19+
{
20+
/* Poll for NVMC_READY */
21+
while (target_mem_read32(t, NRF91_NVMC_READY) == 0) {
22+
if (target_check_error(t))
23+
return false;
24+
if (timeout)
25+
target_print_progress(timeout);
26+
}
27+
return true;
28+
}
29+
30+
static bool nrf91_flash_erase(target_flash_s *f, target_addr_t addr, size_t len)
31+
{
32+
target_s *t = f->t;
33+
34+
/* Enable erase */
35+
target_mem_write32(t, NRF91_NVMC_CONFIG, NRF91_NVMC_CONFIG_EEN);
36+
if (!nrf91_wait_ready(t, NULL))
37+
return false;
38+
39+
for (size_t offset = 0; offset < len; offset += f->blocksize) {
40+
/* Write all ones to first word in page to erase it */
41+
target_mem_write32(t, addr + offset, 0xffffffffU);
42+
43+
if (!nrf91_wait_ready(t, NULL))
44+
return false;
45+
}
46+
47+
/* Return to read-only */
48+
target_mem_write32(t, NRF91_NVMC_CONFIG, NRF91_NVMC_CONFIG_REN);
49+
return nrf91_wait_ready(t, NULL);
50+
}
51+
52+
static bool nrf91_flash_write(target_flash_s *f, target_addr_t dest, const void *src, size_t len)
53+
{
54+
DEBUG_WARN("%s let's go!\n", __func__);
55+
target_s *t = f->t;
56+
57+
/* Enable write */
58+
target_mem_write32(t, NRF91_NVMC_CONFIG, NRF91_NVMC_CONFIG_WEN);
59+
if (!nrf91_wait_ready(t, NULL))
60+
return false;
61+
/* Write the data */
62+
target_mem_write(t, dest, src, len);
63+
if (!nrf91_wait_ready(t, NULL))
64+
return false;
65+
/* Return to read-only */
66+
target_mem_write32(t, NRF91_NVMC_CONFIG, NRF91_NVMC_CONFIG_REN);
67+
return true;
68+
}
69+
70+
static void nrf91_add_flash(target_s *t, uint32_t addr, size_t length, size_t erasesize)
71+
{
72+
target_flash_s *f = calloc(1, sizeof(*f));
73+
if (!f) { /* calloc failed: heap exhaustion */
74+
DEBUG_WARN("calloc: failed in %s\n", __func__);
75+
return;
76+
}
77+
78+
f->start = addr;
79+
f->length = length;
80+
f->blocksize = erasesize;
81+
f->erase = nrf91_flash_erase;
82+
f->write = nrf91_flash_write;
83+
f->erased = 0xff;
84+
target_add_flash(t, f);
85+
}
86+
87+
bool nrf91_probe(target_s *t) {
88+
adiv5_access_port_s *ap = cortexm_ap(t);
89+
90+
if (ap->dp->version < 2U) {
91+
return false;
92+
}
93+
94+
switch (ap->dp->target_partno) {
95+
case 0x90:
96+
t->driver = "Nordic nRF9160";
97+
t->target_options |= CORTEXM_TOPT_INHIBIT_NRST;
98+
target_add_ram(t, 0x20000000, 256U * 1024U);
99+
nrf91_add_flash(t, 0, 4096U * 256U, 4096U);
100+
break;
101+
default:
102+
return false;
103+
}
104+
105+
return true;
106+
}

src/target/target_probe.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ TARGET_PROBE_WEAK_NOP(samx7x_probe)
9292
TARGET_PROBE_WEAK_NOP(sam3x_probe)
9393
TARGET_PROBE_WEAK_NOP(sam4l_probe)
9494
TARGET_PROBE_WEAK_NOP(nrf51_probe)
95+
TARGET_PROBE_WEAK_NOP(nrf91_probe)
9596
TARGET_PROBE_WEAK_NOP(samd_probe)
9697
TARGET_PROBE_WEAK_NOP(samx5x_probe)
9798
TARGET_PROBE_WEAK_NOP(kinetis_probe)

src/target/target_probe.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ bool samx7x_probe(target_s *t);
5757
bool sam3x_probe(target_s *t);
5858
bool sam4l_probe(target_s *t);
5959
bool nrf51_probe(target_s *t);
60+
bool nrf91_probe(target_s *t);
6061
bool samd_probe(target_s *t);
6162
bool samx5x_probe(target_s *t);
6263
bool kinetis_probe(target_s *t);

0 commit comments

Comments
 (0)