summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Halbert <halbert@adafruit.com>2019-12-12 16:32:51 -0500
committerGitHub <noreply@github.com>2019-12-12 16:32:51 -0500
commit10183d59246a1d266b9c5df11aabc105fbdb3178 (patch)
treeada3663598b60f30a1ba53b3a8ff5b8143af8e76
parentbcd03ed7ee6cfbf0f3be926c2f7912201c5a7ca6 (diff)
parentef2ef7a6b8c30dd64753e2ceca7587d9ead90e44 (diff)
Merge pull request #2371 from dhalbert/ld-cleanup
Parameterize flash storage layout for atmel-samd and nrf
-rw-r--r--locale/circuitpython.pot2
-rwxr-xr-xmain.c2
-rw-r--r--ports/atmel-samd/Makefile17
-rw-r--r--ports/atmel-samd/bindings/samd/Clock.c260
-rw-r--r--ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/arduino_zero/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/bast_pro_mini_m0/mpconfigboard.h3
-rw-r--r--ports/atmel-samd/boards/bast_pro_mini_m0/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/capablerobot_usbhub/mpconfigboard.h9
-rw-r--r--ports/atmel-samd/boards/capablerobot_usbhub/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h6
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h6
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h6
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/common.template.ld (renamed from ports/atmel-samd/boards/samd21x18-bootloader-crystalless.ld)27
-rw-r--r--ports/atmel-samd/boards/cp32-m4/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/cp32-m4/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/datum_distance/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/datum_distance/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/datum_imu/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/datum_imu/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/datum_light/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/datum_light/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/datum_weather/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/datum_weather/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/escornabot_makech/mpconfigboard.h6
-rw-r--r--ports/atmel-samd/boards/escornabot_makech/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h7
-rw-r--r--ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.h6
-rw-r--r--ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h6
-rw-r--r--ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk1
-rwxr-xr-xports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h6
-rwxr-xr-xports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/gemma_m0/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/gemma_m0/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h6
-rw-r--r--ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h6
-rw-r--r--ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/boards/meowmeow/mpconfigboard.h6
-rw-r--r--ports/atmel-samd/boards/meowmeow/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h6
-rw-r--r--ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/metro_m4_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/monster_m4sk/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/monster_m4sk/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/pewpew10/mpconfigboard.h5
-rw-r--r--ports/atmel-samd/boards/pewpew10/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/pewpew_m4/mpconfigboard.h9
-rw-r--r--ports/atmel-samd/boards/pewpew_m4/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/pirkey_m0/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/pybadge/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/pybadge/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/pygamer/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/pygamer/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/pygamer_advance/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/pygamer_advance/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/pyportal/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/pyportal/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/pyportal_titano/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/pyportal_titano/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/pyruler/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/pyruler/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/sam32/mpconfigboard.h7
-rw-r--r--ports/atmel-samd/boards/sam32/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/samd21x18-bootloader-external-flash-crystalless.ld84
-rw-r--r--ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld84
-rw-r--r--ports/atmel-samd/boards/samd21x18-bootloader.ld85
-rw-r--r--ports/atmel-samd/boards/samd21x18-external-flash.ld83
-rw-r--r--ports/atmel-samd/boards/samd21x18.ld83
-rw-r--r--ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld84
-rw-r--r--ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld84
-rw-r--r--ports/atmel-samd/boards/samd51x19-bootloader.ld84
-rw-r--r--ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld84
-rw-r--r--ports/atmel-samd/boards/samd51x20-bootloader.ld84
-rw-r--r--ports/atmel-samd/boards/samd51x20-external-flash.ld82
-rw-r--r--ports/atmel-samd/boards/samd51x20.ld83
-rw-r--r--ports/atmel-samd/boards/serpente/mpconfigboard.h7
-rw-r--r--ports/atmel-samd/boards/serpente/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/shirtty/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/shirtty/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/snekboard/mpconfigboard.h7
-rw-r--r--ports/atmel-samd/boards/snekboard/mpconfigboard.mk1
-rwxr-xr-xports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.h4
-rwxr-xr-xports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/mpconfigboard.mk1
-rwxr-xr-xports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.h10
-rwxr-xr-xports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.h7
-rw-r--r--ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.h8
-rw-r--r--ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/trinket_m0/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h6
-rw-r--r--ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/uchip/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/uchip/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/ugame10/mpconfigboard.h6
-rw-r--r--ports/atmel-samd/boards/ugame10/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.h6
-rw-r--r--ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c22
-rw-r--r--ports/atmel-samd/common-hal/microcontroller/__init__.c3
-rw-r--r--ports/atmel-samd/ld_defines.c30
-rw-r--r--ports/atmel-samd/mpconfigport.h140
-rw-r--r--ports/atmel-samd/mpconfigport.mk9
m---------ports/atmel-samd/peripherals0
-rw-r--r--ports/atmel-samd/supervisor/internal_flash.c2
-rw-r--r--ports/atmel-samd/supervisor/internal_flash.h11
-rw-r--r--ports/atmel-samd/supervisor/port.c54
-rw-r--r--ports/cxd56/boards/spresense/mpconfigboard.mk2
-rwxr-xr-xports/nrf/Makefile23
-rw-r--r--ports/nrf/README.md94
-rw-r--r--ports/nrf/bluetooth/ble_uart.c4
-rw-r--r--ports/nrf/boards/adafruit_nrf52840_s140_v6.ld50
-rw-r--r--ports/nrf/boards/arduino_nano_33_ble/mpconfigboard.mk16
-rw-r--r--ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.h9
-rw-r--r--ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.mk16
-rw-r--r--ports/nrf/boards/common.template.ld (renamed from ports/nrf/boards/common.ld)55
-rw-r--r--ports/nrf/boards/electronut_labs_blip/mpconfigboard.h6
-rw-r--r--ports/nrf/boards/electronut_labs_blip/mpconfigboard.mk18
-rw-r--r--ports/nrf/boards/electronut_labs_papyr/mpconfigboard.h6
-rw-r--r--ports/nrf/boards/electronut_labs_papyr/mpconfigboard.mk16
-rw-r--r--ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h9
-rw-r--r--ports/nrf/boards/feather_nrf52840_express/mpconfigboard.mk16
-rw-r--r--ports/nrf/boards/itsybitsy_nrf52840_express/mpconfigboard.h3
-rw-r--r--ports/nrf/boards/itsybitsy_nrf52840_express/mpconfigboard.mk16
-rw-r--r--ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.h6
-rw-r--r--ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.mk16
-rw-r--r--ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.h6
-rw-r--r--ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.mk17
-rw-r--r--ports/nrf/boards/metro_nrf52840_express/mpconfigboard.h9
-rw-r--r--ports/nrf/boards/metro_nrf52840_express/mpconfigboard.mk16
-rw-r--r--ports/nrf/boards/nrf52840_1M_256k.ld28
-rw-r--r--ports/nrf/boards/nrf52840_1M_256k_s140_6.0.0.ld28
-rw-r--r--ports/nrf/boards/particle_argon/mpconfigboard.h6
-rw-r--r--ports/nrf/boards/particle_argon/mpconfigboard.mk16
-rw-r--r--ports/nrf/boards/particle_boron/mpconfigboard.h6
-rw-r--r--ports/nrf/boards/particle_boron/mpconfigboard.mk16
-rw-r--r--ports/nrf/boards/particle_xenon/mpconfigboard.h6
-rw-r--r--ports/nrf/boards/particle_xenon/mpconfigboard.mk16
-rw-r--r--ports/nrf/boards/pca10056/mpconfigboard.h2
-rw-r--r--ports/nrf/boards/pca10056/mpconfigboard.mk16
-rw-r--r--ports/nrf/boards/pca10059/mpconfigboard.h2
-rw-r--r--ports/nrf/boards/pca10059/mpconfigboard.mk17
-rw-r--r--ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.h2
-rw-r--r--ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.mk16
-rw-r--r--ports/nrf/common-hal/_bleio/Adapter.c9
-rw-r--r--ports/nrf/common-hal/microcontroller/__init__.c3
-rw-r--r--ports/nrf/common-hal/nvm/ByteArray.c13
-rw-r--r--ports/nrf/common-hal/nvm/ByteArray.h2
-rw-r--r--ports/nrf/ld_defines.c39
-rw-r--r--ports/nrf/mpconfigport.h112
-rw-r--r--ports/nrf/mpconfigport.mk24
-rw-r--r--ports/nrf/peripherals/nrf/nvm.h4
-rw-r--r--ports/nrf/supervisor/internal_flash.c8
-rw-r--r--ports/nrf/supervisor/serial.c10
-rw-r--r--ports/stm32f4/boards/feather_stm32f405_express/mpconfigboard.h3
-rw-r--r--ports/stm32f4/boards/pyboard_v11/mpconfigboard.h2
-rw-r--r--ports/stm32f4/boards/stm32f411ve_discovery/mpconfigboard.h6
-rw-r--r--ports/stm32f4/boards/stm32f412zg_discovery/mpconfigboard.h3
-rw-r--r--py/circuitpy_defns.mk13
-rw-r--r--py/circuitpy_mpconfig.h15
-rw-r--r--py/circuitpy_mpconfig.mk23
-rw-r--r--py/py.mk2
-rw-r--r--supervisor/supervisor.mk73
-rw-r--r--tools/build_memory_info.py21
-rwxr-xr-xtools/gen_ld_files.py60
216 files changed, 948 insertions, 2151 deletions
diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot
index 3b605d99f..e21541d7e 100644
--- a/locale/circuitpython.pot
+++ b/locale/circuitpython.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-12-12 14:51-0500\n"
+"POT-Creation-Date: 2019-12-12 15:51-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/main.c b/main.c
index 2bbfd1be0..805888ddd 100755
--- a/main.c
+++ b/main.c
@@ -204,7 +204,7 @@ void cleanup_after_vm(supervisor_allocation* heap) {
bool run_code_py(safe_mode_t safe_mode) {
bool serial_connected_at_start = serial_connected();
- #ifdef CIRCUITPY_AUTORELOAD_DELAY_MS
+ #if CIRCUITPY_AUTORELOAD_DELAY_MS > 0
if (serial_connected_at_start) {
serial_write("\n");
if (autoreload_is_enabled()) {
diff --git a/ports/atmel-samd/Makefile b/ports/atmel-samd/Makefile
index 5d47fd087..83fd879aa 100644
--- a/ports/atmel-samd/Makefile
+++ b/ports/atmel-samd/Makefile
@@ -157,7 +157,7 @@ endif
-LDFLAGS = $(CFLAGS) -nostartfiles -fshort-enums -Wl,-nostdlib -Wl,-T,$(LD_FILE) -Wl,-Map=$@.map -Wl,-cref -Wl,-gc-sections -specs=nano.specs
+LDFLAGS = $(CFLAGS) -nostartfiles -fshort-enums -Wl,-nostdlib -Wl,-T,$(GENERATED_LD_FILE) -Wl,-Map=$@.map -Wl,-cref -Wl,-gc-sections -specs=nano.specs
LIBS := -lgcc -lc
# Use toolchain libm if we're not using our own.
@@ -301,12 +301,17 @@ SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE))
$(addprefix shared-module/, $(SRC_SHARED_MODULE)) \
$(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL))
+# There may be duplicates between SRC_COMMON_HAL_EXPANDED and SRC_SHARED_MODULE_EXPANDED,
+# because a few modules have files both in common-hal/ and shared-modules/.
+# Doing a $(sort ...) removes duplicates as part of sorting.
+SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED))
+
+
SRC_S = supervisor/$(CHIP_FAMILY)_cpu.s
OBJ = $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_ASF:.c=.o))
-OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_EXPANDED:.c=.o))
-OBJ += $(addprefix $(BUILD)/, $(SRC_SHARED_MODULE_EXPANDED:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o))
ifeq ($(INTERNAL_LIBM),1)
OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o))
endif
@@ -319,10 +324,10 @@ SRC_QSTR_PREPROCESSOR += peripherals/samd/$(CHIP_FAMILY)/clocks.c
all: $(BUILD)/firmware.bin $(BUILD)/firmware.uf2
-$(BUILD)/firmware.elf: $(OBJ)
+$(BUILD)/firmware.elf: $(OBJ) $(GENERATED_LD_FILE)
$(STEPECHO) "LINK $@"
- $(Q)$(CC) -o $@ $(LDFLAGS) $^ -Wl,--start-group $(LIBS) -Wl,--end-group
- $(Q)$(SIZE) $@ | $(PYTHON3) $(TOP)/tools/build_memory_info.py $(LD_FILE)
+ $(Q)$(CC) -o $@ $(LDFLAGS) $(OBJ) -Wl,--start-group $(LIBS) -Wl,--end-group
+ $(Q)$(SIZE) $@ | $(PYTHON3) $(TOP)/tools/build_memory_info.py $(GENERATED_LD_FILE)
$(BUILD)/firmware.bin: $(BUILD)/firmware.elf
$(STEPECHO) "Create $@"
diff --git a/ports/atmel-samd/bindings/samd/Clock.c b/ports/atmel-samd/bindings/samd/Clock.c
index be597c444..b88bb82e2 100644
--- a/ports/atmel-samd/bindings/samd/Clock.c
+++ b/ports/atmel-samd/bindings/samd/Clock.c
@@ -163,3 +163,263 @@ const mp_obj_type_t samd_clock_type = {
.print = samd_clock_print,
.locals_dict = (mp_obj_t)&samd_clock_locals_dict,
};
+
+#ifdef SAMD21
+
+#ifdef SAMD21_EXPOSE_ALL_CLOCKS
+CLOCK_SOURCE(XOSC);
+CLOCK_SOURCE(GCLKIN);
+CLOCK_SOURCE(GCLKGEN1);
+CLOCK_SOURCE(OSCULP32K);
+#endif
+CLOCK_SOURCE(OSC32K);
+CLOCK_SOURCE(XOSC32K);
+#ifdef SAMD21_EXPOSE_ALL_CLOCKS
+CLOCK_SOURCE(OSC8M);
+CLOCK_SOURCE(DFLL48M);
+CLOCK_SOURCE(DPLL96M);
+
+CLOCK_GCLK_(SYSCTRL, DFLL48);
+CLOCK_GCLK_(SYSCTRL, FDPLL);
+CLOCK_GCLK_(SYSCTRL, FDPLL32K);
+CLOCK_GCLK(WDT);
+#endif
+CLOCK_GCLK(RTC);
+#ifdef SAMD21_EXPOSE_ALL_CLOCKS
+CLOCK_GCLK(EIC);
+CLOCK_GCLK(USB);
+CLOCK_GCLK_(EVSYS, 0);
+CLOCK_GCLK_(EVSYS, 1);
+CLOCK_GCLK_(EVSYS, 2);
+CLOCK_GCLK_(EVSYS, 3);
+CLOCK_GCLK_(EVSYS, 4);
+CLOCK_GCLK_(EVSYS, 5);
+CLOCK_GCLK_(EVSYS, 6);
+CLOCK_GCLK_(EVSYS, 7);
+CLOCK_GCLK_(EVSYS, 8);
+CLOCK_GCLK_(EVSYS, 9);
+CLOCK_GCLK_(EVSYS, 10);
+CLOCK_GCLK_(EVSYS, 11);
+CLOCK(SERCOMx_SLOW, 1, 19);
+CLOCK_GCLK_(SERCOM0, CORE);
+CLOCK_GCLK_(SERCOM1, CORE);
+CLOCK_GCLK_(SERCOM2, CORE);
+CLOCK_GCLK_(SERCOM3, CORE);
+CLOCK_GCLK_(SERCOM4, CORE);
+CLOCK_GCLK_(SERCOM5, CORE);
+CLOCK(TCC0_TCC1, 1, 26);
+CLOCK(TCC2_TCC3, 1, 27);
+CLOCK(TC4_TC5, 1, 28);
+CLOCK(TC6_TC7, 1, 29);
+CLOCK_GCLK(ADC);
+CLOCK_GCLK_(AC, DIG);
+CLOCK_GCLK_(AC, ANA);
+CLOCK_GCLK(DAC);
+CLOCK_GCLK(PTC);
+CLOCK_GCLK_(I2S, 0);
+CLOCK_GCLK_(I2S, 1);
+
+CLOCK(SYSTICK, 2, 0);
+#endif
+
+STATIC const mp_rom_map_elem_t samd_clock_global_dict_table[] = {
+#ifdef SAMD21_EXPOSE_ALL_CLOCKS
+ CLOCK_ENTRY(XOSC),
+ CLOCK_ENTRY(GCLKIN),
+ CLOCK_ENTRY(GCLKGEN1),
+ CLOCK_ENTRY(OSCULP32K),
+#endif
+ CLOCK_ENTRY(OSC32K),
+ CLOCK_ENTRY(XOSC32K),
+#ifdef SAMD21_EXPOSE_ALL_CLOCKS
+ CLOCK_ENTRY(OSC8M),
+ CLOCK_ENTRY(DFLL48M),
+ CLOCK_ENTRY(DPLL96M),
+ CLOCK_ENTRY_(SYSCTRL, DFLL48),
+ CLOCK_ENTRY_(SYSCTRL, FDPLL),
+ CLOCK_ENTRY_(SYSCTRL, FDPLL32K),
+ CLOCK_ENTRY(WDT),
+#endif
+ CLOCK_ENTRY(RTC),
+#ifdef SAMD21_EXPOSE_ALL_CLOCKS
+ CLOCK_ENTRY(EIC),
+ CLOCK_ENTRY(USB),
+ CLOCK_ENTRY_(EVSYS, 0),
+ CLOCK_ENTRY_(EVSYS, 1),
+ CLOCK_ENTRY_(EVSYS, 2),
+ CLOCK_ENTRY_(EVSYS, 3),
+ CLOCK_ENTRY_(EVSYS, 4),
+ CLOCK_ENTRY_(EVSYS, 5),
+ CLOCK_ENTRY_(EVSYS, 6),
+ CLOCK_ENTRY_(EVSYS, 7),
+ CLOCK_ENTRY_(EVSYS, 8),
+ CLOCK_ENTRY_(EVSYS, 9),
+ CLOCK_ENTRY_(EVSYS, 10),
+ CLOCK_ENTRY_(EVSYS, 11),
+ CLOCK_ENTRY(SERCOMx_SLOW),
+ CLOCK_ENTRY_(SERCOM0, CORE),
+ CLOCK_ENTRY_(SERCOM1, CORE),
+ CLOCK_ENTRY_(SERCOM2, CORE),
+ CLOCK_ENTRY_(SERCOM3, CORE),
+ CLOCK_ENTRY_(SERCOM4, CORE),
+ CLOCK_ENTRY_(SERCOM5, CORE),
+ CLOCK_ENTRY(TCC0_TCC1),
+ CLOCK_ENTRY(TCC2_TCC3),
+ CLOCK_ENTRY(TC4_TC5),
+ CLOCK_ENTRY(TC6_TC7),
+ CLOCK_ENTRY(ADC),
+ CLOCK_ENTRY_(AC, DIG),
+ CLOCK_ENTRY_(AC, ANA),
+ CLOCK_ENTRY(DAC),
+ CLOCK_ENTRY(PTC),
+ CLOCK_ENTRY_(I2S, 0),
+ CLOCK_ENTRY_(I2S, 1),
+
+ CLOCK_ENTRY(SYSTICK),
+#endif
+};
+MP_DEFINE_CONST_DICT(samd_clock_globals, samd_clock_global_dict_table);
+
+#endif // SAMD21
+
+#ifdef SAMD51
+
+
+
+#include <instance/can0.h>
+#include <instance/can1.h>
+#include <instance/i2s.h>
+#include <instance/sdhc1.h>
+#include <instance/sercom6.h>
+#include <instance/sercom7.h>
+#include <instance/tcc4.h>
+
+CLOCK_SOURCE(XOSC0);
+CLOCK_SOURCE(XOSC1);
+CLOCK_SOURCE(GCLKIN);
+CLOCK_SOURCE(GCLKGEN1);
+CLOCK_SOURCE(OSCULP32K);
+CLOCK_SOURCE(XOSC32K);
+CLOCK_SOURCE(DFLL);
+CLOCK_SOURCE(DPLL0);
+CLOCK_SOURCE(DPLL1);
+
+CLOCK_GCLK_(OSCCTRL, DFLL48);
+CLOCK_GCLK_(OSCCTRL, FDPLL0);
+CLOCK_GCLK_(OSCCTRL, FDPLL1);
+CLOCK_GCLK_(OSCCTRL, FDPLL032K); // GCLK_OSCCTRL_FDPLL1_32K, GCLK_SDHC0_SLOW, GCLK_SDHC1_SLOW, GCLK_SERCOM[0..7]_SLOW
+CLOCK_GCLK(EIC);
+CLOCK_GCLK_(FREQM, MSR);
+// 6: GCLK_FREQM_REF
+CLOCK_GCLK_(SERCOM0, CORE);
+CLOCK_GCLK_(SERCOM1, CORE);
+CLOCK(TC0_TC1, 1, 9);
+CLOCK_GCLK(USB);
+CLOCK_GCLK_(EVSYS, 0);
+CLOCK_GCLK_(EVSYS, 1);
+CLOCK_GCLK_(EVSYS, 2);
+CLOCK_GCLK_(EVSYS, 3);
+CLOCK_GCLK_(EVSYS, 4);
+CLOCK_GCLK_(EVSYS, 5);
+CLOCK_GCLK_(EVSYS, 6);
+CLOCK_GCLK_(EVSYS, 7);
+CLOCK_GCLK_(EVSYS, 8);
+CLOCK_GCLK_(EVSYS, 9);
+CLOCK_GCLK_(EVSYS, 10);
+CLOCK_GCLK_(EVSYS, 11);
+CLOCK_GCLK_(SERCOM2, CORE);
+CLOCK_GCLK_(SERCOM3, CORE);
+CLOCK(TCC0_TCC1, 1, 25);
+CLOCK(TC2_TC3, 1, 26);
+CLOCK_GCLK(CAN0);
+CLOCK_GCLK(CAN1);
+CLOCK(TCC2_TCC3, 1, 29);
+CLOCK(TC4_TC5, 1, 30);
+// CLOCK_GCLK(PDEC);
+// CLOCK_GCLK(AC);
+// CLOCK_GCLK(CCL);
+CLOCK_GCLK_(SERCOM4, CORE);
+CLOCK_GCLK_(SERCOM5, CORE);
+CLOCK_GCLK_(SERCOM6, CORE);
+CLOCK_GCLK_(SERCOM7, CORE);
+CLOCK_GCLK(TCC4);
+CLOCK(TC6_TC7, 1, 39);
+CLOCK_GCLK(ADC0);
+CLOCK_GCLK(ADC1);
+CLOCK_GCLK(DAC);
+CLOCK_GCLK_(I2S, 0);
+CLOCK_GCLK_(I2S, 1);
+// CLOCK_GCLK(SDHC0);
+// CLOCK_GCLK(SDHC1);
+// 47: GCLK_CM4_TRACE
+
+CLOCK(SYSTICK, 2, 0);
+CLOCK(CPU, 2, 1);
+CLOCK(RTC, 2, 2);
+
+
+STATIC const mp_rom_map_elem_t samd_clock_global_dict_table[] = {
+ CLOCK_ENTRY(XOSC0),
+ CLOCK_ENTRY(XOSC1),
+ CLOCK_ENTRY(GCLKIN),
+ CLOCK_ENTRY(GCLKGEN1),
+ CLOCK_ENTRY(OSCULP32K),
+ CLOCK_ENTRY(XOSC32K),
+ CLOCK_ENTRY(DFLL),
+ CLOCK_ENTRY(DPLL0),
+ CLOCK_ENTRY(DPLL1),
+
+ CLOCK_ENTRY_(OSCCTRL, DFLL48),
+ CLOCK_ENTRY_(OSCCTRL, FDPLL0),
+ CLOCK_ENTRY_(OSCCTRL, FDPLL1),
+ CLOCK_ENTRY_(OSCCTRL, FDPLL032K),
+ CLOCK_ENTRY(EIC),
+ CLOCK_ENTRY_(FREQM, MSR),
+ CLOCK_ENTRY_(SERCOM0, CORE),
+ CLOCK_ENTRY_(SERCOM1, CORE),
+ CLOCK_ENTRY(TC0_TC1),
+ CLOCK_ENTRY(USB),
+ CLOCK_ENTRY_(EVSYS, 0),
+ CLOCK_ENTRY_(EVSYS, 1),
+ CLOCK_ENTRY_(EVSYS, 2),
+ CLOCK_ENTRY_(EVSYS, 3),
+ CLOCK_ENTRY_(EVSYS, 4),
+ CLOCK_ENTRY_(EVSYS, 5),
+ CLOCK_ENTRY_(EVSYS, 6),
+ CLOCK_ENTRY_(EVSYS, 7),
+ CLOCK_ENTRY_(EVSYS, 8),
+ CLOCK_ENTRY_(EVSYS, 9),
+ CLOCK_ENTRY_(EVSYS, 10),
+ CLOCK_ENTRY_(EVSYS, 11),
+ CLOCK_ENTRY_(SERCOM2, CORE),
+ CLOCK_ENTRY_(SERCOM3, CORE),
+ CLOCK_ENTRY(TCC0_TCC1),
+ CLOCK_ENTRY(TC2_TC3),
+ CLOCK_ENTRY(CAN0),
+ CLOCK_ENTRY(CAN1),
+ CLOCK_ENTRY(TCC2_TCC3),
+ CLOCK_ENTRY(TC4_TC5),
+ // CLOCK_ENTRY(PDEC),
+ // CLOCK_ENTRY(AC),
+ // CLOCK_ENTRY(CCL),
+ CLOCK_ENTRY_(SERCOM4, CORE),
+ CLOCK_ENTRY_(SERCOM5, CORE),
+ CLOCK_ENTRY_(SERCOM6, CORE),
+ CLOCK_ENTRY_(SERCOM7, CORE),
+ CLOCK_ENTRY(TCC4),
+ CLOCK_ENTRY(TC6_TC7),
+ CLOCK_ENTRY(ADC0),
+ CLOCK_ENTRY(ADC1),
+ CLOCK_ENTRY(DAC),
+ CLOCK_ENTRY_(I2S, 0),
+ CLOCK_ENTRY_(I2S, 1),
+ // CLOCK_ENTRY(SDHC0),
+ // CLOCK_ENTRY(SDHC1),
+
+ CLOCK_ENTRY(SYSTICK),
+ CLOCK_ENTRY(CPU),
+ CLOCK_ENTRY(RTC),
+};
+MP_DEFINE_CONST_DICT(samd_clock_globals, samd_clock_global_dict_table);
+
+#endif // SAMD51
diff --git a/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h b/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h
index a508d9191..226717c83 100644
--- a/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h
+++ b/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h
@@ -7,10 +7,6 @@
#define MICROPY_HW_LED_STATUS (&pin_PB23)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA09)
#define DEFAULT_I2C_BUS_SDA (&pin_PA08)
diff --git a/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.mk b/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.mk
index a543468e5..bd682ade0 100644
--- a/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x2341
USB_PID = 0x8053
USB_PRODUCT = "Arduino MKR1300"
diff --git a/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.h b/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.h
index 02750e646..4871b1798 100644
--- a/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.h
+++ b/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.h
@@ -5,10 +5,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA09)
#define DEFAULT_I2C_BUS_SDA (&pin_PA08)
diff --git a/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.mk b/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.mk
index 5612eb88d..894b9b011 100644
--- a/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x239A
USB_PID = 0x8050
USB_PRODUCT = "Arduino MKRZero"
diff --git a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h
index ec201e6ef..bf2a68c57 100644
--- a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h
+++ b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h
@@ -10,10 +10,6 @@
#define MICROPY_PORT_B (PORT_PB03)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk
index cbbf15a3e..f94ec13b7 100644
--- a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x2341
USB_PID = 0x824D
USB_PRODUCT = "Arduino Zero"
diff --git a/ports/atmel-samd/boards/bast_pro_mini_m0/mpconfigboard.h b/ports/atmel-samd/boards/bast_pro_mini_m0/mpconfigboard.h
index 561240c69..cbfb11d20 100644
--- a/ports/atmel-samd/boards/bast_pro_mini_m0/mpconfigboard.h
+++ b/ports/atmel-samd/boards/bast_pro_mini_m0/mpconfigboard.h
@@ -5,6 +5,7 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
+// No microcontroller.nvm
#define CIRCUITPY_INTERNAL_NVM_SIZE 0
#define DEFAULT_I2C_BUS_SCL (&pin_PA08)
@@ -17,8 +18,6 @@
#define DEFAULT_UART_BUS_RX (&pin_PA01)
#define DEFAULT_UART_BUS_TX (&pin_PA00)
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000)
-
#define IGNORE_PIN_PA03 1
#define IGNORE_PIN_PA12 1
#define IGNORE_PIN_PA13 1
diff --git a/ports/atmel-samd/boards/bast_pro_mini_m0/mpconfigboard.mk b/ports/atmel-samd/boards/bast_pro_mini_m0/mpconfigboard.mk
index 08e42aa4e..c3f0750a9 100644
--- a/ports/atmel-samd/boards/bast_pro_mini_m0/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/bast_pro_mini_m0/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x1209
USB_PID = 0xBAB3
USB_PRODUCT = "Bast Pro Mini M0"
diff --git a/ports/atmel-samd/boards/capablerobot_usbhub/mpconfigboard.h b/ports/atmel-samd/boards/capablerobot_usbhub/mpconfigboard.h
index f4e40739b..d359687e1 100644
--- a/ports/atmel-samd/boards/capablerobot_usbhub/mpconfigboard.h
+++ b/ports/atmel-samd/boards/capablerobot_usbhub/mpconfigboard.h
@@ -3,7 +3,6 @@
#define CIRCUITPY_MCU_FAMILY samd51
-
#define MICROPY_HW_LED_STATUS (&pin_PA22)
// These are pins not to reset.
@@ -14,14 +13,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/capablerobot_usbhub/mpconfigboard.mk b/ports/atmel-samd/boards/capablerobot_usbhub/mpconfigboard.mk
index f390a8681..0ff6f58ea 100644
--- a/ports/atmel-samd/boards/capablerobot_usbhub/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/capablerobot_usbhub/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x04D8
USB_PID = 0xEDB3
USB_PRODUCT = "Programmable USB Hub"
diff --git a/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.h b/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.h
index 7a32bf023..b92c2a65e 100644
--- a/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.h
+++ b/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.h
@@ -7,14 +7,10 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
#define DEFAULT_SPI_BUS_SCK (&pin_PA19)
#define DEFAULT_SPI_BUS_MOSI (&pin_PA18)
#define DEFAULT_SPI_BUS_MISO (&pin_PA22)
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define IGNORE_PIN_PA00 1
#define IGNORE_PIN_PA01 1
#define IGNORE_PIN_PA02 1
diff --git a/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk b/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk
index 2399aad5c..adae4beb2 100644
--- a/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x1209
USB_PID = 0xBAB2
USB_PRODUCT = "CatWAN USBStick"
diff --git a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
index e6a7e0676..0ed5262ab 100644
--- a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
@@ -22,12 +22,6 @@
#define SPEAKER_ENABLE_PIN (&pin_PA30)
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define CALIBRATE_CRYSTALLESS 1
// Explanation of how a user got into safe mode.
diff --git a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk
index 3c43776f5..cdbdf44f8 100644
--- a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash-crystalless.ld
USB_VID = 0x239A
USB_PID = 0x8019
USB_PRODUCT = "CircuitPlayground Express"
diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
index ca6f9b773..2db512929 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
+++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
@@ -22,12 +22,6 @@
#define SPEAKER_ENABLE_PIN (&pin_PA30)
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define CALIBRATE_CRYSTALLESS 1
// Explanation of how a user got into safe mode.
diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
index f456515f9..a6ed28aa7 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash-crystalless.ld
USB_VID = 0x239A
USB_PID = 0x8019
USB_PRODUCT = "CircuitPlayground Express with Crickit libraries"
diff --git a/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h b/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h
index 333fc79f9..a1d5b0a67 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h
+++ b/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h
@@ -22,12 +22,6 @@
#define SPEAKER_ENABLE_PIN (&pin_PA30)
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define CALIBRATE_CRYSTALLESS 1
// Explanation of how a user got into safe mode.
diff --git a/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk
index f0c9c6b8c..b5a7c2424 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash-crystalless.ld
USB_VID = 0x239A
USB_PID = 0x8019
USB_PRODUCT = "CircuitPlayground Express with displayio"
diff --git a/ports/atmel-samd/boards/samd21x18-bootloader-crystalless.ld b/ports/atmel-samd/boards/common.template.ld
index 2adf4fa90..1054605c8 100644
--- a/ports/atmel-samd/boards/samd21x18-bootloader-crystalless.ld
+++ b/ports/atmel-samd/boards/common.template.ld
@@ -1,13 +1,16 @@
-/*
- GNU linker script for SAMD21x18 (256K flash, 32K RAM)
-*/
+/* Template for SAMD21/SAMD51 linking. dollar-sign-curly-bracket items are replaced with strings. */
/* Specify the memory areas */
MEMORY
{
- /* Leave 8KiB for the bootloader, 256b for persistent config (clock), 64k for the flash file system and 256b for the user config. */
- FLASH (rx) : ORIGIN = 0x00000000 + 8K, LENGTH = 256K - 8K - 256 - 64K - 256
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
+ FLASH_BOOTLOADER (rx): ORIGIN = ${BOOTLOADER_START_ADDR}, LENGTH = ${BOOTLOADER_SIZE}
+
+ FLASH_FIRMWARE (rx) : ORIGIN = ${CIRCUITPY_FIRMWARE_START_ADDR}, LENGTH = ${CIRCUITPY_FIRMWARE_SIZE}
+ FLASH_FILESYSTEM (r) : ORIGIN = ${CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR}, LENGTH = ${CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE}
+ FLASH_CONFIG (r) : ORIGIN = ${CIRCUITPY_INTERNAL_CONFIG_START_ADDR}, LENGTH = ${CIRCUITPY_INTERNAL_CONFIG_SIZE}
+ FLASH_NVM (r) : ORIGIN = ${CIRCUITPY_INTERNAL_NVM_START_ADDR}, LENGTH = ${CIRCUITPY_INTERNAL_NVM_SIZE}
+
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = ${RAM_SIZE}
}
/* top end of the stack */
@@ -30,7 +33,7 @@ SECTIONS
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
. = ALIGN(4);
- } >FLASH
+ } >FLASH_FIRMWARE
.ARM.exidx :
{
@@ -38,12 +41,12 @@ SECTIONS
*(.gnu.linkonce.armexidx.*)
_etext = .; /* define a global symbol at end of code */
_sidata = .; /* start of .data section */
- } > FLASH
+ } >FLASH_FIRMWARE
/* This is the initialized data section
The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
- It is one task of the startup to copy the initial values from FLASH to RAM. */
+ but the loader puts the initial values in the FLASH_FIRMWARE (inidata).
+ It is one task of the startup to copy the initial values from FLASH_FIRMWARE to RAM. */
.data : AT ( _sidata )
{
. = ALIGN(4);
@@ -72,11 +75,11 @@ SECTIONS
_ebss = .;
} >RAM
- /* this just checks there is enough RAM for a minimal stack */
+ /* this just checks there is enough RAM for the requested stack. */
.stack :
{
. = ALIGN(4);
- . = . + 2K; /* Reserve a minimum of 2K for the stack. */
+ . = . + ${CIRCUITPY_DEFAULT_STACK_SIZE};
. = ALIGN(4);
} >RAM
diff --git a/ports/atmel-samd/boards/cp32-m4/mpconfigboard.h b/ports/atmel-samd/boards/cp32-m4/mpconfigboard.h
index 9e329b3ed..8664a6a0e 100644
--- a/ports/atmel-samd/boards/cp32-m4/mpconfigboard.h
+++ b/ports/atmel-samd/boards/cp32-m4/mpconfigboard.h
@@ -12,14 +12,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PB09)
#define DEFAULT_I2C_BUS_SDA (&pin_PB08)
diff --git a/ports/atmel-samd/boards/cp32-m4/mpconfigboard.mk b/ports/atmel-samd/boards/cp32-m4/mpconfigboard.mk
index 5cd3fe70e..6eb76c182 100644
--- a/ports/atmel-samd/boards/cp32-m4/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/cp32-m4/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x20-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8021
USB_PRODUCT = "CP32-M4"
diff --git a/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.h b/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.h
index 99167d31b..f560cfa49 100644
--- a/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.h
+++ b/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.h
@@ -20,14 +20,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_PB03)
diff --git a/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk b/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk
index 398c54a11..b1dad30eb 100644
--- a/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x4097
USB_PID = 0x0001
USB_PRODUCT = "Datalore IP M4"
diff --git a/ports/atmel-samd/boards/datum_distance/mpconfigboard.h b/ports/atmel-samd/boards/datum_distance/mpconfigboard.h
index e02e43780..74706ba04 100644
--- a/ports/atmel-samd/boards/datum_distance/mpconfigboard.h
+++ b/ports/atmel-samd/boards/datum_distance/mpconfigboard.h
@@ -10,10 +10,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/datum_distance/mpconfigboard.mk b/ports/atmel-samd/boards/datum_distance/mpconfigboard.mk
index a7bb8293d..4f6c7ab82 100644
--- a/ports/atmel-samd/boards/datum_distance/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/datum_distance/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x04D8
USB_PID = 0xEE8C
USB_PRODUCT = "datum-Distance"
diff --git a/ports/atmel-samd/boards/datum_imu/mpconfigboard.h b/ports/atmel-samd/boards/datum_imu/mpconfigboard.h
index b87739dd0..3cc218f9e 100644
--- a/ports/atmel-samd/boards/datum_imu/mpconfigboard.h
+++ b/ports/atmel-samd/boards/datum_imu/mpconfigboard.h
@@ -10,10 +10,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/datum_imu/mpconfigboard.mk b/ports/atmel-samd/boards/datum_imu/mpconfigboard.mk
index 507c83b04..336a1b832 100644
--- a/ports/atmel-samd/boards/datum_imu/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/datum_imu/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x04D8
USB_PID = 0xEE8D
USB_PRODUCT = "datum-IMU"
diff --git a/ports/atmel-samd/boards/datum_light/mpconfigboard.h b/ports/atmel-samd/boards/datum_light/mpconfigboard.h
index 2a91c112d..33e80d06d 100644
--- a/ports/atmel-samd/boards/datum_light/mpconfigboard.h
+++ b/ports/atmel-samd/boards/datum_light/mpconfigboard.h
@@ -10,10 +10,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/datum_light/mpconfigboard.mk b/ports/atmel-samd/boards/datum_light/mpconfigboard.mk
index 4bb227ba4..7ec2efcf9 100644
--- a/ports/atmel-samd/boards/datum_light/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/datum_light/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x04D8
USB_PID = 0xEE8E
USB_PRODUCT = "datum-Light"
diff --git a/ports/atmel-samd/boards/datum_weather/mpconfigboard.h b/ports/atmel-samd/boards/datum_weather/mpconfigboard.h
index 45619197b..328a6860c 100644
--- a/ports/atmel-samd/boards/datum_weather/mpconfigboard.h
+++ b/ports/atmel-samd/boards/datum_weather/mpconfigboard.h
@@ -10,10 +10,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/datum_weather/mpconfigboard.mk b/ports/atmel-samd/boards/datum_weather/mpconfigboard.mk
index 411aee625..d3ec1b0fd 100644
--- a/ports/atmel-samd/boards/datum_weather/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/datum_weather/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x04D8
USB_PID = 0xEE8F
USB_PRODUCT = "datum-Weather"
diff --git a/ports/atmel-samd/boards/escornabot_makech/mpconfigboard.h b/ports/atmel-samd/boards/escornabot_makech/mpconfigboard.h
index f27cb533b..3a984188f 100644
--- a/ports/atmel-samd/boards/escornabot_makech/mpconfigboard.h
+++ b/ports/atmel-samd/boards/escornabot_makech/mpconfigboard.h
@@ -8,12 +8,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define CALIBRATE_CRYSTALLESS 1
// Explanation of how a user got into safe mode.
diff --git a/ports/atmel-samd/boards/escornabot_makech/mpconfigboard.mk b/ports/atmel-samd/boards/escornabot_makech/mpconfigboard.mk
index a2c182e68..dedd49ff7 100644
--- a/ports/atmel-samd/boards/escornabot_makech/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/escornabot_makech/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x1209
USB_PID = 0xBAB6
USB_PRODUCT = "Escornabot Makech"
diff --git a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h
index eb1b90585..a0fde67ef 100644
--- a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h
@@ -8,10 +8,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA22)
#define DEFAULT_I2C_BUS_SDA (&pin_PA23)
diff --git a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk
index a88dbd563..134abf723 100644
--- a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x239A
USB_PID = 0x8015
USB_PRODUCT = "Feather M0 Adalogger"
diff --git a/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h
index a16cee0b4..41a4bde21 100644
--- a/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h
@@ -8,10 +8,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.mk
index 076f1f8ff..364374350 100644
--- a/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x239A
USB_PID = 0x8015
USB_PRODUCT = "Feather M0"
diff --git a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h
index e6cd1c729..5421dc889 100644
--- a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h
@@ -15,13 +15,6 @@
#define MICROPY_PORT_B ( 0 )
#define MICROPY_PORT_C ( 0 )
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
diff --git a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk
index 5b89f1be4..cdee7b794 100644
--- a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8023
USB_PRODUCT = "Feather M0 Express"
diff --git a/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.h
index 77146889e..ee61e1d87 100644
--- a/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.h
@@ -15,12 +15,6 @@
#define MICROPY_PORT_B ( 0 )
#define MICROPY_PORT_C ( 0 )
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
diff --git a/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk
index 5793d82e5..d5e03b49d 100644
--- a/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8023
USB_PRODUCT = "Feather M0 Express"
diff --git a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h
index 19a514758..2a319a412 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h
@@ -8,10 +8,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk
index 83d794d04..40a461b27 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x239A
USB_PID = 0x8015
USB_PRODUCT = "Feather M0 RFM69"
diff --git a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h
index d3db098e5..850033dbe 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h
@@ -8,10 +8,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk
index a84e14f55..736161047 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x239A
USB_PID = 0x8015
USB_PRODUCT = "Feather M0 RFM9x"
diff --git a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h
index 5ad265bf1..2d9f88e2e 100644
--- a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h
@@ -17,12 +17,6 @@
#define MICROPY_PORT_B ( 0 )
#define MICROPY_PORT_C ( 0 )
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk
index c5fef4373..cb13adb76 100644
--- a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8023
USB_PRODUCT = "Feather M0 Supersized"
diff --git a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h
index f65ea8db7..ba16d17ee 100644
--- a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h
@@ -16,14 +16,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define EXTERNAL_FLASH_QSPI_DUAL
#define BOARD_HAS_CRYSTAL 1
diff --git a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk
index 4faa07387..38dd47758 100644
--- a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8026
USB_PRODUCT = "Feather M4 Express"
diff --git a/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h b/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h
index 7df31f3a9..2afe35817 100755
--- a/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h
@@ -14,12 +14,6 @@
#define MICROPY_PORT_B ( 0 )
#define MICROPY_PORT_C ( 0 )
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_PA13)
diff --git a/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.mk b/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.mk
index c4a3a5a19..05c305b1a 100755
--- a/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8023
USB_PRODUCT = "Feather RadioFruit Zigbee"
diff --git a/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h b/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h
index 5f09ab4d2..b6d8f946b 100644
--- a/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h
+++ b/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h
@@ -10,16 +10,12 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA05)
#define DEFAULT_I2C_BUS_SDA (&pin_PA04)
#define DEFAULT_UART_BUS_RX (&pin_PA05)
#define DEFAULT_UART_BUS_TX (&pin_PA04)
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define IGNORE_PIN_PA03 1
#define IGNORE_PIN_PA06 1
#define IGNORE_PIN_PA07 1
diff --git a/ports/atmel-samd/boards/gemma_m0/mpconfigboard.mk b/ports/atmel-samd/boards/gemma_m0/mpconfigboard.mk
index 6f44a22f8..d64938632 100644
--- a/ports/atmel-samd/boards/gemma_m0/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/gemma_m0/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x239A
USB_PID = 0x801D
USB_PRODUCT = "Gemma M0"
diff --git a/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h
index bc8f5a134..bab055014 100644
--- a/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h
@@ -21,14 +21,6 @@
#define MICROPY_PORT_C ( PORT_PC24 | PORT_PC30 | PORT_PC31 )
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_PB21)
diff --git a/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.mk
index 33542183b..ab81ec5a2 100644
--- a/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x20-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8032
USB_PRODUCT = "Grand Central M4 Express"
diff --git a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h
index d5c274500..e5ac346da 100644
--- a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h
@@ -16,12 +16,6 @@
#define MICROPY_PORT_B ( PORT_PB22 | PORT_PB23 )
#define MICROPY_PORT_C ( 0 )
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA17)
#define DEFAULT_I2C_BUS_SDA (&pin_PA16)
diff --git a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk
index 988d10d1c..af4a5a293 100644
--- a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0xD1ED
USB_PRODUCT = "HalloWing M0 Express"
diff --git a/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.h
index 654632db5..a0c726e72 100644
--- a/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.h
@@ -16,14 +16,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA13)
#define DEFAULT_I2C_BUS_SDA (&pin_PA12)
diff --git a/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk
index 375be283a..4bf155288 100644
--- a/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x804A
USB_PRODUCT = "Hallowing M4 Express"
diff --git a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h
index 6f9f661d9..db5e2a4df 100644
--- a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h
@@ -16,12 +16,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk
index 2b64e9027..4d516c75b 100644
--- a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash-crystalless.ld
USB_VID = 0x239A
USB_PID = 0x8012
USB_PRODUCT = "ItsyBitsy M0 Express"
@@ -21,4 +20,3 @@ CIRCUITPY_RTC = 0
CFLAGS_INLINE_LIMIT = 60
SUPEROPT_GC = 0
-
diff --git a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h
index 9e4d4a10c..98920b54f 100644
--- a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h
@@ -17,14 +17,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA13)
#define DEFAULT_I2C_BUS_SDA (&pin_PA12)
diff --git a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk
index dca4e3706..eb02d3c27 100644
--- a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x802C
USB_PRODUCT = "ItsyBitsy M4 Express"
diff --git a/ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.h b/ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.h
index 194542b05..4d911ad64 100644
--- a/ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.h
+++ b/ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.h
@@ -10,12 +10,8 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define CALIBRATE_CRYSTALLESS 1
-
#define CIRCUITPY_INTERNAL_NVM_SIZE 0
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - 0x010000)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA17)
#define DEFAULT_I2C_BUS_SDA (&pin_PA16)
diff --git a/ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.mk b/ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.mk
index b9b88a368..df1a2d8eb 100644
--- a/ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader.ld
USB_VID = 0x04D8
USB_PID = 0xED94
USB_PRODUCT = "kicksat-sprite"
@@ -7,7 +6,6 @@ USB_MANUFACTURER = "maholli"
CHIP_VARIANT = SAMD51G19A
CHIP_FAMILY = samd51
-QSPI_FLASH_FILESYSTEM = 0
INTERNAL_FLASH_FILESYSTEM = 1
LONGINT_IMPL = MPZ
diff --git a/ports/atmel-samd/boards/meowmeow/mpconfigboard.h b/ports/atmel-samd/boards/meowmeow/mpconfigboard.h
index 1304b6dfb..80d367863 100644
--- a/ports/atmel-samd/boards/meowmeow/mpconfigboard.h
+++ b/ports/atmel-samd/boards/meowmeow/mpconfigboard.h
@@ -8,12 +8,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define CALIBRATE_CRYSTALLESS 1
// Explanation of how a user got into safe mode.
diff --git a/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk b/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk
index 894e19a6b..4b452ecbf 100644
--- a/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x1209
USB_PID = 0xBAB1
USB_PRODUCT = "Meow Meow"
diff --git a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h
index bfa254b95..04565feb4 100644
--- a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h
@@ -21,12 +21,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
diff --git a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk
index d3f35ba8b..b52b1343f 100644
--- a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8014
USB_PRODUCT = "Metro M0 Express"
diff --git a/ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.h b/ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.h
index e89b0322a..9fa401804 100644
--- a/ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.h
+++ b/ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.h
@@ -18,14 +18,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_PB03)
diff --git a/ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.mk b/ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.mk
index bd837ebd6..4895cda77 100644
--- a/ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8038
USB_PRODUCT = "Metro M4 Airlift Lite"
diff --git a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h
index 2a8878874..7f8dbb1d2 100644
--- a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h
@@ -20,14 +20,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_PB03)
diff --git a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.mk
index e4d8b9428..62e6b7c72 100644
--- a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8021
USB_PRODUCT = "Metro M4 Express"
diff --git a/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h b/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h
index c4563964f..08ab7e16b 100644
--- a/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h
+++ b/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h
@@ -17,14 +17,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA13)
#define DEFAULT_I2C_BUS_SDA (&pin_PA12)
diff --git a/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.mk b/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.mk
index eff8bfe08..ae2a1e973 100644
--- a/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x1209
USB_PID = 0x2017
USB_PRODUCT = "Mini SAM M4"
diff --git a/ports/atmel-samd/boards/monster_m4sk/mpconfigboard.h b/ports/atmel-samd/boards/monster_m4sk/mpconfigboard.h
index fc77520f5..42fb4548e 100644
--- a/ports/atmel-samd/boards/monster_m4sk/mpconfigboard.h
+++ b/ports/atmel-samd/boards/monster_m4sk/mpconfigboard.h
@@ -13,14 +13,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA01)
#define DEFAULT_I2C_BUS_SDA (&pin_PA00)
diff --git a/ports/atmel-samd/boards/monster_m4sk/mpconfigboard.mk b/ports/atmel-samd/boards/monster_m4sk/mpconfigboard.mk
index 84d1285c5..9b242a3ff 100644
--- a/ports/atmel-samd/boards/monster_m4sk/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/monster_m4sk/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8048
USB_PRODUCT = "Monster M4SK"
diff --git a/ports/atmel-samd/boards/pewpew10/mpconfigboard.h b/ports/atmel-samd/boards/pewpew10/mpconfigboard.h
index 445ccc435..6b3b4aa15 100644
--- a/ports/atmel-samd/boards/pewpew10/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pewpew10/mpconfigboard.h
@@ -5,11 +5,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
-
#define IGNORE_PIN_PB00 1
#define IGNORE_PIN_PB01 1
#define IGNORE_PIN_PB02 1
diff --git a/ports/atmel-samd/boards/pewpew10/mpconfigboard.mk b/ports/atmel-samd/boards/pewpew10/mpconfigboard.mk
index 8a1d6b16a..b3271d062 100644
--- a/ports/atmel-samd/boards/pewpew10/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pewpew10/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x239A
USB_PID = 0x801D
USB_PRODUCT = "PewPew 10.2"
diff --git a/ports/atmel-samd/boards/pewpew_m4/mpconfigboard.h b/ports/atmel-samd/boards/pewpew_m4/mpconfigboard.h
index 1b3035e12..60cd8d754 100644
--- a/ports/atmel-samd/boards/pewpew_m4/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pewpew_m4/mpconfigboard.h
@@ -9,14 +9,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA01)
#define DEFAULT_I2C_BUS_SDA (&pin_PA00)
@@ -48,4 +40,3 @@
#define IGNORE_PIN_PB09 1
#define IGNORE_PIN_PB10 1
#define IGNORE_PIN_PB11 1
-
diff --git a/ports/atmel-samd/boards/pewpew_m4/mpconfigboard.mk b/ports/atmel-samd/boards/pewpew_m4/mpconfigboard.mk
index bc2ae609e..990b26ff3 100644
--- a/ports/atmel-samd/boards/pewpew_m4/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pewpew_m4/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader.ld
USB_VID = 0x1d50
USB_PID = 0x60e8
USB_PRODUCT = "PewPew M4"
diff --git a/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.h b/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.h
index 5a8eb9d14..866e21991 100644
--- a/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.h
@@ -8,10 +8,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define IGNORE_PIN_PA02 1
#define IGNORE_PIN_PA03 1
#define IGNORE_PIN_PA04 1
diff --git a/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk b/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk
index 8b82f0a09..e6c227b13 100644
--- a/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x239A
USB_PID = 0x8028
USB_PRODUCT = "pIRKey M0"
diff --git a/ports/atmel-samd/boards/pybadge/mpconfigboard.h b/ports/atmel-samd/boards/pybadge/mpconfigboard.h
index 36115bc87..435185322 100644
--- a/ports/atmel-samd/boards/pybadge/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pybadge/mpconfigboard.h
@@ -14,14 +14,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA13)
#define DEFAULT_I2C_BUS_SDA (&pin_PA12)
diff --git a/ports/atmel-samd/boards/pybadge/mpconfigboard.mk b/ports/atmel-samd/boards/pybadge/mpconfigboard.mk
index b5a240c66..7a213faf4 100644
--- a/ports/atmel-samd/boards/pybadge/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pybadge/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8034
USB_PRODUCT = "PyBadge"
diff --git a/ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.h b/ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.h
index ade74786d..229cfa335 100644
--- a/ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.h
@@ -14,14 +14,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA13)
#define DEFAULT_I2C_BUS_SDA (&pin_PA12)
diff --git a/ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.mk b/ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.mk
index e78789d74..5ae09294d 100644
--- a/ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8043
USB_PRODUCT = "PyBadge AirLift"
diff --git a/ports/atmel-samd/boards/pygamer/mpconfigboard.h b/ports/atmel-samd/boards/pygamer/mpconfigboard.h
index 4720b22eb..102c25956 100644
--- a/ports/atmel-samd/boards/pygamer/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pygamer/mpconfigboard.h
@@ -13,14 +13,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA13)
#define DEFAULT_I2C_BUS_SDA (&pin_PA12)
diff --git a/ports/atmel-samd/boards/pygamer/mpconfigboard.mk b/ports/atmel-samd/boards/pygamer/mpconfigboard.mk
index a455690e1..2db6786bf 100644
--- a/ports/atmel-samd/boards/pygamer/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pygamer/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x803E
USB_PRODUCT = "PyGamer"
diff --git a/ports/atmel-samd/boards/pygamer_advance/mpconfigboard.h b/ports/atmel-samd/boards/pygamer_advance/mpconfigboard.h
index c05aa4f06..fbe946b72 100644
--- a/ports/atmel-samd/boards/pygamer_advance/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pygamer_advance/mpconfigboard.h
@@ -13,14 +13,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA13)
#define DEFAULT_I2C_BUS_SDA (&pin_PA12)
diff --git a/ports/atmel-samd/boards/pygamer_advance/mpconfigboard.mk b/ports/atmel-samd/boards/pygamer_advance/mpconfigboard.mk
index b6bb26630..d001374a5 100644
--- a/ports/atmel-samd/boards/pygamer_advance/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pygamer_advance/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x803E
USB_PRODUCT = "PyGamer Advance"
diff --git a/ports/atmel-samd/boards/pyportal/mpconfigboard.h b/ports/atmel-samd/boards/pyportal/mpconfigboard.h
index 43346488b..2c4cf4f58 100644
--- a/ports/atmel-samd/boards/pyportal/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pyportal/mpconfigboard.h
@@ -17,14 +17,6 @@
#define MICROPY_PORT_C ( 0 )
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PB03)
#define DEFAULT_I2C_BUS_SDA (&pin_PB02)
diff --git a/ports/atmel-samd/boards/pyportal/mpconfigboard.mk b/ports/atmel-samd/boards/pyportal/mpconfigboard.mk
index f763c74fa..149141a4e 100644
--- a/ports/atmel-samd/boards/pyportal/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pyportal/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x20-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8036
USB_PRODUCT = "PyPortal"
diff --git a/ports/atmel-samd/boards/pyportal_titano/mpconfigboard.h b/ports/atmel-samd/boards/pyportal_titano/mpconfigboard.h
index f2af07371..4d58b8183 100644
--- a/ports/atmel-samd/boards/pyportal_titano/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pyportal_titano/mpconfigboard.h
@@ -15,14 +15,6 @@
#define MICROPY_PORT_C ( 0 )
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PB03)
#define DEFAULT_I2C_BUS_SDA (&pin_PB02)
diff --git a/ports/atmel-samd/boards/pyportal_titano/mpconfigboard.mk b/ports/atmel-samd/boards/pyportal_titano/mpconfigboard.mk
index 58b363779..dbc2d5ae9 100644
--- a/ports/atmel-samd/boards/pyportal_titano/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pyportal_titano/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x20-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8054
USB_PRODUCT = "PyPortal Titano"
diff --git a/ports/atmel-samd/boards/pyruler/mpconfigboard.h b/ports/atmel-samd/boards/pyruler/mpconfigboard.h
index 171873b47..4d0586d91 100644
--- a/ports/atmel-samd/boards/pyruler/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pyruler/mpconfigboard.h
@@ -10,10 +10,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define IGNORE_PIN_PA12 1
#define IGNORE_PIN_PA13 1
#define IGNORE_PIN_PA16 1
diff --git a/ports/atmel-samd/boards/pyruler/mpconfigboard.mk b/ports/atmel-samd/boards/pyruler/mpconfigboard.mk
index 63d4cfed7..ca7ed4bdc 100644
--- a/ports/atmel-samd/boards/pyruler/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pyruler/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x239A
USB_PID = 0x804C
USB_PRODUCT = "PyRuler"
diff --git a/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.h b/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.h
index 64040a658..c66873aeb 100644
--- a/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.h
+++ b/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.h
@@ -21,14 +21,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk b/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk
index f18a3dbf4..fd4f22230 100644
--- a/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x1209
USB_PID = 0x4D43
USB_PRODUCT = "Robo HAT MM1 M4"
diff --git a/ports/atmel-samd/boards/sam32/mpconfigboard.h b/ports/atmel-samd/boards/sam32/mpconfigboard.h
index f6d3fb6b4..bd9f5e398 100644
--- a/ports/atmel-samd/boards/sam32/mpconfigboard.h
+++ b/ports/atmel-samd/boards/sam32/mpconfigboard.h
@@ -9,14 +9,11 @@
#define MICROPY_PORT_A (PORT_PA24 | PORT_PA25)
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define MICROPY_PORT_D (0)
-
-#define AUTORESET_DELAY_MS 500
+#define MICROPY_PORT_D (0)
+// No microcontroller.nvm
#define CIRCUITPY_INTERNAL_NVM_SIZE 0
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - 0x010000)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_PA04)
diff --git a/ports/atmel-samd/boards/sam32/mpconfigboard.mk b/ports/atmel-samd/boards/sam32/mpconfigboard.mk
index 12884a9cc..0d6be6437 100644
--- a/ports/atmel-samd/boards/sam32/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/sam32/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x20-bootloader.ld
USB_VID = 0x04D8
USB_PID = 0xEDBE
USB_PRODUCT = "SAM32"
diff --git a/ports/atmel-samd/boards/samd21x18-bootloader-external-flash-crystalless.ld b/ports/atmel-samd/boards/samd21x18-bootloader-external-flash-crystalless.ld
deleted file mode 100644
index bddaae99d..000000000
--- a/ports/atmel-samd/boards/samd21x18-bootloader-external-flash-crystalless.ld
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- GNU linker script for SAMD21x18 (256K flash, 32K RAM)
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- /* Leave 8KiB for the bootloader, 256b for internal config and 256b for user config. */
- FLASH (rx) : ORIGIN = 0x00000000 + 8K, LENGTH = 256K - 8K - 256 - 256
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
-}
-
-/* top end of the stack */
-/* stack must be double-word (8 byte) aligned */
-_estack = ORIGIN(RAM) + LENGTH(RAM) - 8;
-_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4;
-
-/* define output sections */
-SECTIONS
-{
- /* The program code and other data goes into FLASH */
- .text :
- {
- . = ALIGN(4);
- _sfixed = .;
- KEEP(*(.vectors)) /* isr vector table */
- *(.text) /* .text sections (code) */
- *(.text*) /* .text* sections (code) */
- *(.rodata) /* .rodata sections (constants, strings, etc.) */
- *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
-
- . = ALIGN(4);
- } >FLASH
-
- .ARM.exidx :
- {
- *(.ARM.exidx*)
- *(.gnu.linkonce.armexidx.*)
- _etext = .; /* define a global symbol at end of code */
- _sidata = .; /* start of .data section */
- } > FLASH
-
- /* This is the initialized data section
- The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
- It is one task of the startup to copy the initial values from FLASH to RAM. */
- .data : AT ( _sidata )
- {
- . = ALIGN(4);
- _srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
- *(.ramfunc)
- *(.ramfunc*)
- *(.data) /* .data sections */
- *(.data*) /* .data* sections */
-
- . = ALIGN(4);
- _erelocate = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM
-
- /* Uninitialized data section */
- .bss :
- {
- . = ALIGN(4);
- _sbss = .;
- _szero = .; /* define a global symbol at bss start; used by startup code */
- *(.bss)
- *(.bss*)
- *(COMMON)
-
- . = ALIGN(4);
- _ezero = .; /* define a global symbol at bss end; used by startup code */
- _ebss = .;
- } >RAM
-
- /* this just checks there is enough RAM for a minimal stack */
- .stack :
- {
- . = ALIGN(4);
- . = . + 2K; /* Reserve a minimum of 2K for the stack. */
- . = ALIGN(4);
- } >RAM
-
- .ARM.attributes 0 : { *(.ARM.attributes) }
-}
diff --git a/ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld b/ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld
deleted file mode 100644
index 4e677a079..000000000
--- a/ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- GNU linker script for SAMD21x18 (256K flash, 32K RAM)
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- /* Leave 8KiB for the bootloader and 256b for user config. */
- FLASH (rx) : ORIGIN = 0x00000000 + 8K, LENGTH = 256K - 8K - 256
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K /* 32 KiB RAM */
-}
-
-/* top end of the stack */
-/* stack must be double-word (8 byte) aligned */
-_estack = ORIGIN(RAM) + LENGTH(RAM) - 8;
-_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4;
-
-/* define output sections */
-SECTIONS
-{
- /* The program code and other data goes into FLASH */
- .text :
- {
- . = ALIGN(4);
- _sfixed = .;
- KEEP(*(.vectors)) /* isr vector table */
- *(.text) /* .text sections (code) */
- *(.text*) /* .text* sections (code) */
- *(.rodata) /* .rodata sections (constants, strings, etc.) */
- *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
-
- . = ALIGN(4);
- } >FLASH
-
- .ARM.exidx :
- {
- *(.ARM.exidx*)
- *(.gnu.linkonce.armexidx.*)
- _etext = .; /* define a global symbol at end of code */
- _sidata = .; /* start of .data section */
- } > FLASH
-
- /* This is the initialized data section
- The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
- It is one task of the startup to copy the initial values from FLASH to RAM. */
- .data : AT ( _etext )
- {
- . = ALIGN(4);
- _srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
- *(.ramfunc)
- *(.ramfunc*)
- *(.data) /* .data sections */
- *(.data*) /* .data* sections */
-
- . = ALIGN(4);
- _erelocate = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM
-
- /* Uninitialized data section */
- .bss :
- {
- . = ALIGN(4);
- _sbss = .;
- _szero = .; /* define a global symbol at bss start; used by startup code */
- *(.bss)
- *(.bss*)
- *(COMMON)
-
- . = ALIGN(4);
- _ezero = .; /* define a global symbol at bss end; used by startup code */
- _ebss = .;
- } >RAM
-
- /* this just checks there is enough RAM for a minimal stack */
- .stack :
- {
- . = ALIGN(4);
- . = . + 2K; /* Reserve a minimum of 2K for the stack. */
- . = ALIGN(4);
- } >RAM
-
- .ARM.attributes 0 : { *(.ARM.attributes) }
-}
diff --git a/ports/atmel-samd/boards/samd21x18-bootloader.ld b/ports/atmel-samd/boards/samd21x18-bootloader.ld
deleted file mode 100644
index 2ef09ba9a..000000000
--- a/ports/atmel-samd/boards/samd21x18-bootloader.ld
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- GNU linker script for SAMD21x18 (256K flash, 32K RAM)
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- /* Leave 8KiB for the bootloader, 64k for the flash file system, and 256b
- for user config. */
- FLASH (rx) : ORIGIN = 0x00000000 + 8K, LENGTH = 256K - 8K - 64K - 256
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
-}
-
-/* top end of the stack */
-/* stack must be double-word (8 byte) aligned */
-_estack = ORIGIN(RAM) + LENGTH(RAM) - 8;
-_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4;
-
-/* define output sections */
-SECTIONS
-{
- /* The program code and other data goes into FLASH */
- .text :
- {
- . = ALIGN(4);
- _sfixed = .;
- KEEP(*(.vectors)) /* isr vector table */
- *(.text) /* .text sections (code) */
- *(.text*) /* .text* sections (code) */
- *(.rodata) /* .rodata sections (constants, strings, etc.) */
- *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
-
- . = ALIGN(4);
- } >FLASH
-
- .ARM.exidx :
- {
- *(.ARM.exidx*)
- *(.gnu.linkonce.armexidx.*)
- _etext = .; /* define a global symbol at end of code */
- _sidata = .; /* start of .data section */
- } > FLASH
-
- /* This is the initialized data section
- The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
- It is one task of the startup to copy the initial values from FLASH to RAM. */
- .data : AT ( _sidata )
- {
- . = ALIGN(4);
- _srelocate = .; /* create a global symbol at data start; used by startup code in order to initialize the .data section in RAM */
- *(.ramfunc)
- *(.ramfunc*)
- *(.data) /* .data sections */
- *(.data*) /* .data* sections */
-
- . = ALIGN(4);
- _erelocate = .; /* define a global symbol at data end; used by startup code in order to initialize the .data section in RAM */
- } >RAM
-
- /* Uninitialized data section */
- .bss :
- {
- . = ALIGN(4);
- _sbss = .;
- _szero = .; /* define a global symbol at bss start; used by startup code */
- *(.bss)
- *(.bss*)
- *(COMMON)
-
- . = ALIGN(4);
- _ezero = .; /* define a global symbol at bss end; used by startup code */
- _ebss = .;
- } >RAM
-
- /* this just checks there is enough RAM for a minimal stack */
- .stack :
- {
- . = ALIGN(4);
- . = . + 2K; /* Reserve a minimum of 2K for the stack. */
- . = ALIGN(4);
- } >RAM
-
- .ARM.attributes 0 : { *(.ARM.attributes) }
-}
diff --git a/ports/atmel-samd/boards/samd21x18-external-flash.ld b/ports/atmel-samd/boards/samd21x18-external-flash.ld
deleted file mode 100644
index a540bfde2..000000000
--- a/ports/atmel-samd/boards/samd21x18-external-flash.ld
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- GNU linker script for SAMD21x18 (256K flash, 32K RAM)
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- /* 256 KiB but leave 256b for internal config and 256b for user config (protected eeprom) */
- FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K - 256 - 256
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
-}
-
-/* top end of the stack */
-_estack = ORIGIN(RAM) + LENGTH(RAM);
-_bootloader_dbl_tap = 0;
-
-/* define output sections */
-SECTIONS
-{
- /* The program code and other data goes into FLASH */
- .text :
- {
- . = ALIGN(4);
- _sfixed = .;
- KEEP(*(.vectors)) /* isr vector table */
- *(.text) /* .text sections (code) */
- *(.text*) /* .text* sections (code) */
- *(.rodata) /* .rodata sections (constants, strings, etc.) */
- *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
-
- . = ALIGN(4);
- } >FLASH
-
- .ARM.exidx :
- {
- *(.ARM.exidx*)
- *(.gnu.linkonce.armexidx.*)
- _etext = .; /* define a global symbol at end of code */
- _sidata = .; /* start of .data section */
- } > FLASH
-
- /* This is the initialized data section
- The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
- It is one task of the startup to copy the initial values from FLASH to RAM. */
- .data : AT ( _sidata )
- {
- . = ALIGN(4);
- _srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
- *(.ramfunc)
- *(.ramfunc*)
- *(.data) /* .data sections */
- *(.data*) /* .data* sections */
-
- . = ALIGN(4);
- _erelocate = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM
-
- /* Uninitialized data section */
- .bss :
- {
- . = ALIGN(4);
- _sbss = .;
- _szero = .; /* define a global symbol at bss start; used by startup code */
- *(.bss)
- *(.bss*)
- *(COMMON)
-
- . = ALIGN(4);
- _ezero = .; /* define a global symbol at bss end; used by startup code */
- _ebss = .;
- } >RAM
-
- /* this just checks there is enough RAM for a minimal stack */
- .stack :
- {
- . = ALIGN(4);
- . = . + 2K; /* Reserve a minimum of 2K for the stack. */
- . = ALIGN(4);
- } >RAM
-
- .ARM.attributes 0 : { *(.ARM.attributes) }
-}
diff --git a/ports/atmel-samd/boards/samd21x18.ld b/ports/atmel-samd/boards/samd21x18.ld
deleted file mode 100644
index 139be86bb..000000000
--- a/ports/atmel-samd/boards/samd21x18.ld
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- GNU linker script for SAMD21x18 (256K flash, 32K RAM)
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- /* Leave 256b for internal config, 64k for the flash file system and 256b for user config. */
- FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K - 256 - 64K
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
-}
-
-/* top end of the stack */
-_estack = ORIGIN(RAM) + LENGTH(RAM);
-_bootloader_dbl_tap = 0;
-
-/* define output sections */
-SECTIONS
-{
- /* The program code and other data goes into FLASH */
- .text :
- {
- . = ALIGN(4);
- _sfixed = .;
- KEEP(*(.vectors)) /* isr vector table */
- *(.text) /* .text sections (code) */
- *(.text*) /* .text* sections (code) */
- *(.rodata) /* .rodata sections (constants, strings, etc.) */
- *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
-
- . = ALIGN(4);
- } >FLASH
-
- .ARM.exidx :
- {
- *(.ARM.exidx*)
- *(.gnu.linkonce.armexidx.*)
- _etext = .; /* define a global symbol at end of code */
- _sidata = .; /* start of .data section */
- } > FLASH
-
-/* This is the initialized data section
- The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
- It is one task of the startup to copy the initial values from FLASH to RAM. */
- .data : AT ( _sidata )
- {
- . = ALIGN(4);
- _srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
- *(.ramfunc)
- *(.ramfunc*)
- *(.data) /* .data sections */
- *(.data*) /* .data* sections */
-
- . = ALIGN(4);
- _erelocate = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM
-
- /* Uninitialized data section */
- .bss :
- {
- . = ALIGN(4);
- _sbss = .;
- _szero = .; /* define a global symbol at bss start; used by startup code */
- *(.bss)
- *(.bss*)
- *(COMMON)
-
- . = ALIGN(4);
- _ezero = .; /* define a global symbol at bss end; used by startup code */
- _ebss = .;
- } >RAM
-
- /* this just checks there is enough RAM for a minimal stack */
- .stack :
- {
- . = ALIGN(4);
- . = . + 2K; /* Reserve a minimum of 2K for the stack. */
- . = ALIGN(4);
- } >RAM
-
- .ARM.attributes 0 : { *(.ARM.attributes) }
-}
diff --git a/ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld b/ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld
deleted file mode 100644
index c0e812ce1..000000000
--- a/ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- GNU linker script for SAMD51x18 (256K flash, 128K RAM)
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- /* Leave 16KiB for the bootloader. 8K for user data*/
- FLASH (rx) : ORIGIN = 0x00000000 + 16K, LENGTH = 256K - 16K - 8K
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
-}
-
-/* top end of the stack */
-/* stack must be double-word (8 byte) aligned */
-_estack = ORIGIN(RAM) + LENGTH(RAM) - 8;
-_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4;
-
-/* define output sections */
-SECTIONS
-{
- /* The program code and other data goes into FLASH */
- .text :
- {
- . = ALIGN(4);
- _sfixed = .;
- KEEP(*(.vectors)) /* isr vector table */
- *(.text) /* .text sections (code) */
- *(.text*) /* .text* sections (code) */
- *(.rodata) /* .rodata sections (constants, strings, etc.) */
- *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
-
- . = ALIGN(4);
- } >FLASH
-
- .ARM.exidx :
- {
- *(.ARM.exidx*)
- *(.gnu.linkonce.armexidx.*)
- _etext = .; /* define a global symbol at end of code */
- _sidata = .; /* start of .data section */
- } > FLASH
-
- /* This is the initialized data section
- The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
- It is one task of the startup to copy the initial values from FLASH to RAM. */
- .data : AT ( _sidata )
- {
- . = ALIGN(4);
- _srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
- *(.ramfunc)
- *(.ramfunc*)
- *(.data) /* .data sections */
- *(.data*) /* .data* sections */
-
- . = ALIGN(4);
- _erelocate = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM
-
- /* Uninitialized data section */
- .bss :
- {
- . = ALIGN(4);
- _sbss = .;
- _szero = .; /* define a global symbol at bss start; used by startup code */
- *(.bss)
- *(.bss*)
- *(COMMON)
-
- . = ALIGN(4);
- _ezero = .; /* define a global symbol at bss end; used by startup code */
- _ebss = .;
- } >RAM
-
- /* this just checks there is enough RAM for a minimal stack */
- .stack :
- {
- . = ALIGN(4);
- . = . + 10K; /* Reserve a minimum of 10K for the stack. nvm will temporarily store 8k on the stack when writing. */
- . = ALIGN(4);
- } >RAM
-
- .ARM.attributes 0 : { *(.ARM.attributes) }
-}
diff --git a/ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld b/ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld
deleted file mode 100644
index 253a764c9..000000000
--- a/ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- GNU linker script for SAMD51x19 (512K flash, 192K RAM)
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- /* Leave 16KiB for the bootloader. 8K for user data*/
- FLASH (rx) : ORIGIN = 0x00000000 + 16K, LENGTH = 512K - 16K - 8K
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
-}
-
-/* top end of the stack */
-/* stack must be double-word (8 byte) aligned */
-_estack = ORIGIN(RAM) + LENGTH(RAM) - 8;
-_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4;
-
-/* define output sections */
-SECTIONS
-{
- /* The program code and other data goes into FLASH */
- .text :
- {
- . = ALIGN(4);
- _sfixed = .;
- KEEP(*(.vectors)) /* isr vector table */
- *(.text) /* .text sections (code) */
- *(.text*) /* .text* sections (code) */
- *(.rodata) /* .rodata sections (constants, strings, etc.) */
- *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
-
- . = ALIGN(4);
- } >FLASH
-
- .ARM.exidx :
- {
- *(.ARM.exidx*)
- *(.gnu.linkonce.armexidx.*)
- _etext = .; /* define a global symbol at end of code */
- _sidata = .; /* start of .data section */
- } > FLASH
-
- /* This is the initialized data section
- The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
- It is one task of the startup to copy the initial values from FLASH to RAM. */
- .data : AT ( _sidata )
- {
- . = ALIGN(4);
- _srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
- *(.ramfunc)
- *(.ramfunc*)
- *(.data) /* .data sections */
- *(.data*) /* .data* sections */
-
- . = ALIGN(4);
- _erelocate = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM
-
- /* Uninitialized data section */
- .bss :
- {
- . = ALIGN(4);
- _sbss = .;
- _szero = .; /* define a global symbol at bss start; used by startup code */
- *(.bss)
- *(.bss*)
- *(COMMON)
-
- . = ALIGN(4);
- _ezero = .; /* define a global symbol at bss end; used by startup code */
- _ebss = .;
- } >RAM
-
- /* this just checks there is enough RAM for a minimal stack */
- .stack :
- {
- . = ALIGN(4);
- . = . + 10K; /* Reserve a minimum of 10K for the stack. nvm will temporarily store 8k on the stack when writing. */
- . = ALIGN(4);
- } >RAM
-
- .ARM.attributes 0 : { *(.ARM.attributes) }
-}
diff --git a/ports/atmel-samd/boards/samd51x19-bootloader.ld b/ports/atmel-samd/boards/samd51x19-bootloader.ld
deleted file mode 100644
index 56786a37a..000000000
--- a/ports/atmel-samd/boards/samd51x19-bootloader.ld
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- GNU linker script for SAMD51x19 (512K flash, 192K RAM)
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- /* Leave 16KiB for the bootloader, 256KiB for the internal file system, and 8KiB for user binary data. */
- FLASH (rx) : ORIGIN = 0x00000000 + 16K, LENGTH = 512K - 16K - 256K - 8K
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
-}
-
-/* top end of the stack */
-/* stack must be double-word (8 byte) aligned */
-_estack = ORIGIN(RAM) + LENGTH(RAM) - 8;
-_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4;
-
-/* define output sections */
-SECTIONS
-{
- /* The program code and other data goes into FLASH */
- .text :
- {
- . = ALIGN(4);
- _sfixed = .;
- KEEP(*(.vectors)) /* isr vector table */
- *(.text) /* .text sections (code) */
- *(.text*) /* .text* sections (code) */
- *(.rodata) /* .rodata sections (constants, strings, etc.) */
- *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
-
- . = ALIGN(4);
- } >FLASH
-
- .ARM.exidx :
- {
- *(.ARM.exidx*)
- *(.gnu.linkonce.armexidx.*)
- _etext = .; /* define a global symbol at end of code */
- _sidata = .; /* start of .data section */
- } > FLASH
-
- /* This is the initialized data section
- The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
- It is one task of the startup to copy the initial values from FLASH to RAM. */
- .data : AT ( _sidata )
- {
- . = ALIGN(4);
- _srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
- *(.ramfunc)
- *(.ramfunc*)
- *(.data) /* .data sections */
- *(.data*) /* .data* sections */
-
- . = ALIGN(4);
- _erelocate = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM
-
- /* Uninitialized data section */
- .bss :
- {
- . = ALIGN(4);
- _sbss = .;
- _szero = .; /* define a global symbol at bss start; used by startup code */
- *(.bss)
- *(.bss*)
- *(COMMON)
-
- . = ALIGN(4);
- _ezero = .; /* define a global symbol at bss end; used by startup code */
- _ebss = .;
- } >RAM
-
- /* this just checks there is enough RAM for a minimal stack */
- .stack :
- {
- . = ALIGN(4);
- . = . + 10K; /* Reserve a minimum of 10K for the stack. nvm will temporarily store 8k on the stack when writing. */
- . = ALIGN(4);
- } >RAM
-
- .ARM.attributes 0 : { *(.ARM.attributes) }
-}
diff --git a/ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld b/ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld
deleted file mode 100644
index 598915b1b..000000000
--- a/ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- GNU linker script for SAMD51x20 (1MB flash, 256K RAM)
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- /* Leave 16KiB for the bootloader. */
- FLASH (rx) : ORIGIN = 0x00000000 + 16K, LENGTH = 1M - 16K - 8K
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 256K
-}
-
-/* top end of the stack */
-/* stack must be double-word (8 byte) aligned */
-_estack = ORIGIN(RAM) + LENGTH(RAM) - 8;
-_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4;
-
-/* define output sections */
-SECTIONS
-{
- /* The program code and other data goes into FLASH */
- .text :
- {
- . = ALIGN(4);
- _sfixed = .;
- KEEP(*(.vectors)) /* isr vector table */
- *(.text) /* .text sections (code) */
- *(.text*) /* .text* sections (code) */
- *(.rodata) /* .rodata sections (constants, strings, etc.) */
- *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
-
- . = ALIGN(4);
- } >FLASH
-
- .ARM.exidx :
- {
- *(.ARM.exidx*)
- *(.gnu.linkonce.armexidx.*)
- _etext = .; /* define a global symbol at end of code */
- _sidata = .; /* start of .data section */
- } > FLASH
-
- /* This is the initialized data section
- The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
- It is one task of the startup to copy the initial values from FLASH to RAM. */
- .data : AT ( _sidata )
- {
- . = ALIGN(4);
- _srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
- *(.ramfunc)
- *(.ramfunc*)
- *(.data) /* .data sections */
- *(.data*) /* .data* sections */
-
- . = ALIGN(4);
- _erelocate = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM
-
- /* Uninitialized data section */
- .bss :
- {
- . = ALIGN(4);
- _sbss = .;
- _szero = .; /* define a global symbol at bss start; used by startup code */
- *(.bss)
- *(.bss*)
- *(COMMON)
-
- . = ALIGN(4);
- _ezero = .; /* define a global symbol at bss end; used by startup code */
- _ebss = .;
- } >RAM
-
- /* this just checks there is enough RAM for a minimal stack */
- .stack :
- {
- . = ALIGN(4);
- . = . + 10K; /* Reserve a minimum of 10K for the stack. nvm will temporarily store 8k on the stack when writing. */
- . = ALIGN(4);
- } >RAM
-
- .ARM.attributes 0 : { *(.ARM.attributes) }
-}
diff --git a/ports/atmel-samd/boards/samd51x20-bootloader.ld b/ports/atmel-samd/boards/samd51x20-bootloader.ld
deleted file mode 100644
index 49d4d8791..000000000
--- a/ports/atmel-samd/boards/samd51x20-bootloader.ld
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- GNU linker script for SAMD51x20 (1MB flash, 256K RAM)
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- /* Leave 16KiB for the bootloader, 512k for the filesystem and 8k for user config data. */
- FLASH (rx) : ORIGIN = 0x00000000 + 16K, LENGTH = 1M - 16K - 512K - 8K
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 256K
-}
-
-/* top end of the stack */
-/* stack must be double-word (8 byte) aligned */
-_estack = ORIGIN(RAM) + LENGTH(RAM) - 8;
-_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4;
-
-/* define output sections */
-SECTIONS
-{
- /* The program code and other data goes into FLASH */
- .text :
- {
- . = ALIGN(4);
- _sfixed = .;
- KEEP(*(.vectors)) /* isr vector table */
- *(.text) /* .text sections (code) */
- *(.text*) /* .text* sections (code) */
- *(.rodata) /* .rodata sections (constants, strings, etc.) */
- *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
-
- . = ALIGN(4);
- } >FLASH
-
- .ARM.exidx :
- {
- *(.ARM.exidx*)
- *(.gnu.linkonce.armexidx.*)
- _etext = .; /* define a global symbol at end of code */
- _sidata = .; /* start of .data section */
- } > FLASH
-
- /* This is the initialized data section
- The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
- It is one task of the startup to copy the initial values from FLASH to RAM. */
- .data : AT ( _sidata )
- {
- . = ALIGN(4);
- _srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
- *(.ramfunc)
- *(.ramfunc*)
- *(.data) /* .data sections */
- *(.data*) /* .data* sections */
-
- . = ALIGN(4);
- _erelocate = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM
-
- /* Uninitialized data section */
- .bss :
- {
- . = ALIGN(4);
- _sbss = .;
- _szero = .; /* define a global symbol at bss start; used by startup code */
- *(.bss)
- *(.bss*)
- *(COMMON)
-
- . = ALIGN(4);
- _ezero = .; /* define a global symbol at bss end; used by startup code */
- _ebss = .;
- } >RAM
-
- /* this just checks there is enough RAM for a minimal stack */
- .stack :
- {
- . = ALIGN(4);
- . = . + 10K; /* Reserve a minimum of 10K for the stack. nvm will temporarily store 8k on the stack when writing. */
- . = ALIGN(4);
- } >RAM
-
- .ARM.attributes 0 : { *(.ARM.attributes) }
-}
diff --git a/ports/atmel-samd/boards/samd51x20-external-flash.ld b/ports/atmel-samd/boards/samd51x20-external-flash.ld
deleted file mode 100644
index d3ed90476..000000000
--- a/ports/atmel-samd/boards/samd51x20-external-flash.ld
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- GNU linker script for SAMD51x20 (1MB flash, 256K RAM)
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 1M - 8K
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 256K
-}
-
-/* top end of the stack */
-_estack = ORIGIN(RAM) + LENGTH(RAM);
-_bootloader_dbl_tap = 0;
-
-/* define output sections */
-SECTIONS
-{
- /* The program code and other data goes into FLASH */
- .text :
- {
- . = ALIGN(4);
- _sfixed = .;
- KEEP(*(.vectors)) /* isr vector table */
- *(.text) /* .text sections (code) */
- *(.text*) /* .text* sections (code) */
- *(.rodata) /* .rodata sections (constants, strings, etc.) */
- *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
-
- . = ALIGN(4);
- } >FLASH
-
- .ARM.exidx :
- {
- *(.ARM.exidx*)
- *(.gnu.linkonce.armexidx.*)
- _etext = .; /* define a global symbol at end of code */
- _sidata = .; /* start of .data section */
- } > FLASH
-
- /* This is the initialized data section
- The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
- It is one task of the startup to copy the initial values from FLASH to RAM. */
- .data : AT ( _sidata )
- {
- . = ALIGN(4);
- _srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
- *(.ramfunc)
- *(.ramfunc*)
- *(.data) /* .data sections */
- *(.data*) /* .data* sections */
-
- . = ALIGN(4);
- _erelocate = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM
-
- /* Uninitialized data section */
- .bss :
- {
- . = ALIGN(4);
- _sbss = .;
- _szero = .; /* define a global symbol at bss start; used by startup code */
- *(.bss)
- *(.bss*)
- *(COMMON)
-
- . = ALIGN(4);
- _ezero = .; /* define a global symbol at bss end; used by startup code */
- _ebss = .;
- } >RAM
-
- /* this just checks there is enough RAM for a minimal stack */
- .stack :
- {
- . = ALIGN(4);
- . = . + 10K; /* Reserve a minimum of 10K for the stack. nvm will temporarily store 8k on the stack when writing. */
- . = ALIGN(4);
- } >RAM
-
- .ARM.attributes 0 : { *(.ARM.attributes) }
-}
diff --git a/ports/atmel-samd/boards/samd51x20.ld b/ports/atmel-samd/boards/samd51x20.ld
deleted file mode 100644
index e203c5b7a..000000000
--- a/ports/atmel-samd/boards/samd51x20.ld
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- GNU linker script for SAMD51x20 (1MB flash, 256K RAM)
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- /* 1024 KiB minus 512KiB for the internal file system and 8KiB for the user nvm. */
- FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 1M - 512K - 8K
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 256K
-}
-
-/* top end of the stack */
-_estack = ORIGIN(RAM) + LENGTH(RAM);
-_bootloader_dbl_tap = 0;
-
-/* define output sections */
-SECTIONS
-{
- /* The program code and other data goes into FLASH */
- .text :
- {
- . = ALIGN(4);
- _sfixed = .;
- KEEP(*(.vectors)) /* isr vector table */
- *(.text) /* .text sections (code) */
- *(.text*) /* .text* sections (code) */
- *(.rodata) /* .rodata sections (constants, strings, etc.) */
- *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
-
- . = ALIGN(4);
- } >FLASH
-
- .ARM.exidx :
- {
- *(.ARM.exidx*)
- *(.gnu.linkonce.armexidx.*)
- _etext = .; /* define a global symbol at end of code */
- _sidata = .; /* start of .data section */
- } > FLASH
-
- /* This is the initialized data section
- The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
- It is one task of the startup to copy the initial values from FLASH to RAM. */
- .data : AT ( _sidata )
- {
- . = ALIGN(4);
- _srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
- *(.ramfunc)
- *(.ramfunc*)
- *(.data) /* .data sections */
- *(.data*) /* .data* sections */
-
- . = ALIGN(4);
- _erelocate = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM
-
- /* Uninitialized data section */
- .bss :
- {
- . = ALIGN(4);
- _sbss = .;
- _szero = .; /* define a global symbol at bss start; used by startup code */
- *(.bss)
- *(.bss*)
- *(COMMON)
-
- . = ALIGN(4);
- _ezero = .; /* define a global symbol at bss end; used by startup code */
- _ebss = .;
- } >RAM
-
- /* this just checks there is enough RAM for a minimal stack */
- .stack :
- {
- . = ALIGN(4);
- . = . + 10K; /* Reserve a minimum of 10K for the stack. nvm will temporarily store 8k on the stack when writing. */
- . = ALIGN(4);
- } >RAM
-
- .ARM.attributes 0 : { *(.ARM.attributes) }
-}
diff --git a/ports/atmel-samd/boards/serpente/mpconfigboard.h b/ports/atmel-samd/boards/serpente/mpconfigboard.h
index 034e1f6c3..515bc1441 100644
--- a/ports/atmel-samd/boards/serpente/mpconfigboard.h
+++ b/ports/atmel-samd/boards/serpente/mpconfigboard.h
@@ -13,12 +13,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA09)
#define DEFAULT_I2C_BUS_SDA (&pin_PA08)
@@ -36,4 +30,3 @@
// Not connected
#define IGNORE_PIN_PA13 1
#define IGNORE_PIN_PA28 1
-
diff --git a/ports/atmel-samd/boards/serpente/mpconfigboard.mk b/ports/atmel-samd/boards/serpente/mpconfigboard.mk
index 98e1e3729..a5adb17a1 100644
--- a/ports/atmel-samd/boards/serpente/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/serpente/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash-crystalless.ld
USB_VID = 0x239A
USB_PID = 0x8058
USB_PRODUCT = "Serpente"
diff --git a/ports/atmel-samd/boards/shirtty/mpconfigboard.h b/ports/atmel-samd/boards/shirtty/mpconfigboard.h
index d5ad8e4bd..796d23f86 100644
--- a/ports/atmel-samd/boards/shirtty/mpconfigboard.h
+++ b/ports/atmel-samd/boards/shirtty/mpconfigboard.h
@@ -7,10 +7,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
// #define IGNORE_PIN_PA00 1
// #define IGNORE_PIN_PA01 1
// #define IGNORE_PIN_PA02 1
diff --git a/ports/atmel-samd/boards/shirtty/mpconfigboard.mk b/ports/atmel-samd/boards/shirtty/mpconfigboard.mk
index 9f3710e5a..bc37b5943 100644
--- a/ports/atmel-samd/boards/shirtty/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/shirtty/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x239A
USB_PID = 0x806C
USB_PRODUCT = "shIRtty"
diff --git a/ports/atmel-samd/boards/snekboard/mpconfigboard.h b/ports/atmel-samd/boards/snekboard/mpconfigboard.h
index a349143d9..1c0804fe7 100644
--- a/ports/atmel-samd/boards/snekboard/mpconfigboard.h
+++ b/ports/atmel-samd/boards/snekboard/mpconfigboard.h
@@ -15,13 +15,6 @@
#define MICROPY_PORT_B ( 0 )
#define MICROPY_PORT_C ( 0 )
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 0
#define DEFAULT_I2C_BUS_SCL (&pin_PA08) /* ANALOG 5 */
diff --git a/ports/atmel-samd/boards/snekboard/mpconfigboard.mk b/ports/atmel-samd/boards/snekboard/mpconfigboard.mk
index db2e511ab..4faa041b1 100644
--- a/ports/atmel-samd/boards/snekboard/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/snekboard/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x804E
USB_PRODUCT = "snekboard"
diff --git a/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.h b/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.h
index 80cacfa9b..d184945f3 100755
--- a/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.h
+++ b/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.h
@@ -13,10 +13,6 @@
#define MICROPY_PORT_B ( 0 )
#define MICROPY_PORT_C ( 0 )
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
//I2C
diff --git a/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.mk
index 9d0ef1c04..6a2afc306 100755
--- a/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash.ld
USB_VID = 0x1B4F
USB_PID = 0x0017
USB_PRODUCT = "LUMIDrive Board"
diff --git a/ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/mpconfigboard.h b/ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/mpconfigboard.h
index 96291ff3f..dcce97b8d 100644
--- a/ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/mpconfigboard.h
+++ b/ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/mpconfigboard.h
@@ -5,10 +5,6 @@
#define MICROPY_PORT_B ( 0 )
#define MICROPY_PORT_C ( 0 )
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define CALIBRATE_CRYSTALLESS 1
#define BOARD_HAS_CRYSTAL 0
diff --git a/ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/mpconfigboard.mk
index 4497507ac..632cd095c 100644
--- a/ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash-crystalless.ld
USB_VID = 0x1B4F
USB_PID = 0x8D24
USB_PRODUCT = "SparkFun Qwiic Micro"
diff --git a/ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/mpconfigboard.h b/ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/mpconfigboard.h
index d31826d26..c9b195eef 100644
--- a/ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/mpconfigboard.h
+++ b/ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/mpconfigboard.h
@@ -13,10 +13,6 @@
#define MICROPY_PORT_B ( 0 )
#define MICROPY_PORT_C ( 0 )
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define CALIBRATE_CRYSTALLESS 1
#define BOARD_HAS_CRYSTAL 0
diff --git a/ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/mpconfigboard.mk
index 324da2e35..ccf5a4149 100644
--- a/ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash-crystalless.ld
USB_VID = 0x1B4F
USB_PID = 0x8D24
USB_PRODUCT = "SparkFun Qwiic Micro"
diff --git a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.h b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.h
index cf7c3998b..ae272d502 100755
--- a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.h
+++ b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.h
@@ -15,20 +15,12 @@
#define SPI_FLASH_SCK_PIN &pin_PB23
#define SPI_FLASH_CS_PIN &pin_PA13
-#define MICROPY_PORT_A ( 0 )
+#define MICROPY_PORT_A ( 0 )
#define MICROPY_PORT_B ( 0 )
#define MICROPY_PORT_C ( 0 )
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
-
// I2C - also QWIIC
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk
index e80ef6277..f2d4eccad 100755
--- a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash.ld
USB_VID = 0x1B4F
USB_PID = 0x0015
USB_PRODUCT = "RedBoard Turbo Board"
diff --git a/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.h b/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.h
index a50c61cf2..13bb26380 100644
--- a/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.h
+++ b/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.h
@@ -5,10 +5,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.mk
index c9d0baf11..0c33ef960 100644
--- a/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x1B4F
USB_PID = 0x8D23
USB_PRODUCT = "SparkFun SAMD21 Dev Breakout"
diff --git a/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.h b/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.h
index 6af7fa191..2cfdd9e73 100644
--- a/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.h
+++ b/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.h
@@ -5,10 +5,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
diff --git a/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.mk
index a6e216575..d09785fb8 100644
--- a/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x1B4F
USB_PID = 0x8D22
USB_PRODUCT = "SparkFun SAMD21 Mini Breakout"
diff --git a/ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.h
index 34ab8fcfb..02a6e7f7c 100644
--- a/ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.h
@@ -16,12 +16,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA05)
#define DEFAULT_I2C_BUS_SDA (&pin_PA04)
@@ -47,4 +41,3 @@
#define IGNORE_PIN_PA28 1
#define IGNORE_PIN_PA30 1
#define IGNORE_PIN_PA31 1
-
diff --git a/ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.mk
index 6dc71978c..20feabd18 100644
--- a/ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash-crystalless.ld
USB_VID = 0x239A
USB_PID = 0x8060
USB_PRODUCT = "StringCar M0 Express"
@@ -22,4 +21,3 @@ CIRCUITPY_RTC = 0
CFLAGS_INLINE_LIMIT = 60
SUPEROPT_GC = 0
-
diff --git a/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.h
index 8ca1df162..96b38810c 100644
--- a/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.h
@@ -16,14 +16,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define AUTORESET_DELAY_MS 500
-
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PB08)
#define DEFAULT_I2C_BUS_SDA (&pin_PB09)
diff --git a/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.mk
index bb0b7d175..ee82b99c9 100644
--- a/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x19-bootloader-external-flash.ld
USB_VID = 0x239A
USB_PID = 0x8030
USB_PRODUCT = "Trellis M4 Express"
diff --git a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h
index dd8bc03cc..69517534e 100644
--- a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h
+++ b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h
@@ -11,10 +11,6 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define IGNORE_PIN_PA03 1
#define IGNORE_PIN_PA04 1
#define IGNORE_PIN_PA11 1
diff --git a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk
index af8b561a2..5c942901a 100644
--- a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x239A
USB_PID = 0x801F
USB_PRODUCT = "Trinket M0"
@@ -17,4 +16,3 @@ CFLAGS_BOARD = --param max-inline-insns-auto=15
ifeq ($(TRANSLATION), zh_Latn_pinyin)
CFLAGS_INLINE_LIMIT = 35
endif
-
diff --git a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h
index 369d84b8b..af473b128 100644
--- a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h
+++ b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h
@@ -18,12 +18,6 @@
#define CALIBRATE_CRYSTALLESS 1
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA09)
#define DEFAULT_I2C_BUS_SDA (&pin_PA08)
diff --git a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk
index c20358e19..bd6c9c9ff 100644
--- a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash-crystalless.ld
USB_VID = 0x239A
USB_PID = 0x801F
USB_PRODUCT="Trinket M0 Haxpress"
diff --git a/ports/atmel-samd/boards/uchip/mpconfigboard.h b/ports/atmel-samd/boards/uchip/mpconfigboard.h
index 6dcaf2965..1877a41ef 100644
--- a/ports/atmel-samd/boards/uchip/mpconfigboard.h
+++ b/ports/atmel-samd/boards/uchip/mpconfigboard.h
@@ -7,11 +7,9 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
+// No microcontroller.nvm
#define CIRCUITPY_INTERNAL_NVM_SIZE 0
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000)
-
-
// USB is always used internally so skip the pin objects for it.
#define IGNORE_PIN_PA24 1
#define IGNORE_PIN_PA25 1
diff --git a/ports/atmel-samd/boards/uchip/mpconfigboard.mk b/ports/atmel-samd/boards/uchip/mpconfigboard.mk
index 109492b76..950910e48 100644
--- a/ports/atmel-samd/boards/uchip/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/uchip/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x04D8
USB_PID = 0xED5F
USB_PRODUCT = "uChip CircuitPython"
diff --git a/ports/atmel-samd/boards/ugame10/mpconfigboard.h b/ports/atmel-samd/boards/ugame10/mpconfigboard.h
index b5590d986..550172a51 100644
--- a/ports/atmel-samd/boards/ugame10/mpconfigboard.h
+++ b/ports/atmel-samd/boards/ugame10/mpconfigboard.h
@@ -13,12 +13,6 @@
#define CALIBRATE_CRYSTALLESS 1
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code.
-#define CIRCUITPY_INTERNAL_NVM_SIZE 256
-
-#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_SPI_BUS_SCK (&pin_PA07)
#define DEFAULT_SPI_BUS_MISO (&pin_PA11)
#define DEFAULT_SPI_BUS_MOSI (&pin_PA06)
diff --git a/ports/atmel-samd/boards/ugame10/mpconfigboard.mk b/ports/atmel-samd/boards/ugame10/mpconfigboard.mk
index f0310b4aa..1c4336907 100644
--- a/ports/atmel-samd/boards/ugame10/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/ugame10/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd21x18-bootloader-external-flash-crystalless.ld
USB_VID = 0x239A
USB_PID = 0x801F
USB_PRODUCT = "uGame10"
diff --git a/ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.h b/ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.h
index 7e01e228a..86b1ad8a0 100644
--- a/ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.h
+++ b/ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.h
@@ -16,12 +16,6 @@
#define AUTORESET_DELAY_MS 500
-// If you change this, then make sure to update the linker scripts as well to
-// make sure you don't overwrite code
-#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_SPI_BUS_SCK (&pin_PA17)
diff --git a/ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.mk b/ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.mk
index 1f624df99..a0449d7bb 100644
--- a/ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.mk
@@ -1,4 +1,3 @@
-LD_FILE = boards/samd51x20-bootloader-external-flash.ld
# Adafruit
USB_VID = 0x239A
# Allocated for Winterbloom Sol
diff --git a/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c b/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
index d34049946..cbb067104 100644
--- a/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+++ b/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
@@ -213,17 +213,17 @@ void frequencyin_samd51_start_dpll() {
// Will also enable the Lock Bypass due to low-frequency sources causing DPLL unlocks
// as outlined in the Errata (1.12.1)
OSCCTRL->Dpll[1].DPLLRATIO.reg = OSCCTRL_DPLLRATIO_LDRFRAC(0) | OSCCTRL_DPLLRATIO_LDR(2999);
- if (board_has_crystal()) { // we can use XOSC32K directly as the source
- OSC32KCTRL->XOSC32K.bit.EN32K = 1;
- OSCCTRL->Dpll[1].DPLLCTRLB.reg = OSCCTRL_DPLLCTRLB_REFCLK(1) |
- OSCCTRL_DPLLCTRLB_LBYPASS;
- } else {
- // can't use OSCULP32K directly; need to setup a GCLK as a reference,
- // which must be done in samd/clocks.c to avoid waiting for sync
- return;
- //OSC32KCTRL->OSCULP32K.bit.EN32K = 1;
- //OSCCTRL->Dpll[1].DPLLCTRLB.reg = OSCCTRL_DPLLCTRLB_REFCLK(0);
- }
+#if BOARD_HAS_CRYSTAL
+ // we can use XOSC32K directly as the source
+ OSC32KCTRL->XOSC32K.bit.EN32K = 1;
+ OSCCTRL->Dpll[1].DPLLCTRLB.reg = OSCCTRL_DPLLCTRLB_REFCLK(1) | OSCCTRL_DPLLCTRLB_LBYPASS;
+#else
+ // can't use OSCULP32K directly; need to setup a GCLK as a reference,
+ // which must be done in samd/clocks.c to avoid waiting for sync
+ return;
+ //OSC32KCTRL->OSCULP32K.bit.EN32K = 1;
+ //OSCCTRL->Dpll[1].DPLLCTRLB.reg = OSCCTRL_DPLLCTRLB_REFCLK(0);
+#endif
OSCCTRL->Dpll[1].DPLLCTRLA.reg = OSCCTRL_DPLLCTRLA_ENABLE;
while (!(OSCCTRL->Dpll[1].DPLLSTATUS.bit.LOCK || OSCCTRL->Dpll[1].DPLLSTATUS.bit.CLKRDY)) {}
diff --git a/ports/atmel-samd/common-hal/microcontroller/__init__.c b/ports/atmel-samd/common-hal/microcontroller/__init__.c
index cb0751ace..09212a0d1 100644
--- a/ports/atmel-samd/common-hal/microcontroller/__init__.c
+++ b/ports/atmel-samd/common-hal/microcontroller/__init__.c
@@ -92,7 +92,6 @@ const mcu_processor_obj_t common_hal_mcu_processor_obj = {
},
};
-// NVM is only available on Express boards for now.
#if CIRCUITPY_INTERNAL_NVM_SIZE > 0
// The singleton nvm.ByteArray object.
const nvm_bytearray_obj_t common_hal_mcu_nvm_obj = {
@@ -100,7 +99,7 @@ const nvm_bytearray_obj_t common_hal_mcu_nvm_obj = {
.type = &nvm_bytearray_type,
},
.len = CIRCUITPY_INTERNAL_NVM_SIZE,
- .start_address = (uint8_t*) (FLASH_SIZE - CIRCUITPY_INTERNAL_NVM_SIZE)
+ .start_address = (uint8_t*) (CIRCUITPY_INTERNAL_NVM_START_ADDR)
};
#endif
diff --git a/ports/atmel-samd/ld_defines.c b/ports/atmel-samd/ld_defines.c
new file mode 100644
index 000000000..18f49d42c
--- /dev/null
+++ b/ports/atmel-samd/ld_defines.c
@@ -0,0 +1,30 @@
+// Fake source file used only to capture #define values for use in ld template files.
+#include "mpconfigport.h"
+
+// For each value needed in the LD file, create a C-like line:
+// /*NAME_OF_VALUE=*/ NAME_OF_VALUE;
+// The C preprocessor will replace NAME_OF_VALUE with the actual value.
+// This will be post-processed by tools/gen_ld_files.py to extract the name and value.
+
+// The next line is a marker to start looking for definitions. Lines above the next line are ignored.
+// START_LD_DEFINES
+
+/*RAM_SIZE=*/ RAM_SIZE;
+/*FLASH_SIZE=*/ FLASH_SIZE;
+
+/*BOOTLOADER_SIZE=*/ BOOTLOADER_SIZE;
+/*BOOTLOADER_START_ADDR=*/ BOOTLOADER_START_ADDR;
+
+/*CIRCUITPY_DEFAULT_STACK_SIZE=*/ CIRCUITPY_DEFAULT_STACK_SIZE;
+
+/*CIRCUITPY_FIRMWARE_START_ADDR=*/ CIRCUITPY_FIRMWARE_START_ADDR;
+/*CIRCUITPY_FIRMWARE_SIZE=*/ CIRCUITPY_FIRMWARE_SIZE;
+
+/*CIRCUITPY_INTERNAL_CONFIG_START_ADDR=*/ CIRCUITPY_INTERNAL_CONFIG_START_ADDR;
+/*CIRCUITPY_INTERNAL_CONFIG_SIZE=*/ CIRCUITPY_INTERNAL_CONFIG_SIZE;
+
+/*CIRCUITPY_INTERNAL_NVM_START_ADDR=*/ CIRCUITPY_INTERNAL_NVM_START_ADDR;
+/*CIRCUITPY_INTERNAL_NVM_SIZE=*/ CIRCUITPY_INTERNAL_NVM_SIZE;
+
+/*CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR=*/ CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR;
+/*CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE=*/ CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE;
diff --git a/ports/atmel-samd/mpconfigport.h b/ports/atmel-samd/mpconfigport.h
index 4e15a6c30..846e8db70 100644
--- a/ports/atmel-samd/mpconfigport.h
+++ b/ports/atmel-samd/mpconfigport.h
@@ -30,7 +30,15 @@
// Definitions for which SAMD chip we're using.
#include "include/sam.h"
+// Definitions that control circuitpy_mpconfig.h:
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
#ifdef SAMD21
+
+// HMCRAMC0_SIZE is defined in the ASF4 include files for each SAMD21 chip.
+#define RAM_SIZE HMCRAMC0_SIZE
+#define BOOTLOADER_SIZE (8*1024)
#define CIRCUITPY_MCU_FAMILY samd21
#define MICROPY_PY_SYS_PLATFORM "Atmel SAMD21"
#define SPI_FLASH_MAX_BAUDRATE 8000000
@@ -54,9 +62,15 @@
X(EISDIR) \
X(EINVAL) \
-#endif
+#endif // SAMD21
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
#ifdef SAMD51
+
+// HSRAM_SIZE is defined in the ASF4 include files for each SAMD51 chip.
+#define RAM_SIZE HSRAM_SIZE
+#define BOOTLOADER_SIZE (16*1024)
#define CIRCUITPY_MCU_FAMILY samd51
#define MICROPY_PY_SYS_PLATFORM "MicroChip SAMD51"
#define SPI_FLASH_MAX_BAUDRATE 24000000
@@ -65,10 +79,132 @@
#define MICROPY_PY_BUILTINS_NOTIMPLEMENTED (1)
#define MICROPY_PY_COLLECTIONS_ORDEREDDICT (1)
#define MICROPY_PY_FUNCTION_ATTRS (1)
+// MICROPY_PY_UJSON depends on MICROPY_PY_IO
#define MICROPY_PY_IO (1)
#define MICROPY_PY_UJSON (1)
#define MICROPY_PY_REVERSE_SPECIAL_METHODS (1)
// MICROPY_PY_UERRNO_LIST - Use the default
+
+#endif // SAMD51
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// This also includes mpconfigboard.h.
+#include "py/circuitpy_mpconfig.h"
+
+// Definitions that can be overridden by mpconfigboard.h:
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#ifdef SAMD21
+
+#if INTERNAL_FLASH_FILESYSTEM
+#define CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE (64*1024)
+#else
+#define CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE (0)
+#endif
+
+#ifndef CIRCUITPY_INTERNAL_NVM_SIZE
+#define CIRCUITPY_INTERNAL_NVM_SIZE (256)
+#endif
+
+#endif // SAMD21
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#ifdef SAMD51
+
+#ifndef CIRCUITPY_INTERNAL_NVM_SIZE
+#define CIRCUITPY_INTERNAL_NVM_SIZE (8192)
+#endif
+
+// If CIRCUITPY is internal, use half of flash for it.
+#if INTERNAL_FLASH_FILESYSTEM
+ #ifndef CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE
+ #define CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE (FLASH_SIZE/2)
+ #endif
+#else
+ #define CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE (0)
+#endif
+
+#endif // SAMD51
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#ifndef CALIBRATE_CRYSTALLESS
+#define CALIBRATE_CRYSTALLESS (0)
+#endif
+
+#ifndef BOARD_HAS_CRYSTAL
+#define BOARD_HAS_CRYSTAL (0)
+#endif
+
+// if CALIBRATE_CRYSTALLESS is requested, make room for storing
+// calibration data generated from external USB.
+#ifndef CIRCUITPY_INTERNAL_CONFIG_SIZE
+ #if CALIBRATE_CRYSTALLESS
+ #define CIRCUITPY_INTERNAL_CONFIG_SIZE (NVMCTRL_ROW_SIZE) // 256
+ #else
+ #define CIRCUITPY_INTERNAL_CONFIG_SIZE (0)
+ #endif
+#endif
+
+// Flash layout, starting at 0x00000000
+//
+// - bootloader (8 or 16kB)
+// - firmware
+// - internal CIRCUITPY flash filesystem (optional)
+// - internal config, used to store crystalless clock calibration info (optional)
+// - microntroller.nvm (optional)
+
+// Define these regions starting up from the bottom of flash:
+
+#define BOOTLOADER_START_ADDR (0x00000000)
+
+#define CIRCUITPY_FIRMWARE_START_ADDR (BOOTLOADER_START_ADDR + BOOTLOADER_SIZE)
+
+// Define these regions start down from the top of flash:
+
+#define CIRCUITPY_INTERNAL_NVM_START_ADDR \
+ (FLASH_SIZE - CIRCUITPY_INTERNAL_NVM_SIZE)
+
+#define CIRCUITPY_INTERNAL_CONFIG_START_ADDR \
+ (CIRCUITPY_INTERNAL_NVM_START_ADDR - CIRCUITPY_INTERNAL_CONFIG_SIZE)
+
+#define CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR \
+ (CIRCUITPY_INTERNAL_CONFIG_START_ADDR - CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE)
+
+// The firmware space is the space left over between the fixed lower and upper regions.
+#define CIRCUITPY_FIRMWARE_SIZE \
+ (CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR - CIRCUITPY_FIRMWARE_START_ADDR)
+
+#if BOOTLOADER_START_ADDR % FLASH_PAGE_SIZE != 0
+#error BOOTLOADER_START_ADDR must be on a flash page boundary.
+#endif
+
+#if CIRCUITPY_INTERNAL_NVM_START_ADDR % FLASH_PAGE_SIZE != 0
+#error CIRCUITPY_INTERNAL_NVM_START_ADDR must be on a flash page boundary.
+#endif
+#if CIRCUITPY_INTERNAL_NVM_SIZE % FLASH_PAGE_SIZE != 0
+#error CIRCUITPY_INTERNAL_NVM_SIZE must be a multiple of FLASH_PAGE_SIZE.
+#endif
+
+#if CIRCUITPY_INTERNAL_CONFIG_START_ADDR % FLASH_PAGE_SIZE != 0
+#error CIRCUITPY_INTERNAL_CONFIG_SIZE must be on a flash page boundary.
+#endif
+#if CIRCUITPY_INTERNAL_CONFIG_SIZE % FLASH_PAGE_SIZE != 0
+#error CIRCUITPY_INTERNAL_CONFIG_SIZE must be a multiple of FLASH_PAGE_SIZE.
+#endif
+
+#if CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR % FLASH_PAGE_SIZE != 0
+#error CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE must be on a flash page boundary.
+#endif
+#if CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE % FLASH_PAGE_SIZE != 0
+#error CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE must be a multiple of FLASH_PAGE_SIZE.
+#endif
+
+#if CIRCUITPY_FIRMWARE_SIZE < 0
+#error No space left in flash for firmware after specifying other regions!
#endif
// Turning off audioio, audiobusio, and touchio as necessary
@@ -76,8 +212,6 @@
#include "peripherals/samd/dma.h"
-#include "py/circuitpy_mpconfig.h"
-
#define MICROPY_PORT_ROOT_POINTERS \
CIRCUITPY_COMMON_ROOT_POINTERS \
mp_obj_t playing_audio[AUDIO_DMA_CHANNEL_COUNT];
diff --git a/ports/atmel-samd/mpconfigport.mk b/ports/atmel-samd/mpconfigport.mk
index 58bf07247..354745a2c 100644
--- a/ports/atmel-samd/mpconfigport.mk
+++ b/ports/atmel-samd/mpconfigport.mk
@@ -1,3 +1,7 @@
+# All linking can be done with this common templated linker script, which has
+# parameters that vary based on chip and/or board.
+LD_TEMPLATE_FILE = boards/common.template.ld
+
# Define an equivalent for MICROPY_LONGINT_IMPL, to pass to $(MPY-TOOL) in py/mkrules.mk
# $(MPY-TOOL) needs to know what kind of longint to use (if any) to freeze long integers.
# This should correspond to the MICROPY_LONGINT_IMPL definition in mpconfigport.h.
@@ -35,7 +39,8 @@ endif
# SAMD21 needs separate endpoint pairs for MSC BULK IN and BULK OUT, otherwise it's erratic.
USB_MSC_EP_NUM_OUT = 1
-endif
+
+endif # samd21
# Put samd51-only choices here.
ifeq ($(CHIP_FAMILY),samd51)
@@ -57,7 +62,7 @@ ifndef CIRCUITPY_SAMD
CIRCUITPY_SAMD = 1
endif
-endif
+endif # samd51
INTERNAL_LIBM = 1
diff --git a/ports/atmel-samd/peripherals b/ports/atmel-samd/peripherals
-Subproject 2ba5b20ba725e1c91c77875fba3a5e22059cdb9
+Subproject 4c0deecf889da0074c1dbc9a5e2d24cb7c7a31c
diff --git a/ports/atmel-samd/supervisor/internal_flash.c b/ports/atmel-samd/supervisor/internal_flash.c
index 6dd5ac0a7..a8ff5adfa 100644
--- a/ports/atmel-samd/supervisor/internal_flash.c
+++ b/ports/atmel-samd/supervisor/internal_flash.c
@@ -86,7 +86,7 @@ void flash_flush(void) {
static int32_t convert_block_to_flash_addr(uint32_t block) {
if (0 <= block && block < INTERNAL_FLASH_PART1_NUM_BLOCKS) {
// a block in partition 1
- return INTERNAL_FLASH_MEM_SEG1_START_ADDR + block * FILESYSTEM_BLOCK_SIZE;
+ return CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR + block * FILESYSTEM_BLOCK_SIZE;
}
// bad block
return -1;
diff --git a/ports/atmel-samd/supervisor/internal_flash.h b/ports/atmel-samd/supervisor/internal_flash.h
index 0939a3454..df8b495cc 100644
--- a/ports/atmel-samd/supervisor/internal_flash.h
+++ b/ports/atmel-samd/supervisor/internal_flash.h
@@ -32,16 +32,7 @@
#include "sam.h"
-#ifdef SAMD51
-#define TOTAL_INTERNAL_FLASH_SIZE (FLASH_SIZE / 2)
-#endif
-
-#ifdef SAMD21
-#define TOTAL_INTERNAL_FLASH_SIZE 0x010000
-#endif
-
-#define INTERNAL_FLASH_MEM_SEG1_START_ADDR (FLASH_SIZE - TOTAL_INTERNAL_FLASH_SIZE - CIRCUITPY_INTERNAL_NVM_SIZE)
-#define INTERNAL_FLASH_PART1_NUM_BLOCKS (TOTAL_INTERNAL_FLASH_SIZE / FILESYSTEM_BLOCK_SIZE)
+#define INTERNAL_FLASH_PART1_NUM_BLOCKS (CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE / FILESYSTEM_BLOCK_SIZE)
#define INTERNAL_FLASH_SYSTICK_MASK (0x1ff) // 512ms
#define INTERNAL_FLASH_IDLE_TICK(tick) (((tick) & INTERNAL_FLASH_SYSTICK_MASK) == 2)
diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c
index e962281c1..5662b159b 100644
--- a/ports/atmel-samd/supervisor/port.c
+++ b/ports/atmel-samd/supervisor/port.c
@@ -24,12 +24,16 @@
* THE SOFTWARE.
*/
+#include <string.h>
+#include <stdlib.h>
+
#include "boards/board.h"
#include "supervisor/port.h"
// ASF 4
#include "atmel_start_pins.h"
#include "hal/include/hal_delay.h"
+#include "hal/include/hal_flash.h"
#include "hal/include/hal_gpio.h"
#include "hal/include/hal_init.h"
#include "hpl/gclk/hpl_gclk_base.h"
@@ -94,6 +98,40 @@ extern volatile bool mp_msc_enabled;
__attribute__((__aligned__(TRACE_BUFFER_SIZE_BYTES))) uint32_t mtb[TRACE_BUFFER_SIZE] = {0};
#endif
+#if CALIBRATE_CRYSTALLESS
+static void save_usb_clock_calibration(void) {
+ // If we are on USB lets double check our fine calibration for the clock and
+ // save the new value if its different enough.
+ SYSCTRL->DFLLSYNC.bit.READREQ = 1;
+ uint16_t saved_calibration = 0x1ff;
+ if (strcmp((char*) CIRCUITPY_INTERNAL_CONFIG_START_ADDR, "CIRCUITPYTHON1") == 0) {
+ saved_calibration = ((uint16_t *) CIRCUITPY_INTERNAL_CONFIG_START_ADDR)[8];
+ }
+ while (SYSCTRL->PCLKSR.bit.DFLLRDY == 0) {
+ // TODO(tannewt): Run the mass storage stuff if this takes a while.
+ }
+ int16_t current_calibration = SYSCTRL->DFLLVAL.bit.FINE;
+ if (abs(current_calibration - saved_calibration) > 10) {
+ // Copy the full internal config page to memory.
+ uint8_t page_buffer[NVMCTRL_ROW_SIZE];
+ memcpy(page_buffer, (uint8_t*) CIRCUITPY_INTERNAL_CONFIG_START_ADDR, NVMCTRL_ROW_SIZE);
+
+ // Modify it.
+ memcpy(page_buffer, "CIRCUITPYTHON1", 15);
+ // First 16 bytes (0-15) are ID. Little endian!
+ page_buffer[16] = current_calibration & 0xff;
+ page_buffer[17] = current_calibration >> 8;
+
+ // Write it back.
+ // We don't use features that use any advanced NVMCTRL features so we can fake the descriptor
+ // whenever we need it instead of storing it long term.
+ struct flash_descriptor desc;
+ desc.dev.hw = NVMCTRL;
+ flash_write(&desc, (uint32_t) CIRCUITPY_INTERNAL_CONFIG_START_ADDR, page_buffer, NVMCTRL_ROW_SIZE);
+ }
+}
+#endif
+
safe_mode_t port_init(void) {
#if defined(SAMD21)
@@ -168,7 +206,19 @@ safe_mode_t port_init(void) {
hri_nvmctrl_set_CTRLB_RWS_bf(NVMCTRL, 2);
_pm_init();
#endif
- clock_init();
+
+#if CALIBRATE_CRYSTALLESS
+ uint32_t fine = DEFAULT_DFLL48M_FINE_CALIBRATION;
+ // The fine calibration data is stored in an NVM page after the text and data storage but before
+ // the optional file system. The first 16 bytes are the identifier for the section.
+ if (strcmp((char*) CIRCUITPY_INTERNAL_CONFIG_START_ADDR, "CIRCUITPYTHON1") == 0) {
+ fine = ((uint16_t *) CIRCUITPY_INTERNAL_CONFIG_START_ADDR)[8];
+ }
+ clock_init(BOARD_HAS_CRYSTAL, fine);
+#else
+ // Use a default fine value
+ clock_init(BOARD_HAS_CRYSTAL, DEFAULT_DFLL48M_FINE_CALIBRATION);
+#endif
// Configure millisecond timer initialization.
tick_init();
@@ -257,9 +307,11 @@ void reset_port(void) {
// gpio_set_pin_function(PIN_PB15, GPIO_PIN_FUNCTION_M); // GCLK1, D6
// #endif
+#if CALIBRATE_CRYSTALLESS
if (tud_cdc_connected()) {
save_usb_clock_calibration();
}
+#endif
}
void reset_to_bootloader(void) {
diff --git a/ports/cxd56/boards/spresense/mpconfigboard.mk b/ports/cxd56/boards/spresense/mpconfigboard.mk
index a2d4e5d88..7b8ac6ff6 100644
--- a/ports/cxd56/boards/spresense/mpconfigboard.mk
+++ b/ports/cxd56/boards/spresense/mpconfigboard.mk
@@ -2,3 +2,5 @@ USB_VID = 0x054c
USB_PID = 0x0bc2
USB_PRODUCT = "Spresense"
USB_MANUFACTURER = "Sony"
+
+INTERNAL_FLASH_FILESYSTEM = 1
diff --git a/ports/nrf/Makefile b/ports/nrf/Makefile
index 096dfaa4b..e6070fc32 100755
--- a/ports/nrf/Makefile
+++ b/ports/nrf/Makefile
@@ -63,8 +63,6 @@ ifneq ($(SD), )
include bluetooth/bluetooth_common.mk
endif
-FROZEN_MPY_DIR = freeze
-
CROSS_COMPILE = arm-none-eabi-
FATFS_DIR = lib/oofatfs
@@ -119,7 +117,7 @@ CFLAGS += \
# TODO: check this
CFLAGS += -D__START=main
-LDFLAGS = $(CFLAGS) -nostartfiles -fshort-enums -Wl,-nostdlib -Wl,-T,$(LD_FILE) -Wl,-Map=$@.map -Wl,-cref -Wl,-gc-sections -specs=nano.specs
+LDFLAGS = $(CFLAGS) -nostartfiles -fshort-enums -Wl,-nostdlib -Wl,-T,$(GENERATED_LD_FILE) -Wl,-Map=$@.map -Wl,-cref -Wl,-gc-sections -specs=nano.specs
LIBS := -lgcc -lc
LDFLAGS += -mthumb -mcpu=cortex-m4
@@ -194,15 +192,16 @@ SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE))
$(addprefix shared-module/, $(SRC_SHARED_MODULE)) \
$(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL))
-SRC_S = supervisor/cpu.s
+# There may be duplicates between SRC_COMMON_HAL_EXPANDED and SRC_SHARED_MODULE_EXPANDED,
+# because a few modules have files both in common-hal/ and shared-modules/.
+# Doing a $(sort ...) removes duplicates as part of sorting.
+SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED))
-FROZEN_MPY_PY_FILES := $(shell find -L $(FROZEN_MPY_DIR) -type f -name '*.py')
-FROZEN_MPY_MPY_FILES := $(addprefix $(BUILD)/,$(FROZEN_MPY_PY_FILES:.py=.mpy))
+SRC_S = supervisor/cpu.s
OBJ += $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_NRFX:.c=.o))
-OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_EXPANDED:.c=.o))
-OBJ += $(addprefix $(BUILD)/, $(SRC_SHARED_MODULE_EXPANDED:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o))
ifeq ($(INTERNAL_LIBM),1)
OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o))
endif
@@ -220,10 +219,10 @@ SRC_QSTR_PREPROCESSOR +=
all: $(BUILD)/firmware.bin $(BUILD)/firmware.uf2
-$(BUILD)/firmware.elf: $(OBJ)
+$(BUILD)/firmware.elf: $(OBJ) $(GENERATED_LD_FILE)
$(STEPECHO) "LINK $@"
- $(Q)$(CC) -o $@ $(LDFLAGS) $^ -Wl,--start-group $(LIBS) -Wl,--end-group
- $(Q)$(SIZE) $@ | $(PYTHON3) $(TOP)/tools/build_memory_info.py $(LD_FILE)
+ $(Q)$(CC) -o $@ $(LDFLAGS) $(OBJ) -Wl,--start-group $(LIBS) -Wl,--end-group
+ $(Q)$(SIZE) $@ | $(PYTHON3) $(TOP)/tools/build_memory_info.py $(GENERATED_LD_FILE)
$(BUILD)/firmware.bin: $(BUILD)/firmware.elf
$(STEPECHO) "Create $@"
@@ -265,7 +264,7 @@ else ifeq ($(FLASHER), pyocd)
flash: $(BUILD)/firmware.hex
pyocd-flashtool -t $(MCU_VARIANT) $< --sector_erase
- #pyocd-tool -t $(MCU_VARIANT) erase $(BOOT_SETTING_ADDR)
+# pyocd-tool -t $(MCU_VARIANT) erase $(BOOT_SETTING_ADDR)
pyocd-tool -t $(MCU_VARIANT) write32 $(BOOT_SETTING_ADDR) 0x00000001
pyocd-tool -t $(MCU_VARIANT) reset
diff --git a/ports/nrf/README.md b/ports/nrf/README.md
index 5f6d03720..88dd47273 100644
--- a/ports/nrf/README.md
+++ b/ports/nrf/README.md
@@ -2,85 +2,18 @@
This is a port of CircuitPython to the Nordic Semiconductor nRF52 series of chips.
-## Supported Features
+> **NOTE**: There are board-specific READMEs that may be more up to date than the
+ generic board-neutral documentation below.
-* UART
-* SPI
-* LEDs
-* Pins
-* ADC
-* I2C
-* PWM
-* Temperature
-* RTC (Real Time Counter. Low-Power counter)
-* BLE support including:
- * Peripheral role
- * Scanner role
- * _REPL over Bluetooth LE_ (optionally using WebBluetooth)
- * ubluepy: Bluetooth LE module for CircuitPython
- * 1 non-connectable advertiser while in connection
+## Flash
-## Tested Hardware
+Some boards have UF2 bootloaders and can simply be flashed in the normal way, by copying
+firmware.uf2 to the BOOT drive.
-* nRF52840
- * [PCA10056](http://www.nordicsemi.com/eng/Products/nRF52840-Preview-DK)
+For some boards, you can use the `flash` target:
-## Board Specific Instructions
-
-For board-specific instructions on building and flashing CircuitPython, see
-the following links:
-
-> **NOTE**: These board specific readmes may be more up to date than the
- generic board-neutral documentation further down.
-
-* Adafruit Feather nRF52840: `boards/feather_nrf52840_express/README.md`: 1MB Flash, 256KB SRAM
-* Nordic PCA10056 (uses nRF52840): `boards/pca10056/README.md`
-* MakerDiary nRF52840 MDK: `boards/makerdiary_nrf52840_mdk/README.md`
-* MakerDiary nRF52840 MDK USB Dongle: `boards/makerdiary_nrf52840_mdk_usb_dongle/README.md`
-
-For all other board targets, see the generic notes below.
-
-## Compile and Flash
-
-Prerequisite steps for building the nrf port:
-
- git clone <URL>.git circuitpython
- cd circuitpython
- git submodule update --init
- make -C mpy-cross
-
-To build and flash issue the following command inside the ports/nrf/ folder:
-
- make BOARD=pca10056
make BOARD=pca10056 flash
-## Compile and Flash with Bluetooth Stack
-
-First prepare the bluetooth folder by downloading Bluetooth LE stacks and headers:
-
- ./bluetooth/download_ble_stack.sh
-
-If the Bluetooth stacks has been downloaded, compile the target with the following command:
-
- make BOARD=pca10040 SD=s132
-
-The **make sd** will trigger a flash of the bluetooth stack before that application is flashed. Note that **make sd** will perform a full erase of the chip, which could cause 3rd party bootloaders to also be wiped.
-
- make BOARD=pca10040 SD=s132 sd
-
-Note: further tuning of features to include in bluetooth or even setting up the device to use REPL over Bluetooth can be configured in the `bluetooth_conf.h`.
-
-## Target Boards and Make Flags
-
-Target Board (BOARD) | Bluetooth Stack (SD) | Bluetooth Support | Flash Util
--------------------------|-------------------------|------------------------|-------------------------------
-pca10056 | s140 | Peripheral and Scanner | [Segger](#segger-targets)
-feather_nrf52840_express | s140 | Peripheral and Scanner | UF2 bootloader
-makerdiary_nrf52840_mdk | s140 | Peripheral and Scanner | pyocd or ARM mbed DAPLink
-makerdiary_nrf52840_mdk_usb_dongle | s140 | Peripheral and Scanner | DFU bootloader & nrfutil
-electronut_labs_papyr | s140 | Peripheral and Scanner | UF2 bootloader
-electronut_labs_blip | s140 | Peripheral and Scanner | Black Magic Probe
-
## Segger Targets
Install the necessary tools to flash and debug using Segger:
@@ -107,22 +40,7 @@ run follow command to install [adafruit-nrfutil](https://github.com/adafruit/Ada
* dfu-gen: Generates a Firmware zip to be used by the DFU flash application.
* dfu-flash: Triggers the DFU flash application to upload the firmware from the generated Firmware zip file.
-Example on how to generate and flash feather_nrf52840 target:
-
- make BOARD=feather_nrf52840 SD=s140
- make BOARD=feather_nrf52840 SD=s140 dfu-gen dfu-flash
-
-## Bluetooth LE REPL
-
-The port also implements a BLE REPL driver. This feature is disabled by default, as it will deactivate the UART REPL when activated. As some of the nRF devices only have one UART, using the BLE REPL free's the UART instance such that it can be used as a general UART peripheral not bound to REPL.
-
-The configuration can be enabled by editing the `bluetooth_conf.h` and set `MICROPY_PY_BLE_NUS` to 1.
When enabled you have different options to test it:
* [NUS Console for Linux](https://github.com/tralamazza/nus_console) (recommended)
* [WebBluetooth REPL](https://glennrub.github.io/webbluetooth/micropython/repl/) (experimental)
-
-Other:
-* nRF UART application for IPhone/Android
-
-WebBluetooth mode can also be configured by editing `bluetooth_conf.h` and set `BLUETOOTH_WEBBLUETOOTH_REPL` to 1. This will alternate advertisement between Eddystone URL and regular connectable advertisement. The Eddystone URL will point the phone or PC to download [WebBluetooth REPL](https://glennrub.github.io/webbluetooth/micropython/repl/) (experimental), which subsequently can be used to connect to the Bluetooth REPL from the PC or Phone browser.
diff --git a/ports/nrf/bluetooth/ble_uart.c b/ports/nrf/bluetooth/ble_uart.c
index 787a2a117..1e7a319bd 100644
--- a/ports/nrf/bluetooth/ble_uart.c
+++ b/ports/nrf/bluetooth/ble_uart.c
@@ -40,7 +40,7 @@
#include "shared-bindings/_bleio/Service.h"
#include "shared-bindings/_bleio/UUID.h"
-#if (MICROPY_PY_BLE_NUS == 1)
+#if CIRCUITPY_SERIAL_BLE
static const char default_name[] = "CP-REPL"; // max 8 chars or uuid won't fit in adv data
static const char NUS_UUID[] = "6e400001-b5a3-f393-e0a9-e50e24dcca9e";
@@ -190,4 +190,4 @@ void mp_hal_stdout_tx_strn(const char *str, size_t len) {
}
}
-#endif // MICROPY_PY_BLE_NUS
+#endif // CIRCUITPY_SERIAL_BLE
diff --git a/ports/nrf/boards/adafruit_nrf52840_s140_v6.ld b/ports/nrf/boards/adafruit_nrf52840_s140_v6.ld
deleted file mode 100644
index 756060f96..000000000
--- a/ports/nrf/boards/adafruit_nrf52840_s140_v6.ld
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- GNU linker script for NRF52840 w/S140 6.x.x SoftDevice
-
- MEMORY MAP
- ------------------------------------------------------------------------
- START ADDR END ADDR SIZE DESCRIPTION
- ---------- ---------- ------- -----------------------------------------
- 0x000FF000..0x000FFFFF ( 4KB) Bootloader Settings
- 0x000FE000..0x000FEFFF ( 4KB) Master Boot Record Params
- 0x000F4000..0x000FDFFF ( 40KB) Bootloader (UF2 + CDC + OTA)
-
- 0x000ED000..0x000F3FFF (28KB ) Private Config Data (Bonding, Keys, etc.)
- 0x000AD000..0x000ECFFF (256KB) User Filesystem
- 0x00026000..0x000ACFFF (540KB) Application Code (including ISR vector)
- 0x00001000..0x00025FFF (148KB) SoftDevice
- 0x00000000..0x00000FFF (4KB) Master Boot Record
-*/
-
-
-/* Specify the memory areas (S140 6.x.x) */
-MEMORY
-{
- FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x100000
-
- FLASH_ISR (rx) : ORIGIN = 0x00026000, LENGTH = 0x001000
- FLASH_TEXT (rx) : ORIGIN = 0x00027000, LENGTH = 0x086000
- FLASH_FATFS (r) : ORIGIN = 0x000AD000, LENGTH = 0x040000
-
- /* 0x2000000 - RAM:ORIGIN is reserved for Softdevice */
- /* SoftDevice 6.1.0 takes 0x1628 bytes (5.54 kb) minimum. */
- /* To measure the minimum required amount of memory for given configuration, set this number
- high enough to work and then check the mutation of the value done by sd_ble_enable. */
- RAM (xrw) : ORIGIN = 0x20000000 + 16K, LENGTH = 256K - 16K
-}
-
-/* produce a link error if there is not this amount of RAM for these sections */
-_minimum_stack_size = 2K;
-_minimum_heap_size = 0;
-
-/* top end of the stack */
-
-/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/
-_estack = ORIGIN(RAM) + LENGTH(RAM);
-
-/* RAM extents for the garbage collector and soft device init */
-_ram_start = ORIGIN(RAM);
-_ram_end = ORIGIN(RAM) + LENGTH(RAM);
-_heap_end = 0x20020000; /* tunable */
-
-INCLUDE "boards/common.ld"
diff --git a/ports/nrf/boards/arduino_nano_33_ble/mpconfigboard.mk b/ports/nrf/boards/arduino_nano_33_ble/mpconfigboard.mk
index 9a875ac44..d5e38c5b7 100644
--- a/ports/nrf/boards/arduino_nano_33_ble/mpconfigboard.mk
+++ b/ports/nrf/boards/arduino_nano_33_ble/mpconfigboard.mk
@@ -3,23 +3,7 @@ USB_PID = 0x805A
USB_PRODUCT = "Arduino_Nano_33_BLE"
USB_MANUFACTURER = "Arduino"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-
-BOOT_SETTING_ADDR = 0xFF000
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
INTERNAL_FLASH_FILESYSTEM = 1
diff --git a/ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.h b/ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.h
index 21ba3a976..7f9933b42 100644
--- a/ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.h
+++ b/ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.h
@@ -30,9 +30,6 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Circuit Playground Bluefruit"
#define MICROPY_HW_MCU_NAME "nRF52840"
-#define FLASH_SIZE (0x100000)
-#define FLASH_PAGE_SIZE (4096)
-
#define MICROPY_HW_LED_STATUS (&pin_P1_14)
// Unusually, board does not have a 32 kHz xtal. Nearly all boards do.
@@ -57,12 +54,6 @@
// Disables onboard peripherals and neopixels to save power.
#define POWER_SWITCH_PIN (&pin_P0_06)
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
-
-#define CIRCUITPY_INTERNAL_NVM_SIZE (4096)
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define DEFAULT_I2C_BUS_SCL (&pin_P0_04)
#define DEFAULT_I2C_BUS_SDA (&pin_P0_05)
diff --git a/ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.mk b/ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.mk
index d53e486f9..f63554e5e 100644
--- a/ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.mk
+++ b/ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.mk
@@ -3,23 +3,7 @@ USB_PID = 0x8046
USB_PRODUCT = "Circuit Playground Bluefruit"
USB_MANUFACTURER = "Adafruit Industries LLC"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-
-BOOT_SETTING_ADDR = 0xFF000
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
QSPI_FLASH_FILESYSTEM = 1
EXTERNAL_FLASH_DEVICE_COUNT = 1
diff --git a/ports/nrf/boards/common.ld b/ports/nrf/boards/common.template.ld
index df81aae58..931f95ee9 100644
--- a/ports/nrf/boards/common.ld
+++ b/ports/nrf/boards/common.template.ld
@@ -1,6 +1,36 @@
-/* Flash region for File System */
-__fatfs_flash_start_addr = ORIGIN(FLASH_FATFS);
-__fatfs_flash_length = LENGTH(FLASH_FATFS);
+/*
+ GNU linker script for NRF52840 w/ s140 6.0.0 SoftDevice
+*/
+
+/* Specify the memory areas */
+MEMORY
+{
+ FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x100000 /* entire flash, 1 MiB */
+ /* nRF SoftDevice */
+ FLASH_MBR (rx) : ORIGIN = ${MBR_START_ADDR}, LENGTH = ${MBR_SIZE}
+ FLASH_SD (rx) : ORIGIN = ${SD_FLASH_START_ADDR}, LENGTH = ${SD_FLASH_SIZE}
+ FLASH_ISR (rx) : ORIGIN = ${ISR_START_ADDR}, LENGTH = ${ISR_SIZE}
+ FLASH_FIRMWARE (rx) : ORIGIN = ${CIRCUITPY_FIRMWARE_START_ADDR}, LENGTH = ${CIRCUITPY_FIRMWARE_SIZE}
+ FLASH_BLE_CONFIG (r) : ORIGIN = ${CIRCUITPY_BLE_CONFIG_START_ADDR}, LENGTH = ${CIRCUITPY_BLE_CONFIG_SIZE}
+ FLASH_NVM (r) : ORIGIN = ${CIRCUITPY_INTERNAL_NVM_START_ADDR}, LENGTH = ${CIRCUITPY_INTERNAL_NVM_SIZE}
+ FLASH_FATFS (r) : ORIGIN = ${CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR}, LENGTH = ${CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE}
+ FLASH_BOOTLOADER (rx) : ORIGIN = ${BOOTLOADER_START_ADDR}, LENGTH = ${BOOTLOADER_SIZE}
+ FLASH_BOOTLOADER_SETTINGS (r) : ORIGIN = ${BOOTLOADER_SETTINGS_START_ADDR}, LENGTH = ${BOOTLOADER_SETTINGS_SIZE}
+ RAM (xrw) : ORIGIN = 0x20004000, LENGTH = 0x03C000 /* 240 KiB */
+}
+
+/* produce a link error if there is not this amount of RAM for these sections */
+_minimum_stack_size = 40K;
+_minimum_heap_size = 0;
+
+/* top end of the stack */
+
+/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/
+_estack = ORIGIN(RAM) + LENGTH(RAM);
+
+/* RAM extents for the garbage collector */
+_ram_end = ORIGIN(RAM) + LENGTH(RAM);
+_heap_end = 0x20020000; /* tunable */
/* define output sections */
SECTIONS
@@ -13,7 +43,7 @@ SECTIONS
. = ALIGN(4);
} >FLASH_ISR
-
+
/* The program code and other data goes into FLASH */
.text :
{
@@ -27,25 +57,25 @@ SECTIONS
. = ALIGN(4);
_etext = .; /* define a global symbol at end of code */
- } >FLASH_TEXT
-
+ } >FLASH_FIRMWARE
+
/*
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
- } >FLASH
+ } >FLASH_FIRMWARE
.ARM :
{
__exidx_start = .;
*(.ARM.exidx*)
__exidx_end = .;
- } >FLASH
+ } >FLASH_FIRMWARE
*/
-
+
/* used by the startup to initialize data */
_sidata = .;
-
+
/* This is the initialized data section
The program executes knowing that the data is in the RAM
but the loader puts the initial values in the FLASH (inidata).
@@ -60,8 +90,8 @@ SECTIONS
. = ALIGN(4);
_edata = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM
-
+ } >RAM
+
/* Uninitialized data section */
.bss :
{
@@ -105,4 +135,3 @@ SECTIONS
.ARM.attributes 0 : { *(.ARM.attributes) }
}
-
diff --git a/ports/nrf/boards/electronut_labs_blip/mpconfigboard.h b/ports/nrf/boards/electronut_labs_blip/mpconfigboard.h
index 6fe969d4a..ed1c32bd3 100644
--- a/ports/nrf/boards/electronut_labs_blip/mpconfigboard.h
+++ b/ports/nrf/boards/electronut_labs_blip/mpconfigboard.h
@@ -33,12 +33,6 @@
#define MICROPY_HW_BOARD_NAME "Electronut Labs Blip"
#define MICROPY_HW_MCU_NAME "nRF52840"
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
-
-// TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_P0_11)
diff --git a/ports/nrf/boards/electronut_labs_blip/mpconfigboard.mk b/ports/nrf/boards/electronut_labs_blip/mpconfigboard.mk
index 9cddd96ee..f30b308ec 100644
--- a/ports/nrf/boards/electronut_labs_blip/mpconfigboard.mk
+++ b/ports/nrf/boards/electronut_labs_blip/mpconfigboard.mk
@@ -3,28 +3,10 @@ USB_PID = 0x803C
USB_PRODUCT = "Blip"
USB_MANUFACTURER = "Electronut Labs"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-BOOT_SETTING_ADDR = 0xFF000
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
-
-QSPI_FLASH_FILESYSTEM = 0
INTERNAL_FLASH_FILESYSTEM = 1
CIRCUITPY_AUDIOIO = 0
CIRCUITPY_DISPLAYIO = 1
CIRCUITPY_GAMEPAD = 1
CIRCUITPY_STAGE = 1
-
diff --git a/ports/nrf/boards/electronut_labs_papyr/mpconfigboard.h b/ports/nrf/boards/electronut_labs_papyr/mpconfigboard.h
index 6fc1c5fad..4c2e7a92c 100644
--- a/ports/nrf/boards/electronut_labs_papyr/mpconfigboard.h
+++ b/ports/nrf/boards/electronut_labs_papyr/mpconfigboard.h
@@ -32,12 +32,6 @@
#define MICROPY_HW_BOARD_NAME "Electronut Labs Papyr"
#define MICROPY_HW_MCU_NAME "nRF52840"
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
-
-// TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_P0_06)
diff --git a/ports/nrf/boards/electronut_labs_papyr/mpconfigboard.mk b/ports/nrf/boards/electronut_labs_papyr/mpconfigboard.mk
index 5aee244f1..569dccc9c 100644
--- a/ports/nrf/boards/electronut_labs_papyr/mpconfigboard.mk
+++ b/ports/nrf/boards/electronut_labs_papyr/mpconfigboard.mk
@@ -3,20 +3,6 @@ USB_PID = 0x803C
USB_PRODUCT = "Papyr"
USB_MANUFACTURER = "Electronut Labs"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-BOOT_SETTING_ADDR = 0xFF000
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840 \ No newline at end of file
+INTERNAL_FLASH_FILESYSTEM = 1
diff --git a/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h b/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h
index b5319032c..64988e1a2 100644
--- a/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h
+++ b/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h
@@ -30,9 +30,6 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Feather nRF52840 Express"
#define MICROPY_HW_MCU_NAME "nRF52840"
-#define FLASH_SIZE (0x100000)
-#define FLASH_PAGE_SIZE (4096)
-
#define MICROPY_HW_NEOPIXEL (&pin_P0_16)
#define MICROPY_HW_LED_STATUS (&pin_P1_15)
@@ -53,12 +50,6 @@
#define SPI_FLASH_CS_PIN &pin_P0_20
#endif
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
-
-#define CIRCUITPY_INTERNAL_NVM_SIZE (4096)
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_P0_11)
diff --git a/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.mk b/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.mk
index 0fef54ef7..84861a1f0 100644
--- a/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.mk
+++ b/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.mk
@@ -3,23 +3,7 @@ USB_PID = 0x802A
USB_PRODUCT = "Feather nRF52840 Express"
USB_MANUFACTURER = "Adafruit Industries LLC"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-
-BOOT_SETTING_ADDR = 0xFF000
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
QSPI_FLASH_FILESYSTEM = 1
EXTERNAL_FLASH_DEVICE_COUNT = 1
diff --git a/ports/nrf/boards/itsybitsy_nrf52840_express/mpconfigboard.h b/ports/nrf/boards/itsybitsy_nrf52840_express/mpconfigboard.h
index 2f17460ae..629463e4e 100644
--- a/ports/nrf/boards/itsybitsy_nrf52840_express/mpconfigboard.h
+++ b/ports/nrf/boards/itsybitsy_nrf52840_express/mpconfigboard.h
@@ -3,9 +3,6 @@
#define MICROPY_HW_BOARD_NAME "Adafruit ItsyBitsy nRF52840 Express"
#define MICROPY_HW_MCU_NAME "nRF52840"
-#define FLASH_SIZE (0x100000)
-#define FLASH_PAGE_SIZE (4096)
-
#define MICROPY_HW_LED_STATUS (&pin_P0_06)
#define MICROPY_HW_APA102_MOSI (&pin_P0_08)
diff --git a/ports/nrf/boards/itsybitsy_nrf52840_express/mpconfigboard.mk b/ports/nrf/boards/itsybitsy_nrf52840_express/mpconfigboard.mk
index d290077e7..d5587f4b9 100644
--- a/ports/nrf/boards/itsybitsy_nrf52840_express/mpconfigboard.mk
+++ b/ports/nrf/boards/itsybitsy_nrf52840_express/mpconfigboard.mk
@@ -3,23 +3,7 @@ USB_PID = 0x8052
USB_PRODUCT = "ItsyBitsy nRF52840 Express"
USB_MANUFACTURER = "Adafruit Industries LLC"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-
-BOOT_SETTING_ADDR = 0xFF000
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
# Don't use up a hardware SPI peripheral for the status DotStar: we only have one or two.
CIRCUITPY_BITBANG_APA102 = 1
diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.h b/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.h
index ce0abe724..871cbe73d 100644
--- a/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.h
+++ b/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.h
@@ -39,12 +39,6 @@
#define MICROPY_QSPI_SCK NRF_GPIO_PIN_MAP(1, 3)
#define MICROPY_QSPI_CS NRF_GPIO_PIN_MAP(1, 8)
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
-
-// TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 0
#define DEFAULT_UART_BUS_RX (&pin_P0_19)
diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.mk b/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.mk
index abb0f4946..339575049 100644
--- a/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.mk
+++ b/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.mk
@@ -3,23 +3,7 @@ USB_PID = 0x802A
USB_PRODUCT = "nRF52840-MDK"
USB_MANUFACTURER = "makerdiary"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-
-BOOT_SETTING_ADDR = 0xFF000
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
QSPI_FLASH_FILESYSTEM = 1
EXTERNAL_FLASH_DEVICE_COUNT = 1
diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.h b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.h
index 86c7243e5..684b2c501 100644
--- a/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.h
+++ b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.h
@@ -32,10 +32,4 @@
#define MICROPY_HW_BOARD_NAME "MakerDiary nRF52840 MDK USB Dongle"
#define MICROPY_HW_MCU_NAME "nRF52840"
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
-
-// TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1 // according to the schematic we do
diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.mk b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.mk
index 82bbc3bd8..55ca410d9 100644
--- a/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.mk
+++ b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.mk
@@ -3,21 +3,6 @@ USB_PID = 0x802A
USB_PRODUCT = "nRF52840-MDK-Dongle"
USB_MANUFACTURER = "makerdiary"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-BOOT_SETTING_ADDR = 0xFF000
-BOOT_FILE = boards/$(BOARD)/bootloader/$(SOFTDEV_VERSION)/$(BOARD)_bootloader_$(SOFTDEV_VERSION)_s140
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
+INTERNAL_FLASH_FILESYSTEM = 1
diff --git a/ports/nrf/boards/metro_nrf52840_express/mpconfigboard.h b/ports/nrf/boards/metro_nrf52840_express/mpconfigboard.h
index 797cc9668..837355154 100644
--- a/ports/nrf/boards/metro_nrf52840_express/mpconfigboard.h
+++ b/ports/nrf/boards/metro_nrf52840_express/mpconfigboard.h
@@ -30,9 +30,6 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Metro nRF52840 Express"
#define MICROPY_HW_MCU_NAME "nRF52840"
-#define FLASH_SIZE (0x100000)
-#define FLASH_PAGE_SIZE (4096)
-
#define MICROPY_HW_NEOPIXEL (&pin_P0_13)
#define MICROPY_HW_LED_STATUS (&pin_P1_13)
@@ -53,12 +50,6 @@
#define SPI_FLASH_CS_PIN &pin_P0_20
#endif
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
-
-#define CIRCUITPY_INTERNAL_NVM_SIZE (4096)
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_P0_16)
diff --git a/ports/nrf/boards/metro_nrf52840_express/mpconfigboard.mk b/ports/nrf/boards/metro_nrf52840_express/mpconfigboard.mk
index 4c1c93c10..d421e5210 100644
--- a/ports/nrf/boards/metro_nrf52840_express/mpconfigboard.mk
+++ b/ports/nrf/boards/metro_nrf52840_express/mpconfigboard.mk
@@ -3,23 +3,7 @@ USB_PID = 0x8040
USB_PRODUCT = "Metro nRF52840 Express"
USB_MANUFACTURER = "Adafruit Industries LLC"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-
-BOOT_SETTING_ADDR = 0xFF000
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
QSPI_FLASH_FILESYSTEM = 1
EXTERNAL_FLASH_DEVICE_COUNT = 1
diff --git a/ports/nrf/boards/nrf52840_1M_256k.ld b/ports/nrf/boards/nrf52840_1M_256k.ld
deleted file mode 100644
index eb8a18aef..000000000
--- a/ports/nrf/boards/nrf52840_1M_256k.ld
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- GNU linker script for NRF52840 blank w/ no SoftDevice
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x100000 /* entire flash, 1 MiB */
- FLASH_ISR (rx) : ORIGIN = 0x00000000, LENGTH = 0x001000 /* sector 0, 4 KiB */
- FLASH_TEXT (rx) : ORIGIN = 0x00001000, LENGTH = 0x0E6000 /* 920 KiB */
- FLASH_FATFS (r) : ORIGIN = 0x000E7000, LENGTH = 0x019000 /* File system 100 KiB */
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0x040000 /* 256 KiB */
-}
-
-/* produce a link error if there is not this amount of RAM for these sections */
-_minimum_stack_size = 40K;
-_minimum_heap_size = 0;
-
-/* top end of the stack */
-
-/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/
-_estack = ORIGIN(RAM) + LENGTH(RAM);
-
-/* RAM extents for the garbage collector */
-_ram_end = ORIGIN(RAM) + LENGTH(RAM);
-_heap_end = 0x20020000; /* tunable */
-
-INCLUDE "boards/common.ld"
diff --git a/ports/nrf/boards/nrf52840_1M_256k_s140_6.0.0.ld b/ports/nrf/boards/nrf52840_1M_256k_s140_6.0.0.ld
deleted file mode 100644
index 90d6c402d..000000000
--- a/ports/nrf/boards/nrf52840_1M_256k_s140_6.0.0.ld
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- GNU linker script for NRF52840 w/ s140 6.0.0 SoftDevice
-*/
-
-/* Specify the memory areas */
-MEMORY
-{
- FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x100000 /* entire flash, 1 MiB */
- FLASH_ISR (rx) : ORIGIN = 0x00026000, LENGTH = 0x001000 /* sector 0, 4 KiB */
- FLASH_TEXT (rx) : ORIGIN = 0x00027000, LENGTH = 0x099000 /* 612 KiB */
- FLASH_FATFS (r) : ORIGIN = 0x000C0000, LENGTH = 0x040000 /* File system 256 KiB */
- RAM (xrw) : ORIGIN = 0x20004000, LENGTH = 0x03C000 /* 240 KiB */
-}
-
-/* produce a link error if there is not this amount of RAM for these sections */
-_minimum_stack_size = 40K;
-_minimum_heap_size = 0;
-
-/* top end of the stack */
-
-/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/
-_estack = ORIGIN(RAM) + LENGTH(RAM);
-
-/* RAM extents for the garbage collector */
-_ram_end = ORIGIN(RAM) + LENGTH(RAM);
-_heap_end = 0x20020000; /* tunable */
-
-INCLUDE "boards/common.ld"
diff --git a/ports/nrf/boards/particle_argon/mpconfigboard.h b/ports/nrf/boards/particle_argon/mpconfigboard.h
index 1eeb7291b..a4952fc79 100644
--- a/ports/nrf/boards/particle_argon/mpconfigboard.h
+++ b/ports/nrf/boards/particle_argon/mpconfigboard.h
@@ -52,12 +52,6 @@
#define SPI_FLASH_CS_PIN &pin_P0_17
#endif
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
-
-// TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_P0_27)
diff --git a/ports/nrf/boards/particle_argon/mpconfigboard.mk b/ports/nrf/boards/particle_argon/mpconfigboard.mk
index 8d3bb2a28..f8d3d2aca 100644
--- a/ports/nrf/boards/particle_argon/mpconfigboard.mk
+++ b/ports/nrf/boards/particle_argon/mpconfigboard.mk
@@ -3,23 +3,7 @@ USB_PID = 0xc00c
USB_PRODUCT = "Argon"
USB_MANUFACTURER = "Particle"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-
-BOOT_SETTING_ADDR = 0xFF000
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
QSPI_FLASH_FILESYSTEM = 1
EXTERNAL_FLASH_DEVICE_COUNT = 1
diff --git a/ports/nrf/boards/particle_boron/mpconfigboard.h b/ports/nrf/boards/particle_boron/mpconfigboard.h
index af6992484..bab1b3d5c 100644
--- a/ports/nrf/boards/particle_boron/mpconfigboard.h
+++ b/ports/nrf/boards/particle_boron/mpconfigboard.h
@@ -52,12 +52,6 @@
#define SPI_FLASH_CS_PIN &pin_P0_17
#endif
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
-
-// TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_P0_27)
diff --git a/ports/nrf/boards/particle_boron/mpconfigboard.mk b/ports/nrf/boards/particle_boron/mpconfigboard.mk
index 801b9613f..eada97a73 100644
--- a/ports/nrf/boards/particle_boron/mpconfigboard.mk
+++ b/ports/nrf/boards/particle_boron/mpconfigboard.mk
@@ -3,23 +3,7 @@ USB_PID = 0xc00d
USB_PRODUCT = "Boron"
USB_MANUFACTURER = "Particle"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-
-BOOT_SETTING_ADDR = 0xFF000
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
QSPI_FLASH_FILESYSTEM = 1
EXTERNAL_FLASH_DEVICE_COUNT = 1
diff --git a/ports/nrf/boards/particle_xenon/mpconfigboard.h b/ports/nrf/boards/particle_xenon/mpconfigboard.h
index 34ca6421e..f0d12bb0b 100644
--- a/ports/nrf/boards/particle_xenon/mpconfigboard.h
+++ b/ports/nrf/boards/particle_xenon/mpconfigboard.h
@@ -52,12 +52,6 @@
#define SPI_FLASH_CS_PIN &pin_P0_17
#endif
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
-
-// TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-
#define BOARD_HAS_CRYSTAL 1
#define DEFAULT_I2C_BUS_SCL (&pin_P0_27)
diff --git a/ports/nrf/boards/particle_xenon/mpconfigboard.mk b/ports/nrf/boards/particle_xenon/mpconfigboard.mk
index 5cebc423a..6062da378 100644
--- a/ports/nrf/boards/particle_xenon/mpconfigboard.mk
+++ b/ports/nrf/boards/particle_xenon/mpconfigboard.mk
@@ -3,23 +3,7 @@ USB_PID = 0xc00e # argon is 0xc00c
USB_PRODUCT = "Xenon"
USB_MANUFACTURER = "Particle"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-
-BOOT_SETTING_ADDR = 0xFF000
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
QSPI_FLASH_FILESYSTEM = 1
EXTERNAL_FLASH_DEVICE_COUNT = 1
diff --git a/ports/nrf/boards/pca10056/mpconfigboard.h b/ports/nrf/boards/pca10056/mpconfigboard.h
index 5b30c7fe8..5d0d4d3a5 100644
--- a/ports/nrf/boards/pca10056/mpconfigboard.h
+++ b/ports/nrf/boards/pca10056/mpconfigboard.h
@@ -29,8 +29,6 @@
#define MICROPY_HW_BOARD_NAME "PCA10056 nRF52840-DK"
#define MICROPY_HW_MCU_NAME "nRF52840"
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
-
#define MICROPY_HW_LED_STATUS (&pin_P0_13)
#define DEFAULT_I2C_BUS_SCL (&pin_P0_27)
diff --git a/ports/nrf/boards/pca10056/mpconfigboard.mk b/ports/nrf/boards/pca10056/mpconfigboard.mk
index 723e7976e..8fd1ef08d 100644
--- a/ports/nrf/boards/pca10056/mpconfigboard.mk
+++ b/ports/nrf/boards/pca10056/mpconfigboard.mk
@@ -3,23 +3,7 @@ USB_PID = 0x802A
USB_PRODUCT = "PCA10056"
USB_MANUFACTURER = "Nordic Semiconductor"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-
-BOOT_SETTING_ADDR = 0xFF000
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
QSPI_FLASH_FILESYSTEM = 1
EXTERNAL_FLASH_DEVICE_COUNT = 1
diff --git a/ports/nrf/boards/pca10059/mpconfigboard.h b/ports/nrf/boards/pca10059/mpconfigboard.h
index b79d3c88f..18aa66f16 100644
--- a/ports/nrf/boards/pca10059/mpconfigboard.h
+++ b/ports/nrf/boards/pca10059/mpconfigboard.h
@@ -28,5 +28,3 @@
#define MICROPY_HW_MCU_NAME "nRF52840"
#define MICROPY_HW_LED_STATUS (&pin_P0_06)
-
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
diff --git a/ports/nrf/boards/pca10059/mpconfigboard.mk b/ports/nrf/boards/pca10059/mpconfigboard.mk
index db9d80668..3f97b0821 100644
--- a/ports/nrf/boards/pca10059/mpconfigboard.mk
+++ b/ports/nrf/boards/pca10059/mpconfigboard.mk
@@ -3,21 +3,6 @@ USB_PID = 0x802A
USB_PRODUCT = "PCA10059"
USB_MANUFACTURER = "Nordic Semiconductor"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-BOOT_SETTING_ADDR = 0xFF000
-BOOT_FILE = boards/$(BOARD)/bootloader/$(SOFTDEV_VERSION)/$(BOARD)_bootloader_$(SOFTDEV_VERSION)_s140
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
+INTERNAL_FLASH_FILESYSTEM = 1
diff --git a/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.h b/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.h
index cc7e68864..23cce7f8a 100644
--- a/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.h
+++ b/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.h
@@ -29,8 +29,6 @@
#define MICROPY_HW_BOARD_NAME "SparkFun Pro nRF52840 Mini"
#define MICROPY_HW_MCU_NAME "nRF52840"
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
-
#define DEFAULT_I2C_BUS_SCL (&pin_P0_11)
#define DEFAULT_I2C_BUS_SDA (&pin_P0_08)
diff --git a/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.mk b/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.mk
index 212a85d57..f66b2eaf7 100644
--- a/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.mk
+++ b/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.mk
@@ -3,22 +3,6 @@ USB_PID = 0x5289
USB_PRODUCT = "SFE_nRF52840_Mini"
USB_MANUFACTURER = "SparkFun Electronics"
-MCU_SERIES = m4
-MCU_VARIANT = nrf52
-MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
-SD ?= s140
-SOFTDEV_VERSION ?= 6.1.0
-
-BOOT_SETTING_ADDR = 0xFF000
-
-ifeq ($(SD),)
- LD_FILE = boards/nrf52840_1M_256k.ld
-else
- LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
- CIRCUITPY_BLEIO = 1
-endif
-
-NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
INTERNAL_FLASH_FILESYSTEM = 1
diff --git a/ports/nrf/common-hal/_bleio/Adapter.c b/ports/nrf/common-hal/_bleio/Adapter.c
index 8f67d66d2..cee40a5a0 100644
--- a/ports/nrf/common-hal/_bleio/Adapter.c
+++ b/ports/nrf/common-hal/_bleio/Adapter.c
@@ -45,6 +45,7 @@
#include "shared-bindings/_bleio/__init__.h"
#include "shared-bindings/_bleio/Adapter.h"
#include "shared-bindings/_bleio/Address.h"
+#include "shared-bindings/nvm/ByteArray.h"
#include "shared-bindings/_bleio/Connection.h"
#include "shared-bindings/_bleio/ScanEntry.h"
#include "shared-bindings/time/__init__.h"
@@ -54,6 +55,14 @@
#define BLE_SLAVE_LATENCY 0
#define BLE_CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS)
+const nvm_bytearray_obj_t common_hal_bleio_nvm_obj = {
+ .base = {
+ .type = &nvm_bytearray_type,
+ },
+ .start_address = (uint8_t*) CIRCUITPY_BLE_CONFIG_START_ADDR,
+ .len = CIRCUITPY_BLE_CONFIG_SIZE,
+};
+
STATIC void softdevice_assert_handler(uint32_t id, uint32_t pc, uint32_t info) {
reset_into_safe_mode(NORDIC_SOFT_DEVICE_ASSERT);
}
diff --git a/ports/nrf/common-hal/microcontroller/__init__.c b/ports/nrf/common-hal/microcontroller/__init__.c
index a6b1c4ba3..de924566c 100644
--- a/ports/nrf/common-hal/microcontroller/__init__.c
+++ b/ports/nrf/common-hal/microcontroller/__init__.c
@@ -76,11 +76,14 @@ const mcu_processor_obj_t common_hal_mcu_processor_obj = {
};
#if CIRCUITPY_INTERNAL_NVM_SIZE > 0
+
// The singleton nvm.ByteArray object.
const nvm_bytearray_obj_t common_hal_mcu_nvm_obj = {
.base = {
.type = &nvm_bytearray_type,
},
+ .start_address = (uint8_t*) CIRCUITPY_INTERNAL_NVM_START_ADDR,
+ .len = CIRCUITPY_INTERNAL_NVM_SIZE,
};
#endif
diff --git a/ports/nrf/common-hal/nvm/ByteArray.c b/ports/nrf/common-hal/nvm/ByteArray.c
index bace8221c..7d733ce7b 100644
--- a/ports/nrf/common-hal/nvm/ByteArray.c
+++ b/ports/nrf/common-hal/nvm/ByteArray.c
@@ -32,15 +32,8 @@
#include "peripherals/nrf/nvm.h"
-// defined in linker
-extern uint32_t __fatfs_flash_start_addr[];
-extern uint32_t __fatfs_flash_length[];
-
-#define NVM_START_ADDR ((uint32_t)__fatfs_flash_start_addr + \
- (uint32_t)__fatfs_flash_length - CIRCUITPY_INTERNAL_NVM_SIZE)
-
uint32_t common_hal_nvm_bytearray_get_length(nvm_bytearray_obj_t *self) {
- return CIRCUITPY_INTERNAL_NVM_SIZE;
+ return self->len;
}
static void write_page(uint32_t page_addr, uint32_t offset, uint32_t len, uint8_t *bytes) {
@@ -64,7 +57,7 @@ static void write_page(uint32_t page_addr, uint32_t offset, uint32_t len, uint8_
bool common_hal_nvm_bytearray_set_bytes(nvm_bytearray_obj_t *self,
uint32_t start_index, uint8_t* values, uint32_t len) {
- uint32_t address = NVM_START_ADDR + start_index;
+ uint32_t address = (uint32_t) self->start_address + start_index;
uint32_t offset = address % FLASH_PAGE_SIZE;
uint32_t page_addr = address - offset;
@@ -81,5 +74,5 @@ bool common_hal_nvm_bytearray_set_bytes(nvm_bytearray_obj_t *self,
void common_hal_nvm_bytearray_get_bytes(nvm_bytearray_obj_t *self,
uint32_t start_index, uint32_t len, uint8_t* values) {
- memcpy(values, (uint8_t *)(NVM_START_ADDR + start_index), len);
+ memcpy(values, self->start_address + start_index, len);
}
diff --git a/ports/nrf/common-hal/nvm/ByteArray.h b/ports/nrf/common-hal/nvm/ByteArray.h
index a8d09dd43..c048d5577 100644
--- a/ports/nrf/common-hal/nvm/ByteArray.h
+++ b/ports/nrf/common-hal/nvm/ByteArray.h
@@ -31,6 +31,8 @@
typedef struct {
mp_obj_base_t base;
+ uint8_t* start_address;
+ uint32_t len;
} nvm_bytearray_obj_t;
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_NVM_BYTEARRAY_H
diff --git a/ports/nrf/ld_defines.c b/ports/nrf/ld_defines.c
new file mode 100644
index 000000000..0ec6dfdb5
--- /dev/null
+++ b/ports/nrf/ld_defines.c
@@ -0,0 +1,39 @@
+// Fake source file used only to capture #define values for use in ld template files.
+#include "mpconfigport.h"
+
+// For each value needed in the LD file, create a C-like line:
+// /*NAME_OF_VALUE=*/ NAME_OF_VALUE;
+// The C preprocessor will replace NAME_OF_VALUE with the actual value.
+// This will be post-processed by tools/gen_ld_files.py to extract the name and value.
+
+// The next line is a marker to start looking for definitions. Lines above the next line are ignored.
+// START_LD_DEFINES
+
+/*MBR_START_ADDR=*/ MBR_START_ADDR;
+/*MBR_SIZE=*/ MBR_SIZE;
+
+/*SD_FLASH_START_ADDR=*/ SD_FLASH_START_ADDR;
+/*SD_FLASH_SIZE=*/ SD_FLASH_SIZE;
+
+/*ISR_START_ADDR=*/ ISR_START_ADDR;
+/*ISR_SIZE=*/ ISR_SIZE;
+
+/*CIRCUITPY_DEFAULT_STACK_SIZE=*/ CIRCUITPY_DEFAULT_STACK_SIZE;
+
+/*CIRCUITPY_FIRMWARE_START_ADDR=*/ CIRCUITPY_FIRMWARE_START_ADDR;
+/*CIRCUITPY_FIRMWARE_SIZE=*/ CIRCUITPY_FIRMWARE_SIZE;
+
+/*CIRCUITPY_BLE_CONFIG_START_ADDR=*/ CIRCUITPY_BLE_CONFIG_START_ADDR;
+/*CIRCUITPY_BLE_CONFIG_SIZE=*/ CIRCUITPY_BLE_CONFIG_SIZE;
+
+/*CIRCUITPY_INTERNAL_NVM_START_ADDR=*/ CIRCUITPY_INTERNAL_NVM_START_ADDR;
+/*CIRCUITPY_INTERNAL_NVM_SIZE=*/ CIRCUITPY_INTERNAL_NVM_SIZE;
+
+/*CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR=*/ CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR;
+/*CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE=*/ CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE;
+
+/*BOOTLOADER_START_ADDR=*/ BOOTLOADER_START_ADDR;
+/*BOOTLOADER_SIZE=*/ BOOTLOADER_SIZE;
+
+/*BOOTLOADER_SETTINGS_START_ADDR=*/ BOOTLOADER_SETTINGS_START_ADDR;
+/*BOOTLOADER_SETTINGS_SIZE=*/ BOOTLOADER_SETTINGS_SIZE;
diff --git a/ports/nrf/mpconfigport.h b/ports/nrf/mpconfigport.h
index bbe6419a5..cb25870dc 100644
--- a/ports/nrf/mpconfigport.h
+++ b/ports/nrf/mpconfigport.h
@@ -30,8 +30,13 @@
#include "ble_drv.h"
+#include "nrf_mbr.h" // for MBR_SIZE
+#include "nrf_sdm.h" // for SD_FLASH_SIZE
+#include "peripherals/nrf/nvm.h" // for FLASH_PAGE_SIZE
+
#ifdef NRF52840
#define MICROPY_PY_SYS_PLATFORM "nRF52840"
+#define FLASH_SIZE (0x100000) // 1MiB
#endif
#define MICROPY_PY_COLLECTIONS_ORDEREDDICT (1)
@@ -42,26 +47,113 @@
#define MICROPY_PY_UBINASCII (1)
#define MICROPY_PY_UJSON (1)
-// TODO this is old BLE stuff
-#if BLUETOOTH_SD
- #define MICROPY_PY_BLEIO (1)
- #define MICROPY_PY_BLE_NUS (0)
-#else
- #ifndef MICROPY_PY_BLEIO
- #define MICROPY_PY_BLEIO (0)
- #endif
-#endif
-
// 24kiB stack
#define CIRCUITPY_DEFAULT_STACK_SIZE 0x6000
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// This also includes mpconfigboard.h.
#include "py/circuitpy_mpconfig.h"
+// Definitions that might be overriden by mpconfigboard.h
+
+#ifndef CIRCUITPY_INTERNAL_NVM_SIZE
+#define CIRCUITPY_INTERNAL_NVM_SIZE (8192)
+#endif
+
#ifndef BOARD_HAS_32KHZ_XTAL
// Assume crystal is present, which is the most common case.
#define BOARD_HAS_32KHZ_XTAL (1)
#endif
+#if INTERNAL_FLASH_FILESYSTEM
+ #ifndef CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE
+ #define CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE (256*1024)
+ #endif
+#else
+ #define CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE (0)
+#endif
+
+// Flash layout, starting at 0x00000000
+//
+// - SoftDevice
+// - ISR
+// - firmware
+// - BLE config (bonding info, etc.) (optional)
+// - microcontroller.nvm (optional)
+// - internal CIRCUITPY flash filesystem (optional)
+// The flash filesystem is adjacent to the bootloader, so that its location will not change even if
+// other regions change in size.
+// - bootloader (note the MBR at 0x0 redirects to the bootloader here, in high flash)
+// - bootloader settings
+
+// Define these regions starting up from the bottom of flash:
+
+#define MBR_START_ADDR (0x0)
+// MBR_SIZE is from nrf_mbr.h
+#define SD_FLASH_START_ADDR (MBR_START_ADDR + MBR_SIZE)
+
+// SD_FLASH_SIZE is from nrf_sdm.h
+#define ISR_START_ADDR (SD_FLASH_START_ADDR + SD_FLASH_SIZE)
+#define ISR_SIZE (0x1000) // 4kiB
+
+#define CIRCUITPY_FIRMWARE_START_ADDR (ISR_START_ADDR + ISR_SIZE)
+
+// Define these regions starting down from the bootloader:
+
+// Bootloader values from https://github.com/adafruit/Adafruit_nRF52_Bootloader/blob/master/src/linker/s140_v6.ld
+#define BOOTLOADER_START_ADDR (0x000F4000)
+#define BOOTLOADER_SIZE (0xA000) // 40kiB
+#define BOOTLOADER_SETTINGS_START_ADDR (0x000FF000)
+#define BOOTLOADER_SETTINGS_SIZE (0x1000) // 4kiB
+
+#define CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR (BOOTLOADER_START_ADDR - CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE)
+
+#if CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE > 0 && CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR != (BOOTLOADER_START_ADDR - 256*1024)
+#warning Internal flash filesystem location has moved!
+#endif
+
+#define CIRCUITPY_INTERNAL_NVM_START_ADDR (CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR - CIRCUITPY_INTERNAL_NVM_SIZE)
+
+// 32kiB for bonding, etc.
+#define CIRCUITPY_BLE_CONFIG_SIZE (32*1024)
+#define CIRCUITPY_BLE_CONFIG_START_ADDR (CIRCUITPY_INTERNAL_NVM_START_ADDR - CIRCUITPY_BLE_CONFIG_SIZE)
+
+// The firmware space is the space left over between the fixed lower and upper regions.
+#define CIRCUITPY_FIRMWARE_SIZE (CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR - CIRCUITPY_FIRMWARE_START_ADDR)
+
+#if BOOTLOADER_START_ADDR % FLASH_PAGE_SIZE != 0
+#error BOOTLOADER_START_ADDR must be on a flash page boundary.
+#endif
+
+#if CIRCUITPY_INTERNAL_NVM_START_ADDR % FLASH_PAGE_SIZE != 0
+#error CIRCUITPY_INTERNAL_NVM_START_ADDR must be on a flash page boundary.
+#endif
+#if CIRCUITPY_INTERNAL_NVM_SIZE % FLASH_PAGE_SIZE != 0
+#error CIRCUITPY_INTERNAL_NVM_SIZE must be a multiple of FLASH_PAGE_SIZE.
+#endif
+
+#if CIRCUITPY_BLE_CONFIG_START_ADDR % FLASH_PAGE_SIZE != 0
+#error CIRCUITPY_BLE_CONFIG_SIZE must be on a flash page boundary.
+#endif
+#if CIRCUITPY_BLE_CONFIG_SIZE % FLASH_PAGE_SIZE != 0
+#error CIRCUITPY_BLE_CONFIG_SIZE must be a multiple of FLASH_PAGE_SIZE.
+#endif
+
+#if CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR % FLASH_PAGE_SIZE != 0
+#error CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE must be on a flash page boundary.
+#endif
+#if CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE % FLASH_PAGE_SIZE != 0
+#error CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE must be a multiple of FLASH_PAGE_SIZE.
+#endif
+
+#if CIRCUITPY_FIRMWARE_SIZE < 0
+#error No space left in flash for firmware after specifying other regions!
+#endif
+
+
+
+
#define MICROPY_PORT_ROOT_POINTERS \
CIRCUITPY_COMMON_ROOT_POINTERS \
ble_drv_evt_handler_entry_t* ble_drv_evt_handler_entries; \
diff --git a/ports/nrf/mpconfigport.mk b/ports/nrf/mpconfigport.mk
index f61d9f8ea..9b738d4b3 100644
--- a/ports/nrf/mpconfigport.mk
+++ b/ports/nrf/mpconfigport.mk
@@ -1,3 +1,7 @@
+# All linking can be done with this common templated linker script, which has
+# parameters that vary based on chip and/or board.
+LD_TEMPLATE_FILE = boards/common.template.ld
+
# Define an equivalent for MICROPY_LONGINT_IMPL, to pass to $(MPY-TOOL) in py/mkrules.mk
# $(MPY-TOOL) needs to know what kind of longint to use (if any) to freeze long integers.
# This should correspond to the MICROPY_LONGINT_IMPL definition in mpconfigport.h.
@@ -17,8 +21,13 @@ endif
CIRCUITPY_AUDIOIO = 0
+
# The ifndef's allow overriding in mpconfigboard.mk.
+ifndef
+CIRCUITPY_BLEIO = 1
+endif
+
ifndef CIRCUITPY_AUDIOMIXER
CIRCUITPY_AUDIOMIXER = 1
endif
@@ -42,7 +51,22 @@ endif
# frequencyio not yet implemented
CIRCUITPY_FREQUENCYIO = 0
+# nRF52840-specific
+
+ifeq ($(MCU_CHIP),nrf52840)
+MCU_SERIES = m4
+MCU_VARIANT = nrf52
+MCU_SUB_VARIANT = nrf52840
+
+SD ?= s140
+SOFTDEV_VERSION ?= 6.1.0
+
+BOOT_SETTING_ADDR = 0xFF000
+NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
+
# CircuitPython doesn't yet support NFC so force the NFC antenna pins to be GPIO.
# See https://github.com/adafruit/circuitpython/issues/1300
# Defined here because system_nrf52840.c doesn't #include any of our own include files.
CFLAGS += -DCONFIG_NFCT_PINS_AS_GPIOS
+
+endif
diff --git a/ports/nrf/peripherals/nrf/nvm.h b/ports/nrf/peripherals/nrf/nvm.h
index c1a2a76da..e54e953df 100644
--- a/ports/nrf/peripherals/nrf/nvm.h
+++ b/ports/nrf/peripherals/nrf/nvm.h
@@ -27,8 +27,4 @@
#define FLASH_PAGE_SIZE (4096)
-#ifndef CIRCUITPY_INTERNAL_NVM_SIZE
-#define CIRCUITPY_INTERNAL_NVM_SIZE (0)
-#endif
-
bool nrf_nvm_safe_flash_page_write(uint32_t page_addr, uint8_t *data);
diff --git a/ports/nrf/supervisor/internal_flash.c b/ports/nrf/supervisor/internal_flash.c
index 4688e0cee..a44f047ff 100644
--- a/ports/nrf/supervisor/internal_flash.c
+++ b/ports/nrf/supervisor/internal_flash.c
@@ -43,10 +43,6 @@
#include "nrf_sdm.h"
#endif
-// defined in linker
-extern uint32_t __fatfs_flash_start_addr[];
-extern uint32_t __fatfs_flash_length[];
-
#define NO_CACHE 0xffffffff
uint8_t _flash_cache[FLASH_PAGE_SIZE] __attribute__((aligned(4)));
@@ -57,7 +53,7 @@ uint32_t _flash_page_addr = NO_CACHE;
/* Internal Flash API
*------------------------------------------------------------------*/
static inline uint32_t lba2addr(uint32_t block) {
- return ((uint32_t)__fatfs_flash_start_addr) + block * FILESYSTEM_BLOCK_SIZE;
+ return CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_START_ADDR + block * FILESYSTEM_BLOCK_SIZE;
}
void supervisor_flash_init(void) {
@@ -68,7 +64,7 @@ uint32_t supervisor_flash_get_block_size(void) {
}
uint32_t supervisor_flash_get_block_count(void) {
- return ((uint32_t) __fatfs_flash_length - CIRCUITPY_INTERNAL_NVM_SIZE) / FILESYSTEM_BLOCK_SIZE ;
+ return CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE / FILESYSTEM_BLOCK_SIZE ;
}
void supervisor_flash_flush(void) {
diff --git a/ports/nrf/supervisor/serial.c b/ports/nrf/supervisor/serial.c
index 6fd89eb3e..b19e9267c 100644
--- a/ports/nrf/supervisor/serial.c
+++ b/ports/nrf/supervisor/serial.c
@@ -28,15 +28,15 @@
#include "supervisor/serial.h"
-#if (MICROPY_PY_BLE_NUS == 1)
+#if CIRCUITPY_SERIAL_BLE
#include "ble_uart.h"
-#else
+#elif CIRCUITPY_SERIAL_UART
#include <string.h>
#include "nrf_gpio.h"
#include "nrfx_uarte.h"
#endif
-#if (MICROPY_PY_BLE_NUS == 1)
+#if CIRCUITPY_SERIAL_BLE
void serial_init(void) {
ble_uart_init();
@@ -58,7 +58,7 @@ void serial_write(const char *text) {
ble_uart_stdout_tx_str(text);
}
-#elif !defined(NRF52840_XXAA)
+#elif CIRCUITPY_SERIAL_UART
uint8_t serial_received_char;
nrfx_uarte_t serial_instance = NRFX_UARTE_INSTANCE(0);
@@ -124,4 +124,4 @@ void serial_write_substring(const char *text, uint32_t len) {
}
}
-#endif
+#endif // CIRCUITPY_SERIAL_UART
diff --git a/ports/stm32f4/boards/feather_stm32f405_express/mpconfigboard.h b/ports/stm32f4/boards/feather_stm32f405_express/mpconfigboard.h
index dc88f695a..a1d83a25a 100644
--- a/ports/stm32f4/boards/feather_stm32f405_express/mpconfigboard.h
+++ b/ports/stm32f4/boards/feather_stm32f405_express/mpconfigboard.h
@@ -32,9 +32,6 @@
#define FLASH_SIZE (0x100000)
#define FLASH_PAGE_SIZE (0x4000)
-#define AUTORESET_DELAY_MS 500
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000)
-
#define MICROPY_HW_NEOPIXEL (&pin_PC00)
// On-board flash
diff --git a/ports/stm32f4/boards/pyboard_v11/mpconfigboard.h b/ports/stm32f4/boards/pyboard_v11/mpconfigboard.h
index 9d8f72f77..7093442d0 100644
--- a/ports/stm32f4/boards/pyboard_v11/mpconfigboard.h
+++ b/ports/stm32f4/boards/pyboard_v11/mpconfigboard.h
@@ -32,8 +32,6 @@
#define FLASH_SIZE (0x100000)
#define FLASH_PAGE_SIZE (0x4000)
-#define AUTORESET_DELAY_MS 500
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000)
#define DEFAULT_I2C_BUS_SCL (&pin_PB06)
#define DEFAULT_I2C_BUS_SDA (&pin_PB07)
diff --git a/ports/stm32f4/boards/stm32f411ve_discovery/mpconfigboard.h b/ports/stm32f4/boards/stm32f411ve_discovery/mpconfigboard.h
index 0c6f537f8..7a5335407 100644
--- a/ports/stm32f4/boards/stm32f411ve_discovery/mpconfigboard.h
+++ b/ports/stm32f4/boards/stm32f411ve_discovery/mpconfigboard.h
@@ -33,9 +33,3 @@
#define FLASH_PAGE_SIZE (0x4000) //16K
#define BOARD_OSC_DIV 8
-
-#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
-
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x2000 - 0xC000)
-
-#define AUTORESET_DELAY_MS 500
diff --git a/ports/stm32f4/boards/stm32f412zg_discovery/mpconfigboard.h b/ports/stm32f4/boards/stm32f412zg_discovery/mpconfigboard.h
index 45505dee2..3ab9a5585 100644
--- a/ports/stm32f4/boards/stm32f412zg_discovery/mpconfigboard.h
+++ b/ports/stm32f4/boards/stm32f412zg_discovery/mpconfigboard.h
@@ -32,8 +32,5 @@
#define FLASH_SIZE (0x100000)
#define FLASH_PAGE_SIZE (0x4000)
-#define AUTORESET_DELAY_MS 500
-#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PB10)
#define DEFAULT_I2C_BUS_SDA (&pin_PB09)
diff --git a/py/circuitpy_defns.mk b/py/circuitpy_defns.mk
index 446620d27..8dd4fc6b1 100644
--- a/py/circuitpy_defns.mk
+++ b/py/circuitpy_defns.mk
@@ -297,7 +297,6 @@ $(filter $(SRC_PATTERNS), \
fontio/Glyph.c \
microcontroller/RunMode.c \
math/__init__.c \
- supervisor/__init__.c \
)
SRC_BINDINGS_ENUMS += \
@@ -428,6 +427,18 @@ $(addprefix lib/,\
)
endif
+ifdef LD_TEMPLATE_FILE
+# Generate a linker script (.ld file) from a template, for those builds that use it.
+GENERATED_LD_FILE = $(BUILD)/$(notdir $(patsubst %.template.ld,%.ld,$(LD_TEMPLATE_FILE)))
+#
+# ld_defines.pp is generated from ld_defines.c. See py/mkrules.mk.
+# Run gen_ld_files.py over ALL *.template.ld files, not just LD_TEMPLATE_FILE,
+# because it may include other template files.
+$(GENERATED_LD_FILE): $(BUILD)/ld_defines.pp boards/*.template.ld
+ $(STEPECHO) "GEN $@"
+ $(Q)$(PYTHON3) $(TOP)/tools/gen_ld_files.py --defines $< --out_dir $(BUILD) boards/*.template.ld
+endif
+
.PHONY: check-release-needs-clean-build
check-release-needs-clean-build:
diff --git a/py/circuitpy_mpconfig.h b/py/circuitpy_mpconfig.h
index 5ee5d52c0..3161938c4 100644
--- a/py/circuitpy_mpconfig.h
+++ b/py/circuitpy_mpconfig.h
@@ -140,7 +140,6 @@
#define MICROPY_VFS_FAT (MICROPY_VFS)
#define MICROPY_READER_VFS (MICROPY_VFS)
-
// type definitions for the specific machine
#define BYTES_PER_WORD (4)
@@ -168,13 +167,15 @@ typedef long mp_off_t;
#define mp_import_stat mp_vfs_import_stat
#define mp_builtin_open_obj mp_vfs_open_obj
+
// extra built in names to add to the global namespace
#define MICROPY_PORT_BUILTINS \
{ MP_OBJ_NEW_QSTR(MP_QSTR_help), (mp_obj_t)&mp_builtin_help_obj }, \
{ MP_OBJ_NEW_QSTR(MP_QSTR_input), (mp_obj_t)&mp_builtin_input_obj }, \
{ MP_OBJ_NEW_QSTR(MP_QSTR_open), (mp_obj_t)&mp_builtin_open_obj },
-// board specific definitions
+//////////////////////////////////////////////////////////////////////////////////////////////////
+// board-specific definitions, which control and may override definitions below.
#include "mpconfigboard.h"
// CIRCUITPY_FULL_BUILD is defined in a *.mk file.
@@ -213,6 +214,9 @@ typedef long mp_off_t;
#define MP_SSIZE_MAX (0x7fffffff)
#endif
+#if INTERNAL_FLASH_FILESYSTEM == 0 && QSPI_FLASH_FILESYSTEM == 0 && SPI_FLASH_FILESYSTEM == 0 && !CIRCUITPY_MINIMAL_BUILD
+#error No *_FLASH_FILESYSTEM set!
+#endif
// These CIRCUITPY_xxx values should all be defined in the *.mk files as being on or off.
// So if any are not defined in *.mk, they'll throw an error here.
@@ -670,8 +674,15 @@ void supervisor_run_background_tasks_if_tick(void);
#define MICROPY_VM_HOOK_LOOP RUN_BACKGROUND_TASKS;
#define MICROPY_VM_HOOK_RETURN RUN_BACKGROUND_TASKS;
+// CIRCUITPY_AUTORELOAD_DELAY_MS = 0 will completely disable autoreload.
+#ifndef CIRCUITPY_AUTORELOAD_DELAY_MS
#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
+#endif
+
+#ifndef CIRCUITPY_FILESYSTEM_FLUSH_INTERVAL_MS
#define CIRCUITPY_FILESYSTEM_FLUSH_INTERVAL_MS 1000
+#endif
+
#define CIRCUITPY_BOOT_OUTPUT_FILE "/boot_out.txt"
#define CIRCUITPY_VERBOSE_BLE 0
diff --git a/py/circuitpy_mpconfig.mk b/py/circuitpy_mpconfig.mk
index c614ea06a..a464583f3 100644
--- a/py/circuitpy_mpconfig.mk
+++ b/py/circuitpy_mpconfig.mk
@@ -23,7 +23,6 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-
# mpconfigboard.mk files can specify:
# CIRCUITPY_FULL_BUILD = 1 (which is the default)
# or
@@ -34,15 +33,19 @@
ifndef CIRCUITPY_FULL_BUILD
ifeq ($(CIRCUITPY_SMALL_BUILD),1)
CIRCUITPY_FULL_BUILD = 0
- CFLAGS += -DCIRCUITPY_FULL_BUILD=0
else
CIRCUITPY_FULL_BUILD = 1
- CFLAGS += -DCIRCUITPY_FULL_BUILD=1
endif
endif
+CFLAGS += -DCIRCUITPY_FULL_BUILD=$(CIRCUITPY_FULL_BUILD)
# Setting CIRCUITPY_MINIMAL_BUILD = 1 will disable all features
# Use for for early stage or highly restricted ports
+ifndef CIRCUITPY_MINIMAL_BUILD
+CIRCUITPY_MINIMAL_BUILD = 0
+endif
+CFLAGS += -DCIRCUITPY_MINIMAL_BUILD=$(CIRCUITPY_MINIMAL_BUILD)
+
ifndef CIRCUITPY_DEFAULT_BUILD
ifeq ($(CIRCUITPY_MINIMAL_BUILD),1)
CIRCUITPY_FULL_BUILD = 0
@@ -51,12 +54,14 @@ ifndef CIRCUITPY_DEFAULT_BUILD
CIRCUITPY_DEFAULT_BUILD = 1
endif
endif
+CFLAGS += -DCIRCUITPY_DEFAULT_BUILD=$(CIRCUITPY_DEFAULT_BUILD)
# Some features have no unique HAL component, and thus there's never
# a reason to not include them.
ifndef CIRCUITPY_ALWAYS_BUILD
CIRCUITPY_ALWAYS_BUILD = 1
endif
+CFLAGS += -DCIRCUITPY_ALWAYS_BUILD=$(CIRCUITPY_ALWAYS_BUILD)
# All builtin modules are listed below, with default values (0 for off, 1 for on)
@@ -298,12 +303,24 @@ CIRCUITPY_USTACK = 0
endif
CFLAGS += -DCIRCUITPY_USTACK=$(CIRCUITPY_USTACK)
+# Non-module conditionals
ifndef CIRCUITPY_BITBANG_APA102
CIRCUITPY_BITBANG_APA102 = 0
endif
CFLAGS += -DCIRCUITPY_BITBANG_APA102=$(CIRCUITPY_BITBANG_APA102)
+# REPL over BLE
+ifndef CIRCUITPY_SERIAL_BLE
+CIRCUITPY_SERIAL_BLE = 0
+endif
+CFLAGS += -DCIRCUITPY_SERIAL_BLE=$(CIRCUITPY_SERIAL_BLE)
+
+# REPL over UART
+ifndef CIRCUITPY_SERIAL_UART
+CIRCUITPY_SERIAL_UART = 0
+endif
+CFLAGS += -DCIRCUITPY_SERIAL_UART=$(CIRCUITPY_SERIAL_UART)
# Enabled micropython.native decorator (experimental)
ifndef CIRCUITPY_ENABLE_MPY_NATIVE
diff --git a/py/py.mk b/py/py.mk
index ae9b005b6..0c68e9af1 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -308,7 +308,7 @@ $(HEADER_BUILD)/mpversion.h: FORCE | $(HEADER_BUILD)
# build a list of registered modules for py/objmodule.c.
$(HEADER_BUILD)/moduledefs.h: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(HEADER_BUILD)/mpversion.h
- @$(ECHO) "GEN $@"
+ @$(STEPECHO) "GEN $@"
$(Q)$(PYTHON) $(PY_SRC)/makemoduledefs.py --vpath="., $(TOP), $(USER_C_MODULES)" $(SRC_QSTR) > $@
SRC_QSTR += $(HEADER_BUILD)/moduledefs.h
diff --git a/supervisor/supervisor.mk b/supervisor/supervisor.mk
index 5e997ee78..96a14c25b 100644
--- a/supervisor/supervisor.mk
+++ b/supervisor/supervisor.mk
@@ -17,25 +17,27 @@ ifndef $(NO_USB)
NO_USB = $(wildcard supervisor/usb.c)
endif
-ifneq ($(INTERNAL_FLASH_FILESYSTEM),)
- CFLAGS += -DINTERNAL_FLASH_FILESYSTEM=$(INTERNAL_FLASH_FILESYSTEM)
+ifndef INTERNAL_FLASH_FILESYSTEM
+INTERNAL_FLASH_FILESYSTEM = 0
endif
-ifneq ($(QSPI_FLASH_FILESYSTEM),)
-# EXPRESS_BOARD is obsolete and should be removed when samd-peripherals is updated.
- CFLAGS += -DQSPI_FLASH_FILESYSTEM=$(QSPI_FLASH_FILESYSTEM) -DEXPRESS_BOARD
-endif
-ifneq ($(SPI_FLASH_FILESYSTEM),)
-# EXPRESS_BOARD is obsolete and should be removed when samd-peripherals is updated.
- CFLAGS += -DSPI_FLASH_FILESYSTEM=$(SPI_FLASH_FILESYSTEM) -DEXPRESS_BOARD
+CFLAGS += -DINTERNAL_FLASH_FILESYSTEM=$(INTERNAL_FLASH_FILESYSTEM)
+
+ifndef QSPI_FLASH_FILESYSTEM
+QSPI_FLASH_FILESYSTEM = 0
endif
+CFLAGS += -DQSPI_FLASH_FILESYSTEM=$(QSPI_FLASH_FILESYSTEM)
+ifndef SPI_FLASH_FILESYSTEM
+SPI_FLASH_FILESYSTEM = 0
+endif
+CFLAGS += -DSPI_FLASH_FILESYSTEM=$(SPI_FLASH_FILESYSTEM)
ifeq ($(CIRCUITPY_BLEIO),1)
SRC_SUPERVISOR += supervisor/shared/bluetooth.c
endif
# Choose which flash filesystem impl to use.
-# (Right now INTERNAL_FLASH_FILESYSTEM and SPI_FLASH_FILESYSTEM are mutually exclusive.
+# (Right now INTERNAL_FLASH_FILESYSTEM and (Q)SPI_FLASH_FILESYSTEM are mutually exclusive.
# But that might not be true in the future.)
ifdef EXTERNAL_FLASH_DEVICES
CFLAGS += -DEXTERNAL_FLASH_DEVICES=$(EXTERNAL_FLASH_DEVICES) \
@@ -52,7 +54,7 @@ ifdef EXTERNAL_FLASH_DEVICES
else
ifeq ($(DISABLE_FILESYSTEM),1)
SRC_SUPERVISOR += supervisor/stub/internal_flash.c
- else
+ else
SRC_SUPERVISOR += supervisor/internal_flash.c
endif
endif
@@ -64,30 +66,31 @@ ifeq ($(USB),FALSE)
SRC_SUPERVISOR += supervisor/serial.c
endif
else
- SRC_SUPERVISOR += lib/tinyusb/src/common/tusb_fifo.c \
- lib/tinyusb/src/device/usbd.c \
- lib/tinyusb/src/device/usbd_control.c \
- lib/tinyusb/src/class/msc/msc_device.c \
- lib/tinyusb/src/class/cdc/cdc_device.c \
- lib/tinyusb/src/class/hid/hid_device.c \
- lib/tinyusb/src/class/midi/midi_device.c \
- lib/tinyusb/src/tusb.c \
- supervisor/shared/serial.c \
- supervisor/usb.c \
- supervisor/shared/usb/usb_desc.c \
- supervisor/shared/usb/usb.c \
- supervisor/shared/usb/usb_msc_flash.c \
- shared-bindings/usb_hid/__init__.c \
- shared-bindings/usb_hid/Device.c \
- shared-bindings/usb_midi/__init__.c \
- shared-bindings/usb_midi/PortIn.c \
- shared-bindings/usb_midi/PortOut.c \
- shared-module/usb_hid/__init__.c \
- shared-module/usb_hid/Device.c \
- shared-module/usb_midi/__init__.c \
- shared-module/usb_midi/PortIn.c \
- shared-module/usb_midi/PortOut.c \
- $(BUILD)/autogen_usb_descriptor.c
+ SRC_SUPERVISOR += \
+ lib/tinyusb/src/common/tusb_fifo.c \
+ lib/tinyusb/src/device/usbd.c \
+ lib/tinyusb/src/device/usbd_control.c \
+ lib/tinyusb/src/class/msc/msc_device.c \
+ lib/tinyusb/src/class/cdc/cdc_device.c \
+ lib/tinyusb/src/class/hid/hid_device.c \
+ lib/tinyusb/src/class/midi/midi_device.c \
+ lib/tinyusb/src/tusb.c \
+ supervisor/shared/serial.c \
+ supervisor/usb.c \
+ supervisor/shared/usb/usb_desc.c \
+ supervisor/shared/usb/usb.c \
+ supervisor/shared/usb/usb_msc_flash.c \
+ shared-bindings/usb_hid/__init__.c \
+ shared-bindings/usb_hid/Device.c \
+ shared-bindings/usb_midi/__init__.c \
+ shared-bindings/usb_midi/PortIn.c \
+ shared-bindings/usb_midi/PortOut.c \
+ shared-module/usb_hid/__init__.c \
+ shared-module/usb_hid/Device.c \
+ shared-module/usb_midi/__init__.c \
+ shared-module/usb_midi/PortIn.c \
+ shared-module/usb_midi/PortOut.c \
+ $(BUILD)/autogen_usb_descriptor.c
CFLAGS += -DUSB_AVAILABLE
endif
diff --git a/tools/build_memory_info.py b/tools/build_memory_info.py
index a8f84bbb6..f61b843ce 100644
--- a/tools/build_memory_info.py
+++ b/tools/build_memory_info.py
@@ -41,6 +41,8 @@ data = 0
bss = 0
# stdin is the linker output.
for line in sys.stdin:
+ # Uncomment to see linker output.
+ # print(line)
line = line.strip()
if not line.startswith("text"):
text, data, bss = map(int, line.split()[:3])
@@ -50,7 +52,7 @@ regions = {}
with open(sys.argv[1], "r") as f:
for line in f:
line = line.strip()
- if line.startswith(("FLASH", "RAM")):
+ if line.startswith(("FLASH_FIRMWARE", "FLASH", "RAM")):
regions[line.split()[0]] = line.split("=")[-1]
for region in regions:
@@ -59,12 +61,19 @@ for region in regions:
space = space.split("/*")[0]
space = K_PATTERN.sub(K_REPLACE, space)
space = M_PATTERN.sub(M_REPLACE, space)
- regions[region] = eval(space)
+ regions[region] = int(eval(space))
-free_flash = regions["FLASH"] - text - data
-free_ram = regions["RAM"] - data - bss
-print(free_flash, "bytes free in flash out of", regions["FLASH"], "bytes (", regions["FLASH"] / 1024, "kb ).")
-print(free_ram, "bytes free in ram for stack out of", regions["RAM"], "bytes (", regions["RAM"] / 1024, "kb ).")
+# TODO Remove check for both FLASH_FIRMWARE and FLASH after all ports are converted to use FLASH_FIRMWARE.
+try:
+ firmware_region = regions["FLASH_FIRMWARE"]
+except KeyError:
+ firmware_region = regions["FLASH"]
+ram_region = regions["RAM"]
+
+free_flash = firmware_region - text - data
+free_ram = ram_region - data - bss
+print("{} bytes free in flash firmware space out of {} bytes ({}kB).".format(free_flash, firmware_region, firmware_region / 1024))
+print("{} bytes free in ram for heap out of {} bytes ({}kB).".format(free_ram, ram_region, ram_region / 1024))
print()
# Check that we have free flash space. GCC doesn't fail when the text + data
diff --git a/tools/gen_ld_files.py b/tools/gen_ld_files.py
new file mode 100755
index 000000000..c2ac812bc
--- /dev/null
+++ b/tools/gen_ld_files.py
@@ -0,0 +1,60 @@
+#! /usr/bin/env python3
+import argparse
+
+import os
+import os.path
+import sys
+import re
+from string import Template
+
+parser = argparse.ArgumentParser(description='Apply #define values to .template.ld file.')
+parser.add_argument('template_files', metavar='TEMPLATE_FILE', type=argparse.FileType('r'),
+ nargs='+', help="template filename: <something>.template.ld")
+parser.add_argument('--defines', type=argparse.FileType('r'), required=True)
+parser.add_argument('--out_dir', required=True)
+
+args = parser.parse_args()
+
+defines = {}
+
+#
+REMOVE_UL_RE = re.compile('([0-9]+)UL')
+def remove_UL(s):
+ return REMOVE_UL_RE.sub(r'\1', s)
+
+# We skip all lines before
+# // START_LD_DEFINES
+# Then we look for lines like this:
+# /*NAME_OF_VALUE=*/ NAME_OF_VALUE;
+VALUE_LINE_RE = re.compile(r'^/\*\s*(\w+)\s*=\*/\s*(.*);\s*$')
+
+start_processing = False
+for line in args.defines:
+ line = line.strip()
+ if line == '// START_LD_DEFINES':
+ start_processing = True
+ continue
+ if start_processing:
+ match = VALUE_LINE_RE.match(line)
+ if match:
+ name = match.group(1)
+ value = match.group(2).strip()
+ defines[name] = remove_UL(value)
+
+fail = False
+
+for template_file in args.template_files:
+ ld_template_basename = os.path.basename(template_file.name)
+ ld_pathname = os.path.join(args.out_dir, ld_template_basename.replace('.template.ld', '.ld'))
+ with open(ld_pathname, 'w') as output:
+ for k,v in defines.items():
+ print('/*', k, '=', v, '*/', file=output)
+ print(file=output)
+ try:
+ output.write(Template(template_file.read()).substitute(defines))
+ except KeyError as e:
+ print("ERROR: {}: No #define for '{}'".format(ld_pathname, e.args[0]), file=sys.stderr)
+ fail = True
+
+if fail:
+ sys.exit(1)