summaryrefslogtreecommitdiff
path: root/ports
diff options
context:
space:
mode:
Diffstat (limited to 'ports')
-rw-r--r--ports/atmel-samd/background.c11
-rw-r--r--ports/atmel-samd/background.h1
-rw-r--r--ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/arduino_zero/mpconfigboard.h3
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h3
-rw-r--r--ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h1
-rwxr-xr-xports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h1
-rw-r--r--ports/atmel-samd/boards/gemma_m0/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h1
-rw-r--r--ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/meowmeow/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h1
-rw-r--r--ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/trinket_m0/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h1
-rw-r--r--ports/atmel-samd/common-hal/nvm/ByteArray.c3
-rw-r--r--ports/atmel-samd/mpconfigport.h11
-rw-r--r--ports/atmel-samd/supervisor/port.c67
-rw-r--r--ports/esp8266/Makefile1
-rw-r--r--ports/nrf/boards/feather_nrf52832/mpconfigboard.h2
-rw-r--r--ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h2
-rw-r--r--ports/nrf/boards/particle_argon/mpconfigboard.h2
-rw-r--r--ports/nrf/boards/particle_boron/mpconfigboard.h2
-rw-r--r--ports/nrf/boards/particle_xenon/mpconfigboard.h2
-rw-r--r--ports/nrf/boards/pca10040/mpconfigboard.h2
-rw-r--r--ports/nrf/boards/pca10040/pins.c4
-rw-r--r--ports/nrf/boards/pca10056/mpconfigboard.h2
-rw-r--r--ports/nrf/boards/pca10059/mpconfigboard.h2
-rw-r--r--ports/nrf/common-hal/neopixel_write/__init__.c23
-rw-r--r--ports/nrf/peripherals/nrf/clocks.c3
-rw-r--r--ports/nrf/supervisor/port.c51
-rw-r--r--ports/unix/Makefile2
43 files changed, 165 insertions, 73 deletions
diff --git a/ports/atmel-samd/background.c b/ports/atmel-samd/background.c
index 099cb8b23..94763bc43 100644
--- a/ports/atmel-samd/background.c
+++ b/ports/atmel-samd/background.c
@@ -29,11 +29,15 @@
#include "tick.h"
#include "supervisor/usb.h"
+#include "py/runtime.h"
#include "shared-module/displayio/__init__.h"
#include "shared-module/network/__init__.h"
+#include "supervisor/shared/stack.h"
volatile uint64_t last_finished_tick = 0;
+bool stack_ok_so_far = true;
+
void run_background_tasks(void) {
#if (defined(SAMD21) && defined(PIN_PA02)) || defined(SAMD51)
audio_dma_background();
@@ -41,6 +45,7 @@ void run_background_tasks(void) {
#ifdef CIRCUITPY_DISPLAYIO
displayio_refresh_display();
#endif
+
#if MICROPY_PY_NETWORK
network_module_background();
#endif
@@ -49,6 +54,12 @@ void run_background_tasks(void) {
last_finished_tick = ticks_ms;
}
+void run_background_vm_tasks(void) {
+ assert_heap_ok();
+ run_background_tasks();
+ assert_heap_ok();
+}
+
bool background_tasks_ok(void) {
return ticks_ms - last_finished_tick < 1000;
}
diff --git a/ports/atmel-samd/background.h b/ports/atmel-samd/background.h
index e841049a4..8d1316e73 100644
--- a/ports/atmel-samd/background.h
+++ b/ports/atmel-samd/background.h
@@ -30,6 +30,7 @@
#include <stdbool.h>
void run_background_tasks(void);
+void run_background_vm_tasks(void);
bool background_tasks_ok(void);
#endif // MICROPY_INCLUDED_ATMEL_SAMD_BACKGROUND_H
diff --git a/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h b/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h
index 1e8d926fd..1deda871a 100644
--- a/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h
+++ b/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h
@@ -5,6 +5,8 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
+#define MICROPY_HW_LED_STATUS (&pin_PB23)
+
#define CIRCUITPY_INTERNAL_NVM_SIZE 0
#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000)
diff --git a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h
index 9a6256c68..7ab09d447 100644
--- a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h
+++ b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h
@@ -1,7 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Arduino Zero"
#define MICROPY_HW_MCU_NAME "samd21g18"
-// #define MICROPY_HW_LED_MSC &pin_PA17 // red
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
#define MICROPY_HW_LED_TX &pin_PA27
#define MICROPY_HW_LED_RX &pin_PB03
diff --git a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
index 2ad13e81c..e6a7e0676 100644
--- a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit CircuitPlayground Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
// Don't allow touch on A0 (PA02), because it's connected to the speaker.
#define PA02_NO_TOUCH (true)
diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
index 250300858..e66d9c40e 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
+++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit CircuitPlayground Express with Crickit libraries"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
// No framebuf on CRICKit version to save space.
#define MICROPY_PY_FRAMEBUF (0)
diff --git a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h
index c28c4aafb..787a3ee55 100644
--- a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h
@@ -1,5 +1,6 @@
// LEDs
-//#define MICROPY_HW_LED_MSC PIN_PA17 // red
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 Adalogger"
#define MICROPY_HW_MCU_NAME "samd21g18"
diff --git a/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h
index d66efb36f..2a21b8f02 100644
--- a/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h
@@ -1,5 +1,5 @@
// LEDs
-//#define MICROPY_HW_LED_MSC PIN_PA17 // red
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 Basic"
#define MICROPY_HW_MCU_NAME "samd21g18"
diff --git a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h
index 1f02ee995..7c10a92ec 100644
--- a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
#define MICROPY_HW_NEOPIXEL (&pin_PA06)
#define SPI_FLASH_MOSI_PIN &pin_PA08
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 b5544e253..abbf0b08c 100644
--- a/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 Express with Crickit libraries"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
#define MICROPY_HW_NEOPIXEL (&pin_PA06)
#define SPI_FLASH_MOSI_PIN &pin_PA08
diff --git a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h
index c385a97ea..a0f79ed72 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h
@@ -1,5 +1,5 @@
// LEDs
-//#define MICROPY_HW_LED_MSC PIN_PA17 // red
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 RFM69"
#define MICROPY_HW_MCU_NAME "samd21g18"
diff --git a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h
index 1e3a0bda0..85c24bfd0 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h
@@ -1,5 +1,5 @@
// LEDs
-//#define MICROPY_HW_LED_MSC PIN_PA17 // red
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 RFM9x"
#define MICROPY_HW_MCU_NAME "samd21g18"
diff --git a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h
index 6bf1df156..5ad265bf1 100644
--- a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h
@@ -3,6 +3,8 @@
#define MICROPY_HW_BOARD_NAME "Hacked Feather M0 Express with 8Mbyte SPI flash"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
#define MICROPY_HW_NEOPIXEL (&pin_PA06)
#define SPI_FLASH_MOSI_PIN &pin_PA08
diff --git a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h
index 98906a844..ed1dfe763 100644
--- a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h
@@ -5,6 +5,7 @@
// Rev E
+#define MICROPY_HW_LED_STATUS (&pin_PA23)
#define MICROPY_HW_NEOPIXEL (&pin_PB03)
// These are pins not to reset.
diff --git a/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h b/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h
index c4e025178..7df31f3a9 100755
--- a/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h
@@ -1,6 +1,7 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Feather RadioFruit Zigbee"
#define MICROPY_HW_MCU_NAME "samr21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA27)
#define MICROPY_HW_NEOPIXEL (&pin_PA22)
#define SPI_FLASH_MOSI_PIN &pin_PA31
diff --git a/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h b/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h
index 08d1803f2..59e0b3c61 100644
--- a/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h
+++ b/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Gemma M0"
#define MICROPY_HW_MCU_NAME "samd21e18"
+#define MICROPY_HW_LED_STATUS (&pin_PA23)
+
#define MICROPY_HW_APA102_MOSI (&pin_PA00)
#define MICROPY_HW_APA102_SCK (&pin_PA01)
diff --git a/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h
index 57078eaea..e1bef0019 100644
--- a/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h
@@ -5,6 +5,8 @@
// This is for Rev B which is green and has the SD card slot at the edge of the board.
+#define MICROPY_HW_LED_STATUS (&pin_PB01)
+
#define MICROPY_HW_LED_TX &(pin_PC30)
#define MICROPY_HW_LED_RX &(pin_PC31)
diff --git a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h
index 5869c01ff..1a570092b 100644
--- a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h
@@ -1,6 +1,7 @@
#define MICROPY_HW_BOARD_NAME "HalloWing M0 Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA23)
#define MICROPY_HW_NEOPIXEL (&pin_PA12)
#define SPI_FLASH_MOSI_PIN &pin_PB10
diff --git a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h
index 4de28d388..530e7e4c3 100644
--- a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit ItsyBitsy M0 Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
#define CIRCUITPY_BITBANG_APA102
#define MICROPY_HW_APA102_MOSI (&pin_PA01)
#define MICROPY_HW_APA102_SCK (&pin_PA00)
diff --git a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h
index 5bbfec9ce..f4d17ac64 100644
--- a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h
@@ -4,6 +4,8 @@
#define CIRCUITPY_MCU_FAMILY samd51
// This is for Rev B
+#define MICROPY_HW_LED_STATUS (&pin_PA22)
+
#define MICROPY_HW_APA102_MOSI (&pin_PB03)
#define MICROPY_HW_APA102_SCK (&pin_PB02)
diff --git a/ports/atmel-samd/boards/meowmeow/mpconfigboard.h b/ports/atmel-samd/boards/meowmeow/mpconfigboard.h
index f07eb9cce..fe741a0f7 100644
--- a/ports/atmel-samd/boards/meowmeow/mpconfigboard.h
+++ b/ports/atmel-samd/boards/meowmeow/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Meow Meow"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PB23)
+
// These are pins not to reset.
#define MICROPY_PORT_A (0)
#define MICROPY_PORT_B (0)
diff --git a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h
index f08d129dc..4835ee7d2 100644
--- a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h
@@ -1,6 +1,7 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Metro M0 Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_LED_TX &pin_PA27
// Comment this out if you have trouble connecting over SWD. It's one of the SWD pins.
#define MICROPY_HW_LED_RX &pin_PA31
diff --git a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h
index 06feb1a22..073468899 100644
--- a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h
@@ -8,6 +8,8 @@
#define MICROPY_HW_LED_TX (&pin_PA27)
#define MICROPY_HW_LED_RX (&pin_PB06)
+#define MICROPY_HW_LED_STATUS (&pin_PA16)
+
#define MICROPY_HW_NEOPIXEL (&pin_PB22)
// These are pins not to reset.
diff --git a/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h b/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h
index 338e8b7c9..cd754924e 100644
--- a/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h
+++ b/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h
@@ -3,6 +3,8 @@
#define CIRCUITPY_MCU_FAMILY samd51
+#define MICROPY_HW_LED_STATUS (&pin_PA15)
+
// RGB Status LED Pins
#define MICROPY_HW_APA102_MOSI (&pin_PB03)
#define MICROPY_HW_APA102_SCK (&pin_PB02)
diff --git a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h
index c311f540c..cef35983e 100644
--- a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h
+++ b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h
@@ -2,6 +2,8 @@
#define MICROPY_HW_MCU_NAME "samd21e18"
// Rev B - Black
+#define MICROPY_HW_LED_STATUS (&pin_PA10)
+
#define MICROPY_HW_APA102_MOSI (&pin_PA00)
#define MICROPY_HW_APA102_SCK (&pin_PA01)
diff --git a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h
index dfbd873b6..369d84b8b 100644
--- a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h
+++ b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h
@@ -2,6 +2,7 @@
#define MICROPY_HW_MCU_NAME "samd21e18"
// Rev B - Black
+#define MICROPY_HW_LED_STATUS (&pin_PA10)
// #define MICROPY_HW_APA102_MOSI (&pin_PA00)
// #define MICROPY_HW_APA102_SCK (&pin_PA01)
diff --git a/ports/atmel-samd/common-hal/nvm/ByteArray.c b/ports/atmel-samd/common-hal/nvm/ByteArray.c
index ab9cd7d80..12a127f53 100644
--- a/ports/atmel-samd/common-hal/nvm/ByteArray.c
+++ b/ports/atmel-samd/common-hal/nvm/ByteArray.c
@@ -28,6 +28,8 @@
#include "hal_flash.h"
+#include "supervisor/shared/stack.h"
+
#include <stdint.h>
#include <string.h>
@@ -42,6 +44,7 @@ bool common_hal_nvm_bytearray_set_bytes(nvm_bytearray_obj_t *self,
struct flash_descriptor desc;
desc.dev.hw = NVMCTRL;
flash_write(&desc, (uint32_t) self->start_address + start_index, values, len);
+ assert_heap_ok();
return true;
}
diff --git a/ports/atmel-samd/mpconfigport.h b/ports/atmel-samd/mpconfigport.h
index 8df56ec4e..4fc32157c 100644
--- a/ports/atmel-samd/mpconfigport.h
+++ b/ports/atmel-samd/mpconfigport.h
@@ -182,7 +182,7 @@ typedef long mp_off_t;
#define MICROPY_PY_SYS_PLATFORM "MicroChip SAMD51"
#define PORT_HEAP_SIZE (0x20000) // 128KiB
#define SPI_FLASH_MAX_BAUDRATE 24000000
-#define CIRCUITPY_DEFAULT_STACK_SIZE 8192
+#define CIRCUITPY_DEFAULT_STACK_SIZE 0x6000
#define MICROPY_CPYTHON_COMPAT (1)
#define MICROPY_MODULE_WEAK_LINKS (1)
#define MICROPY_PY_BUILTINS_NOTIMPLEMENTED (1)
@@ -432,10 +432,6 @@ extern const struct _mp_obj_module_t wiznet_module;
#define MP_STATE_PORT MP_STATE_VM
-void run_background_tasks(void);
-#define MICROPY_VM_HOOK_LOOP run_background_tasks();
-#define MICROPY_VM_HOOK_RETURN run_background_tasks();
-
#include "peripherals/samd/dma.h"
#include "supervisor/flash_root_pointers.h"
@@ -454,6 +450,11 @@ void run_background_tasks(void);
mp_obj_t gamepad_singleton; \
NETWORK_ROOT_POINTERS \
+void run_background_tasks(void);
+void run_background_vm_tasks(void);
+#define MICROPY_VM_HOOK_LOOP run_background_vm_tasks();
+#define MICROPY_VM_HOOK_RETURN run_background_vm_tasks();
+#define CIRCUITPY_SUPERVISOR_BACKGROUND run_background_tasks();
#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
#define CIRCUITPY_BOOT_OUTPUT_FILE "/boot_out.txt"
diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c
index 9f951b035..941838618 100644
--- a/ports/atmel-samd/supervisor/port.c
+++ b/ports/atmel-samd/supervisor/port.c
@@ -64,6 +64,9 @@
#include "reset.h"
#include "tick.h"
+#include "supervisor/shared/safe_mode.h"
+#include "supervisor/shared/stack.h"
+
#include "tusb.h"
#ifdef CIRCUITPY_GAMEPAD_TICKS
@@ -80,7 +83,7 @@ extern volatile bool mp_msc_enabled;
#define TRACE_BUFFER_SIZE (1 << (TRACE_BUFFER_MAGNITUDE_PACKETS + 1))
// Size in bytes. 4 bytes per uint32_t.
#define TRACE_BUFFER_SIZE_BYTES (TRACE_BUFFER_SIZE << 2)
-__attribute__((__aligned__(TRACE_BUFFER_SIZE_BYTES))) uint32_t mtb[TRACE_BUFFER_SIZE];
+__attribute__((__aligned__(TRACE_BUFFER_SIZE_BYTES))) uint32_t mtb[TRACE_BUFFER_SIZE] = {0};
#endif
safe_mode_t port_init(void) {
@@ -153,35 +156,6 @@ safe_mode_t port_init(void) {
samd_peripherals_enable_cache();
#endif
-// On power on start or external reset, set _ezero to the canary word. If it
-// gets killed, we boot in safe mode. _ezero is the boundary between statically
-// allocated memory including the fixed MicroPython heap and the stack. If either
-// misbehaves, the canary will not be intact after soft reset.
-#ifdef CIRCUITPY_CANARY_WORD
-#ifdef SAMD21
- bool power_on_or_external_reset = hri_pm_get_RCAUSE_POR_bit(PM) || hri_pm_get_RCAUSE_EXT_bit(PM);
- bool system_reset = hri_pm_get_RCAUSE_SYST_bit(PM);
-#endif
-#ifdef SAMD51
- bool power_on_or_external_reset = hri_rstc_get_RCAUSE_POR_bit(RSTC) || hri_rstc_get_RCAUSE_EXT_bit(RSTC);
- bool system_reset = hri_rstc_get_RCAUSE_SYST_bit(RSTC);
-#endif
- if (power_on_or_external_reset) {
- _ezero = CIRCUITPY_CANARY_WORD;
- } else if (system_reset) {
- // If we're starting from a system reset we're likely coming from the
- // bootloader or hard fault handler. If we're coming from the handler
- // the canary will be CIRCUITPY_SAFE_RESTART_WORD and we don't want to
- // revive the canary so that a second hard fault won't restart. Resets
- // from anywhere else are ok.
- if (_ezero == CIRCUITPY_SAFE_RESTART_WORD) {
- _ezero = ~CIRCUITPY_CANARY_WORD;
- } else {
- _ezero = CIRCUITPY_CANARY_WORD;
- }
- }
-#endif
-
#ifdef SAMD21
hri_nvmctrl_set_CTRLB_RWS_bf(NVMCTRL, 2);
_pm_init();
@@ -200,13 +174,6 @@ safe_mode_t port_init(void) {
// Init the board last so everything else is ready
board_init();
- #ifdef CIRCUITPY_CANARY_WORD
- // Run in safe mode if the canary is corrupt.
- if (_ezero != CIRCUITPY_CANARY_WORD) {
- return HARD_CRASH;
- }
- #endif
-
#ifdef SAMD21
if (PM->RCAUSE.bit.BOD33 == 1 || PM->RCAUSE.bit.BOD12 == 1) {
return BROWNOUT;
@@ -280,15 +247,33 @@ void reset_to_bootloader(void) {
reset();
}
+void reset_cpu(void) {
+ reset();
+}
+
+extern uint32_t _ebss;
+// Place the word to save just after our BSS section that gets blanked.
+void port_set_saved_word(uint32_t value) {
+ _ebss = value;
+}
+
+uint32_t port_get_saved_word(void) {
+ return _ebss;
+}
+
/**
* \brief Default interrupt handler for unused IRQs.
*/
__attribute__((used)) void HardFault_Handler(void)
{
+#ifdef ENABLE_MICRO_TRACE_BUFFER
+ // Turn off the micro trace buffer so we don't fill it up in the infinite
+ // loop below.
+ REG_MTB_MASTER = 0x00000000 + 6;
+#endif
+
+ reset_into_safe_mode(HARD_CRASH);
while (true) {
- asm("");
- }
- for (uint32_t i = 0; i < 100000; i++) {
- asm("noop;");
+ asm("nop;");
}
}
diff --git a/ports/esp8266/Makefile b/ports/esp8266/Makefile
index 69226f442..d38285c91 100644
--- a/ports/esp8266/Makefile
+++ b/ports/esp8266/Makefile
@@ -97,6 +97,7 @@ SRC_C = \
posix_helpers.c \
hspi.c \
boards/$(BOARD)/pins.c \
+ supervisor/stub/stack.c \
supervisor/shared/translate.c \
$(SRC_MOD)
diff --git a/ports/nrf/boards/feather_nrf52832/mpconfigboard.h b/ports/nrf/boards/feather_nrf52832/mpconfigboard.h
index e751ec182..4959e1ca9 100644
--- a/ports/nrf/boards/feather_nrf52832/mpconfigboard.h
+++ b/ports/nrf/boards/feather_nrf52832/mpconfigboard.h
@@ -28,6 +28,8 @@
#define MICROPY_HW_MCU_NAME "nRF52832"
#define MICROPY_PY_SYS_PLATFORM "nRF52"
+#define MICROPY_HW_LED_STATUS (&pin_P0_17)
+
#define MICROPY_HW_UART_RX NRF_GPIO_PIN_MAP(0, 8)
#define MICROPY_HW_UART_TX NRF_GPIO_PIN_MAP(0, 6)
diff --git a/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h b/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h
index bd1cad504..da72c085e 100644
--- a/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h
+++ b/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h
@@ -35,6 +35,8 @@
#define MICROPY_HW_NEOPIXEL (&pin_P0_16)
+#define MICROPY_HW_LED_STATUS (&pin_P1_15)
+
#ifdef QSPI_FLASH_FILESYSTEM
#define MICROPY_QSPI_DATA0 NRF_GPIO_PIN_MAP(0, 17)
#define MICROPY_QSPI_DATA1 NRF_GPIO_PIN_MAP(0, 22)
diff --git a/ports/nrf/boards/particle_argon/mpconfigboard.h b/ports/nrf/boards/particle_argon/mpconfigboard.h
index 4a5c1b0c8..bd9a46349 100644
--- a/ports/nrf/boards/particle_argon/mpconfigboard.h
+++ b/ports/nrf/boards/particle_argon/mpconfigboard.h
@@ -33,6 +33,8 @@
#define MICROPY_HW_MCU_NAME "nRF52840"
#define MICROPY_PY_SYS_PLATFORM "Particle Argon"
+#define MICROPY_HW_LED_STATUS (&pin_P1_12)
+
#define MICROPY_HW_RGB_LED_RED (&pin_P0_13)
#define MICROPY_HW_RGB_LED_GREEN (&pin_P0_14)
#define MICROPY_HW_RGB_LED_BLUE (&pin_P0_15)
diff --git a/ports/nrf/boards/particle_boron/mpconfigboard.h b/ports/nrf/boards/particle_boron/mpconfigboard.h
index ac5caee0f..ed675c811 100644
--- a/ports/nrf/boards/particle_boron/mpconfigboard.h
+++ b/ports/nrf/boards/particle_boron/mpconfigboard.h
@@ -33,6 +33,8 @@
#define MICROPY_HW_MCU_NAME "nRF52840"
#define MICROPY_PY_SYS_PLATFORM "Particle Boron"
+#define MICROPY_HW_LED_STATUS (&pin_P1_12)
+
#define MICROPY_HW_RGB_LED_RED (&pin_P0_13)
#define MICROPY_HW_RGB_LED_GREEN (&pin_P0_14)
#define MICROPY_HW_RGB_LED_BLUE (&pin_P0_15)
diff --git a/ports/nrf/boards/particle_xenon/mpconfigboard.h b/ports/nrf/boards/particle_xenon/mpconfigboard.h
index d3ce22327..0b119b8bf 100644
--- a/ports/nrf/boards/particle_xenon/mpconfigboard.h
+++ b/ports/nrf/boards/particle_xenon/mpconfigboard.h
@@ -33,6 +33,8 @@
#define MICROPY_HW_MCU_NAME "nRF52840"
#define MICROPY_PY_SYS_PLATFORM "Particle Xenon"
+#define MICROPY_HW_LED_STATUS (&pin_P1_12)
+
#define MICROPY_HW_RGB_LED_RED (&pin_P0_13)
#define MICROPY_HW_RGB_LED_GREEN (&pin_P0_14)
#define MICROPY_HW_RGB_LED_BLUE (&pin_P0_15)
diff --git a/ports/nrf/boards/pca10040/mpconfigboard.h b/ports/nrf/boards/pca10040/mpconfigboard.h
index ebf808ce2..396102832 100644
--- a/ports/nrf/boards/pca10040/mpconfigboard.h
+++ b/ports/nrf/boards/pca10040/mpconfigboard.h
@@ -29,6 +29,8 @@
#define MICROPY_HW_MCU_NAME "nRF52832"
#define MICROPY_PY_SYS_PLATFORM "nRF52-DK"
+#define MICROPY_HW_LED_STATUS (&pin_P0_17)
+
#define MICROPY_HW_UART_RX NRF_GPIO_PIN_MAP(0, 8)
#define MICROPY_HW_UART_TX NRF_GPIO_PIN_MAP(0, 6)
#define MICROPY_HW_UART_HWFC (0)
diff --git a/ports/nrf/boards/pca10040/pins.c b/ports/nrf/boards/pca10040/pins.c
index 9671358c9..95acd8ffd 100644
--- a/ports/nrf/boards/pca10040/pins.c
+++ b/ports/nrf/boards/pca10040/pins.c
@@ -21,9 +21,13 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_P0_15), MP_ROM_PTR(&pin_P0_15) },
{ MP_ROM_QSTR(MP_QSTR_P0_16), MP_ROM_PTR(&pin_P0_16) },
{ MP_ROM_QSTR(MP_QSTR_P0_17), MP_ROM_PTR(&pin_P0_17) },
+ { MP_ROM_QSTR(MP_QSTR_LED1), MP_ROM_PTR(&pin_P0_17) },
{ MP_ROM_QSTR(MP_QSTR_P0_18), MP_ROM_PTR(&pin_P0_18) },
+ { MP_ROM_QSTR(MP_QSTR_LED2), MP_ROM_PTR(&pin_P0_18) },
{ MP_ROM_QSTR(MP_QSTR_P0_19), MP_ROM_PTR(&pin_P0_19) },
+ { MP_ROM_QSTR(MP_QSTR_LED3), MP_ROM_PTR(&pin_P0_19) },
{ MP_ROM_QSTR(MP_QSTR_P0_20), MP_ROM_PTR(&pin_P0_20) },
+ { MP_ROM_QSTR(MP_QSTR_LED4), MP_ROM_PTR(&pin_P0_20) },
{ MP_ROM_QSTR(MP_QSTR_P0_21), MP_ROM_PTR(&pin_P0_21) },
{ MP_ROM_QSTR(MP_QSTR_P0_22), MP_ROM_PTR(&pin_P0_22) },
{ MP_ROM_QSTR(MP_QSTR_P0_23), MP_ROM_PTR(&pin_P0_23) },
diff --git a/ports/nrf/boards/pca10056/mpconfigboard.h b/ports/nrf/boards/pca10056/mpconfigboard.h
index 83c3f66c1..8d420721f 100644
--- a/ports/nrf/boards/pca10056/mpconfigboard.h
+++ b/ports/nrf/boards/pca10056/mpconfigboard.h
@@ -33,6 +33,8 @@
#define PORT_HEAP_SIZE (128 * 1024)
#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
+#define MICROPY_HW_LED_STATUS (&pin_P0_13)
+
#define DEFAULT_I2C_BUS_SCL (&pin_P0_27)
#define DEFAULT_I2C_BUS_SDA (&pin_P0_26)
diff --git a/ports/nrf/boards/pca10059/mpconfigboard.h b/ports/nrf/boards/pca10059/mpconfigboard.h
index b248011ec..03abd65e8 100644
--- a/ports/nrf/boards/pca10059/mpconfigboard.h
+++ b/ports/nrf/boards/pca10059/mpconfigboard.h
@@ -28,5 +28,7 @@
#define MICROPY_HW_MCU_NAME "nRF52840"
#define MICROPY_PY_SYS_PLATFORM "nRF52840-DK"
+#define MICROPY_HW_LED_STATUS (&pin_P0_06)
+
#define PORT_HEAP_SIZE (128 * 1024)
#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
diff --git a/ports/nrf/common-hal/neopixel_write/__init__.c b/ports/nrf/common-hal/neopixel_write/__init__.c
index c4cb194f3..c9da436b8 100644
--- a/ports/nrf/common-hal/neopixel_write/__init__.c
+++ b/ports/nrf/common-hal/neopixel_write/__init__.c
@@ -28,6 +28,8 @@
#include "shared-bindings/neopixel_write/__init__.h"
#include "nrf_pwm.h"
+#include "tick.h"
+
// https://github.com/adafruit/Adafruit_NeoPixel/blob/master/Adafruit_NeoPixel.cpp
// [[[Begin of the Neopixel NRF52 EasyDMA implementation
// by the Hackerspace San Salvador]]]
@@ -95,6 +97,9 @@ static NRF_PWM_Type* find_free_pwm (void) {
return NULL;
}
+uint64_t next_start_tick_ms = 0;
+uint32_t next_start_tick_us = 1000;
+
void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout, uint8_t *pixels, uint32_t numBytes) {
// To support both the SoftDevice + Neopixels we use the EasyDMA
// feature from the NRF25. However this technique implies to
@@ -117,7 +122,7 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
// only malloc if there is PWM device available
if ( pwm != NULL ) {
- if (numBytes == 4) {
+ if (pattern_size <= sizeof(one_pixel) * sizeof(uint32_t)) {
pixels_pattern = (uint16_t *) one_pixel;
} else {
pixels_pattern = (uint16_t *) m_malloc_maybe(pattern_size, false);
@@ -125,6 +130,9 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
}
}
+ // Wait to make sure we don't append onto the last transmission.
+ wait_until(next_start_tick_ms, next_start_tick_us);
+
// Use the identified device to choose the implementation
// If a PWM device is available use DMA
if ( (pixels_pattern != NULL) && (pwm != NULL) ) {
@@ -140,8 +148,8 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
}
// Zero padding to indicate the end of sequence
- pixels_pattern[++pos] = 0 | (0x8000); // Seq end
- pixels_pattern[++pos] = 0 | (0x8000); // Seq end
+ pixels_pattern[pos++] = 0 | (0x8000); // Seq end
+ pixels_pattern[pos++] = 0 | (0x8000); // Seq end
// Set the wave mode to count UP
// Set the PWM to use the 16MHz clock
@@ -274,4 +282,13 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
// Enable interrupts again
__enable_irq();
}
+
+ // Update the next start.
+ current_tick(&next_start_tick_ms, &next_start_tick_us);
+ if (next_start_tick_us < 100) {
+ next_start_tick_ms += 1;
+ next_start_tick_us = 100 - next_start_tick_us;
+ } else {
+ next_start_tick_us -= 100;
+ }
}
diff --git a/ports/nrf/peripherals/nrf/clocks.c b/ports/nrf/peripherals/nrf/clocks.c
index 811c0161a..4acb878db 100644
--- a/ports/nrf/peripherals/nrf/clocks.c
+++ b/ports/nrf/peripherals/nrf/clocks.c
@@ -32,4 +32,7 @@ void nrf_peripherals_clocks_init(void) {
// generalized.
NRF_CLOCK->LFCLKSRC = (uint32_t)((CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos) & CLOCK_LFCLKSRC_SRC_Msk);
NRF_CLOCK->TASKS_LFCLKSTART = 1UL;
+
+ // Wait for clocks to start.
+ while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) {}
}
diff --git a/ports/nrf/supervisor/port.c b/ports/nrf/supervisor/port.c
index fcb3ae55c..ece5bae29 100644
--- a/ports/nrf/supervisor/port.c
+++ b/ports/nrf/supervisor/port.c
@@ -28,6 +28,9 @@
#include "supervisor/port.h"
#include "boards/board.h"
+#include "nrfx/hal/nrf_power.h"
+#include "nrfx/drivers/include/nrfx_power.h"
+
#include "nrf/cache.h"
#include "nrf/clocks.h"
#include "nrf/power.h"
@@ -41,37 +44,34 @@
#include "common-hal/pulseio/PulseOut.h"
#include "tick.h"
-safe_mode_t port_init(void) {
+static void power_warning_handler(void) {
+ reset_into_safe_mode(BROWNOUT);
+}
+safe_mode_t port_init(void) {
nrf_peripherals_clocks_init();
// If GPIO voltage is set wrong in UICR, this will fix it, and
// will also do a reset to make the change take effect.
nrf_peripherals_power_init();
+ nrfx_power_pofwarn_config_t power_failure_config;
+ power_failure_config.handler = power_warning_handler;
+ power_failure_config.thr = NRF_POWER_POFTHR_V27;
+ #if NRF_POWER_HAS_VDDH
+ power_failure_config.thrvddh = NRF_POWER_POFTHRVDDH_V27;
+ #endif
+ nrfx_power_pof_init(&power_failure_config);
+ nrfx_power_pof_enable(&power_failure_config);
+
nrf_peripherals_enable_cache();
// Configure millisecond timer initialization.
tick_init();
-#if 0
- #ifdef CIRCUITPY_CANARY_WORD
- // Run in safe mode if the canary is corrupt.
- if (_ezero != CIRCUITPY_CANARY_WORD) {
- return HARD_CRASH;
- }
- #endif
-#endif
-
// Will do usb_init() if chip supports USB.
board_init();
-#if 0
- if (board_requests_safe_mode()) {
- return USER_SAFE_MODE;
- }
-#endif
-
return NO_SAFE_MODE;
}
@@ -93,13 +93,26 @@ void reset_to_bootloader(void) {
enum { DFU_MAGIC_SERIAL = 0x4e };
NRF_POWER->GPREGRET = DFU_MAGIC_SERIAL;
+ reset_cpu();
+}
+
+void reset_cpu(void) {
NVIC_SystemReset();
}
+extern uint32_t _ebss;
+// Place the word to save just after our BSS section that gets blanked.
+void port_set_saved_word(uint32_t value) {
+ _ebss = value;
+}
+
+uint32_t port_get_saved_word(void) {
+ return _ebss;
+}
-void HardFault_Handler(void)
-{
+void HardFault_Handler(void) {
+ reset_into_safe_mode(HARD_CRASH);
while (true) {
- asm("");
+ asm("nop;");
}
}
diff --git a/ports/unix/Makefile b/ports/unix/Makefile
index 79b203b6b..8775ec11a 100644
--- a/ports/unix/Makefile
+++ b/ports/unix/Makefile
@@ -149,6 +149,8 @@ SRC_C = \
alloc.c \
coverage.c \
fatfs_port.c \
+ supervisor/stub/serial.c \
+ supervisor/stub/stack.c \
supervisor/shared/translate.c \
$(SRC_MOD)