From 5eb9f9d06074bf532683b268bc5370cfa33ce8ba Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Tue, 3 Apr 2018 21:20:42 -0500 Subject: [PATCH 1/6] atmel-samd: Fix rebooting to bootloader Commit efbf08266b6 moved _estack in order to ensure 8-byte alignment of the stack, but the address of _bootloader_dbl_tap must remain right at the end of SRAM. I verified by reading the source that the 4-byte-aligned address is used for all samd21 / samd51 boards in adafruit/circuitpython@efbf08266b. However, I only tested on trinket_m0. Closes: #739 --- ports/atmel-samd/boards/samd21x18-bootloader-crystalless.ld | 2 +- .../boards/samd21x18-bootloader-external-flash-crystalless.ld | 2 +- ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld | 2 +- ports/atmel-samd/boards/samd21x18-bootloader.ld | 2 +- ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld | 2 +- ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld | 2 +- ports/atmel-samd/boards/samd51x19-bootloader.ld | 2 +- ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld | 2 +- ports/atmel-samd/boards/samd51x20-bootloader.ld | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ports/atmel-samd/boards/samd21x18-bootloader-crystalless.ld b/ports/atmel-samd/boards/samd21x18-bootloader-crystalless.ld index 3b3c58ad2b..2adf4fa909 100644 --- a/ports/atmel-samd/boards/samd21x18-bootloader-crystalless.ld +++ b/ports/atmel-samd/boards/samd21x18-bootloader-crystalless.ld @@ -13,7 +13,7 @@ MEMORY /* top end of the stack */ /* stack must be double-word (8 byte) aligned */ _estack = ORIGIN(RAM) + LENGTH(RAM) - 8; -_bootloader_dbl_tap = _estack; +_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4; /* define output sections */ SECTIONS diff --git a/ports/atmel-samd/boards/samd21x18-bootloader-external-flash-crystalless.ld b/ports/atmel-samd/boards/samd21x18-bootloader-external-flash-crystalless.ld index 7d86dea1f8..bddaae99da 100644 --- a/ports/atmel-samd/boards/samd21x18-bootloader-external-flash-crystalless.ld +++ b/ports/atmel-samd/boards/samd21x18-bootloader-external-flash-crystalless.ld @@ -13,7 +13,7 @@ MEMORY /* top end of the stack */ /* stack must be double-word (8 byte) aligned */ _estack = ORIGIN(RAM) + LENGTH(RAM) - 8; -_bootloader_dbl_tap = _estack; +_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4; /* define output sections */ SECTIONS diff --git a/ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld b/ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld index 66bceee000..4e677a079f 100644 --- a/ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld +++ b/ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld @@ -13,7 +13,7 @@ MEMORY /* top end of the stack */ /* stack must be double-word (8 byte) aligned */ _estack = ORIGIN(RAM) + LENGTH(RAM) - 8; -_bootloader_dbl_tap = _estack; +_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4; /* define output sections */ SECTIONS diff --git a/ports/atmel-samd/boards/samd21x18-bootloader.ld b/ports/atmel-samd/boards/samd21x18-bootloader.ld index 7e33ed007f..3eb97ee026 100644 --- a/ports/atmel-samd/boards/samd21x18-bootloader.ld +++ b/ports/atmel-samd/boards/samd21x18-bootloader.ld @@ -13,7 +13,7 @@ MEMORY /* top end of the stack */ /* stack must be double-word (8 byte) aligned */ _estack = ORIGIN(RAM) + LENGTH(RAM) - 8; -_bootloader_dbl_tap = _estack; +_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4; /* define output sections */ SECTIONS diff --git a/ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld b/ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld index 0fc476889a..0bd2a8297c 100644 --- a/ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld +++ b/ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld @@ -13,7 +13,7 @@ MEMORY /* top end of the stack */ /* stack must be double-word (8 byte) aligned */ _estack = ORIGIN(RAM) + LENGTH(RAM) - 8; -_bootloader_dbl_tap = _estack; +_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4; /* define output sections */ SECTIONS diff --git a/ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld b/ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld index cd65e965d3..b6b4f32650 100644 --- a/ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld +++ b/ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld @@ -13,7 +13,7 @@ MEMORY /* top end of the stack */ /* stack must be double-word (8 byte) aligned */ _estack = ORIGIN(RAM) + LENGTH(RAM) - 8; -_bootloader_dbl_tap = _estack; +_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4; /* define output sections */ SECTIONS diff --git a/ports/atmel-samd/boards/samd51x19-bootloader.ld b/ports/atmel-samd/boards/samd51x19-bootloader.ld index 54e16a8f5c..4876e82277 100644 --- a/ports/atmel-samd/boards/samd51x19-bootloader.ld +++ b/ports/atmel-samd/boards/samd51x19-bootloader.ld @@ -13,7 +13,7 @@ MEMORY /* top end of the stack */ /* stack must be double-word (8 byte) aligned */ _estack = ORIGIN(RAM) + LENGTH(RAM) - 8; -_bootloader_dbl_tap = _estack; +_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4; /* define output sections */ SECTIONS diff --git a/ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld b/ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld index 148f4dd9f2..3a1611279c 100644 --- a/ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld +++ b/ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld @@ -13,7 +13,7 @@ MEMORY /* top end of the stack */ /* stack must be double-word (8 byte) aligned */ _estack = ORIGIN(RAM) + LENGTH(RAM) - 8; -_bootloader_dbl_tap = _estack; +_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4; /* define output sections */ SECTIONS diff --git a/ports/atmel-samd/boards/samd51x20-bootloader.ld b/ports/atmel-samd/boards/samd51x20-bootloader.ld index c8a43e7248..d3d37de3b2 100644 --- a/ports/atmel-samd/boards/samd51x20-bootloader.ld +++ b/ports/atmel-samd/boards/samd51x20-bootloader.ld @@ -13,7 +13,7 @@ MEMORY /* top end of the stack */ /* stack must be double-word (8 byte) aligned */ _estack = ORIGIN(RAM) + LENGTH(RAM) - 8; -_bootloader_dbl_tap = _estack; +_bootloader_dbl_tap = ORIGIN(RAM) + LENGTH(RAM) - 4; /* define output sections */ SECTIONS From fe6f5aaa70a0d3a21c7ce542258e5c849c3b4687 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Wed, 4 Apr 2018 19:21:54 -0500 Subject: [PATCH 2/6] atmel-samd: reset: reset() was always entering bootloader mode .. set the dbl_tap word to a different special value unless RUNMODE_BOOTLOADER was selected --- ports/atmel-samd/common-hal/microcontroller/__init__.c | 2 +- ports/atmel-samd/reset.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ports/atmel-samd/common-hal/microcontroller/__init__.c b/ports/atmel-samd/common-hal/microcontroller/__init__.c index 614fac870b..5839ed5131 100644 --- a/ports/atmel-samd/common-hal/microcontroller/__init__.c +++ b/ports/atmel-samd/common-hal/microcontroller/__init__.c @@ -55,7 +55,7 @@ extern uint32_t _ezero; void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) { // Set up the defaults. - _bootloader_dbl_tap = DBL_TAP_MAGIC; + _bootloader_dbl_tap = DBL_TAP_MAGIC_QUICK_BOOT; _ezero = CIRCUITPY_CANARY_WORD; if (runmode == RUNMODE_BOOTLOADER) { diff --git a/ports/atmel-samd/reset.h b/ports/atmel-samd/reset.h index ea955c655d..b589d26111 100644 --- a/ports/atmel-samd/reset.h +++ b/ports/atmel-samd/reset.h @@ -31,6 +31,7 @@ // Copied from inc/uf2.h in https://github.com/Microsoft/uf2-samd21 #define DBL_TAP_MAGIC 0xf01669ef // Randomly selected, adjusted to have first and last bit set +#define DBL_TAP_MAGIC_QUICK_BOOT 0xf02669ef extern uint32_t _bootloader_dbl_tap; From 92853e611db7e60073631b8f117ccec32106fa6a Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Wed, 4 Apr 2018 19:22:17 -0500 Subject: [PATCH 3/6] RunMode: Fix repr(RunMode.BOOTLOADER) --- shared-bindings/microcontroller/RunMode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/microcontroller/RunMode.c b/shared-bindings/microcontroller/RunMode.c index b27a3c0909..7c3f84fcac 100644 --- a/shared-bindings/microcontroller/RunMode.c +++ b/shared-bindings/microcontroller/RunMode.c @@ -76,7 +76,7 @@ STATIC void mcu_runmode_print(const mp_print_t *print, mp_obj_t self_in, mp_prin runmode = MP_QSTR_SAFE_MODE; } else if (MP_OBJ_TO_PTR(self_in) == MP_ROM_PTR(&mcu_runmode_bootloader_obj)) { - runmode = MP_QSTR_SAFE_MODE; + runmode = MP_QSTR_BOOTLOADER; } mp_printf(print, "%q.%q.%q", MP_QSTR_microcontroller, MP_QSTR_RunMode, runmode); From 4982a3ad323b2caa9cac16a148ee695c4a58d2dd Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Tue, 14 Nov 2017 09:24:33 +0200 Subject: [PATCH 4/6] esp8266/esp8266_common.ld: Put .text of more libs into .irom0.text . Recent vendor SDKs ship libs with code in .text section, which previously was going into .irom0.text. Adjust the linker script to route these sections back to iROM (follows upstream change). --- ports/esp8266/esp8266_common.ld | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ports/esp8266/esp8266_common.ld b/ports/esp8266/esp8266_common.ld index 031123389b..aeeecb9277 100644 --- a/ports/esp8266/esp8266_common.ld +++ b/ports/esp8266/esp8266_common.ld @@ -73,6 +73,17 @@ SECTIONS _irom0_text_start = ABSOLUTE(.); *(.irom0.literal .irom.literal .irom.text.literal .irom0.text .irom.text) + /* Vendor SDK in v2.1.0-7-gb8fd588 started to build these with + -ffunction-sections -fdata-sections, and require routing to + irom via linker: + https://github.com/espressif/ESP8266_NONOS_SDK/commit/b8fd588a33f0319dc135523b51655e97b483b205 + */ + + *libcrypto.a:(.literal.* .text.*) + *libnet80211.a:(.literal.* .text.*) + *libwpa.a:(.literal.* .text.*) + *libwpa2.a:(.literal.* .text.*) + /* we put some specific text in this section */ *common-hal/*.o*(.literal* .text*) From d69ef6bfd3c79829db48695647e95fb5f4150c2b Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Fri, 6 Apr 2018 20:37:48 -0500 Subject: [PATCH 5/6] esp8266/etshal: delete incorrect function prototypes these are function prototypes not used in circuitpython. The declarations began to conflict with ones in the upstream SDK at some point, so delete them. --- ports/esp8266/etshal.h | 8 -------- 1 file changed, 8 deletions(-) diff --git a/ports/esp8266/etshal.h b/ports/esp8266/etshal.h index 34787779f9..7f6962d7a3 100644 --- a/ports/esp8266/etshal.h +++ b/ports/esp8266/etshal.h @@ -6,14 +6,12 @@ // see http://esp8266-re.foogod.com/wiki/Random_Number_Generator #define WDEV_HWRNG ((volatile uint32_t*)0x3ff20e44) -void ets_delay_us(); void ets_intr_lock(void); void ets_intr_unlock(void); void ets_isr_mask(uint32_t mask); void ets_isr_unmask(uint32_t mask); void ets_isr_attach(int irq_no, void (*handler)(void *), void *arg); void ets_install_putc1(); -void uart_div_modify(); void ets_set_idle_cb(void (*handler)(void *), void *arg); void ets_timer_arm_new(os_timer_t *tim, uint32_t millis, bool repeat, bool is_milli_timer); @@ -32,12 +30,6 @@ void MD5Init(MD5_CTX *context); void MD5Update(MD5_CTX *context, const void *data, unsigned int len); void MD5Final(unsigned char digest[16], MD5_CTX *context); -// These prototypes are for recent SDKs with "malloc tracking" -void *pvPortMalloc(unsigned sz, const char *fname, int line); -void *pvPortZalloc(unsigned sz, const char *fname, int line); -void *pvPortRealloc(void *p, unsigned sz, const char *fname, int line); -void vPortFree(void *p, const char *fname, int line); - uint32_t SPIRead(uint32_t offset, void *buf, uint32_t len); uint32_t SPIWrite(uint32_t offset, const void *buf, uint32_t len); uint32_t SPIEraseSector(int sector); From 32048cdeeb4b3585eba66d67f31192ecfdae7de8 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Sun, 8 Apr 2018 09:51:45 -0400 Subject: [PATCH 6/6] tools/usb_descriptor updates --- tools/usb_descriptor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/usb_descriptor b/tools/usb_descriptor index a04341153b..0094aa68e9 160000 --- a/tools/usb_descriptor +++ b/tools/usb_descriptor @@ -1 +1 @@ -Subproject commit a04341153b41b4728f9b42a77cbd51c495362287 +Subproject commit 0094aa68e9fcdaffcd0126b9d9b0515a44d2c51d