Skip to content

Commit 8e7fee2

Browse files
committed
Working flash pages for nvm.ByteArray adafruit#1042
import microcontroller def dump(n = microcontroller.nvm): for i in range(0,len(n)): print ("%02X " % n[i], end="") if i % 16 == 15: print('') microcontroller.nvm[0:4096] = bytes([1,2,3,4,5,6,7,8]) * 512 microcontroller.nvm[4096:8192] = bytes([16,17,18,19]) * 1024 microcontroller.nvm[4090:4101] = b'thisisatest' microcontroller.nvm[100:105] = b'hello' microcontroller.nvm[8000:8007] = b'goodbye' dump()
1 parent 592bd01 commit 8e7fee2

2 files changed

Lines changed: 33 additions & 3 deletions

File tree

ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
#define MICROPY_HW_BOARD_NAME "Adafruit Feather nRF52840 Express"
3333
#define MICROPY_HW_MCU_NAME "nRF52840"
3434
#define MICROPY_PY_SYS_PLATFORM "Feather52840Express"
35+
3536
#define FLASH_SIZE (0x100000)
37+
#define FLASH_PAGE_SIZE (4096)
3638

3739
#define MICROPY_HW_NEOPIXEL (&pin_P0_16)
3840

ports/nrf/common-hal/nvm/ByteArray.c

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,39 @@ uint32_t common_hal_nvm_bytearray_get_length(nvm_bytearray_obj_t *self) {
3535
return self->len;
3636
}
3737

38+
static void write_page(uint32_t page_addr, uint32_t offset, uint32_t len, uint8_t *bytes) {
39+
// Write a whole page to flash, buffering it first and then erasing and rewriting
40+
// it since we can only clear a whole page at a time.
41+
// TODO (maybe) check if only clearing bits (don't need to erase)
42+
// XXX should this suspend interrupts so erase/write is atomic?
43+
44+
if (offset == 0 && len == FLASH_PAGE_SIZE) {
45+
nrf_nvmc_page_erase(page_addr);
46+
nrf_nvmc_write_bytes(page_addr, bytes, FLASH_PAGE_SIZE);
47+
} else {
48+
uint8_t buffer[FLASH_PAGE_SIZE];
49+
memcpy(buffer, (uint8_t *)page_addr, FLASH_PAGE_SIZE);
50+
memcpy(buffer + offset, bytes, len);
51+
nrf_nvmc_page_erase(page_addr);
52+
nrf_nvmc_write_bytes(page_addr, buffer, FLASH_PAGE_SIZE);
53+
}
54+
}
55+
3856
bool common_hal_nvm_bytearray_set_bytes(nvm_bytearray_obj_t *self,
3957
uint32_t start_index, uint8_t* values, uint32_t len) {
40-
printf("%ld %ld\n", start_index, len);
41-
nrf_nvmc_page_erase(self->start_address);
42-
nrf_nvmc_write_bytes(self->start_address + start_index, values, len);
58+
59+
uint32_t address = self->start_address + start_index;
60+
uint32_t offset = address % FLASH_PAGE_SIZE;
61+
uint32_t page_addr = address - offset;
62+
63+
while (len) {
64+
uint32_t write_len = MIN(len, FLASH_PAGE_SIZE - offset);
65+
write_page(page_addr, offset, write_len, values);
66+
len -= write_len;
67+
values += write_len;
68+
page_addr += FLASH_PAGE_SIZE;
69+
offset = 0;
70+
}
4371
return true;
4472
}
4573

0 commit comments

Comments
 (0)