diff --git a/.travis.yml b/.travis.yml index a30635cfb4a0f..3470ad9d89a1c 100755 --- a/.travis.yml +++ b/.travis.yml @@ -22,7 +22,7 @@ git: # just try to make the builds "about equal in run time" env: - TRAVIS_TESTS="unix docs translations website" TRAVIS_BOARDS="circuitplayground_express mini_sam_m4 grandcentral_m4_express pca10056 pca10059 feather_nrf52840_express makerdiary_nrf52840_mdk makerdiary_nrf52840_mdk_usb_dongle particle_boron particle_argon particle_xenon sparkfun_nrf52840_mini" TRAVIS_SDK=arm:nrf - - TRAVIS_BOARDS="metro_m0_express metro_m4_express pirkey_m0 trellis_m4_express trinket_m0 sparkfun_lumidrive sparkfun_redboard_turbo" TRAVIS_SDK=arm + - TRAVIS_BOARDS="metro_m0_express metro_m4_express pirkey_m0 trellis_m4_express trinket_m0 sparkfun_lumidrive sparkfun_redboard_turbo pybadge" TRAVIS_SDK=arm - TRAVIS_BOARDS="feather_radiofruit_zigbee gemma_m0 hallowing_m0_express itsybitsy_m0_express itsybitsy_m4_express meowmeow sam32" TRAVIS_SDK=arm - TRAVIS_BOARDS="feather_m0_express_crickit feather_m0_rfm69 feather_m0_rfm9x feather_m4_express arduino_zero arduino_mkr1300 arduino_mkrzero" TRAVIS_SDK=arm - TRAVIS_BOARDS="circuitplayground_express_crickit feather_m0_adalogger feather_m0_basic feather_m0_express catwan_usbstick pyportal sparkfun_samd21_mini sparkfun_samd21_dev" TRAVIS_SDK=arm diff --git a/locale/ID.po b/locale/ID.po index 0650438901c44..8961872a0c10a 100644 --- a/locale/ID.po +++ b/locale/ID.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-03-08 12:45-0800\n" +"POT-Creation-Date: 2019-03-12 11:17-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -289,6 +289,10 @@ msgstr "" msgid "Array values should be single bytes." msgstr "" +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" + #: main.c msgid "Auto-reload is off.\n" msgstr "Auto-reload tidak aktif.\n" diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index c0b460c0eb7d5..36975f9889f62 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-03-08 12:45-0800\n" +"POT-Creation-Date: 2019-03-12 11:17-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -287,6 +287,10 @@ msgstr "" msgid "Array values should be single bytes." msgstr "" +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" + #: main.c msgid "Auto-reload is off.\n" msgstr "" diff --git a/locale/de_DE.po b/locale/de_DE.po index b50899d7cd9aa..1a73ec7a2508e 100644 --- a/locale/de_DE.po +++ b/locale/de_DE.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-03-08 12:45-0800\n" +"POT-Creation-Date: 2019-03-12 11:17-0700\n" "PO-Revision-Date: 2018-07-27 11:55-0700\n" "Last-Translator: Pascal Deneaux\n" "Language-Team: Sebastian Plamauer, Pascal Deneaux\n" @@ -289,6 +289,10 @@ msgstr "Array muss Halbwörter enthalten (type 'H')" msgid "Array values should be single bytes." msgstr "Array-Werte sollten aus Einzelbytes bestehen." +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" + #: main.c msgid "Auto-reload is off.\n" msgstr "Automatisches Neuladen ist deaktiviert.\n" diff --git a/locale/en_US.po b/locale/en_US.po index f98f42eeb541a..52d4b73e8b0a6 100644 --- a/locale/en_US.po +++ b/locale/en_US.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-03-08 12:45-0800\n" +"POT-Creation-Date: 2019-03-12 11:17-0700\n" "PO-Revision-Date: 2018-07-27 11:55-0700\n" "Last-Translator: \n" "Language-Team: \n" @@ -287,6 +287,10 @@ msgstr "" msgid "Array values should be single bytes." msgstr "" +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" + #: main.c msgid "Auto-reload is off.\n" msgstr "" diff --git a/locale/en_x_pirate.po b/locale/en_x_pirate.po index 5382c93f250b8..6597d98bd8c9c 100644 --- a/locale/en_x_pirate.po +++ b/locale/en_x_pirate.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-03-08 12:45-0800\n" +"POT-Creation-Date: 2019-03-12 11:17-0700\n" "PO-Revision-Date: 2018-07-27 11:55-0700\n" "Last-Translator: \n" "Language-Team: @sommersoft, @MrCertainly\n" @@ -289,6 +289,10 @@ msgstr "" msgid "Array values should be single bytes." msgstr "" +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" + #: main.c msgid "Auto-reload is off.\n" msgstr "Auto-reload be off.\n" diff --git a/locale/es.po b/locale/es.po index 8c2b31c5a9974..a6749413d9cc0 100644 --- a/locale/es.po +++ b/locale/es.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-03-08 12:45-0800\n" +"POT-Creation-Date: 2019-03-12 11:17-0700\n" "PO-Revision-Date: 2018-08-24 22:56-0500\n" "Last-Translator: \n" "Language-Team: \n" @@ -294,6 +294,10 @@ msgstr "" msgid "Array values should be single bytes." msgstr "Valores del array deben ser bytes individuales." +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" + #: main.c msgid "Auto-reload is off.\n" msgstr "Auto-recarga deshabilitada.\n" diff --git a/locale/fil.po b/locale/fil.po index cb58f2be26963..2d9ce796b02c6 100644 --- a/locale/fil.po +++ b/locale/fil.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-03-08 12:45-0800\n" +"POT-Creation-Date: 2019-03-12 11:17-0700\n" "PO-Revision-Date: 2018-12-20 22:15-0800\n" "Last-Translator: Timothy \n" "Language-Team: fil\n" @@ -291,6 +291,10 @@ msgstr "May halfwords (type 'H') dapat ang array" msgid "Array values should be single bytes." msgstr "Array values ay dapat single bytes." +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" + #: main.c msgid "Auto-reload is off.\n" msgstr "Awtomatikong pag re-reload ay OFF.\n" diff --git a/locale/fr.po b/locale/fr.po index 11ca7a261f80d..eeab87b653a87 100644 --- a/locale/fr.po +++ b/locale/fr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-03-08 12:45-0800\n" +"POT-Creation-Date: 2019-03-12 11:17-0700\n" "PO-Revision-Date: 2018-12-23 20:05+0100\n" "Last-Translator: Pierrick Couturier \n" "Language-Team: fr\n" @@ -292,6 +292,10 @@ msgstr "Le tableau doit contenir des halfwords (type 'H')" msgid "Array values should be single bytes." msgstr "Les valeurs du tableau doivent être des octets simples 'bytes'." +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" + #: main.c msgid "Auto-reload is off.\n" msgstr "Auto-rechargement désactivé.\n" diff --git a/locale/it_IT.po b/locale/it_IT.po index b3e411cfd89ee..22bc8ed4be963 100644 --- a/locale/it_IT.po +++ b/locale/it_IT.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-03-08 12:45-0800\n" +"POT-Creation-Date: 2019-03-12 11:17-0700\n" "PO-Revision-Date: 2018-10-02 16:27+0200\n" "Last-Translator: Enrico Paganin \n" "Language-Team: \n" @@ -290,6 +290,10 @@ msgstr "" msgid "Array values should be single bytes." msgstr "" +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" + #: main.c msgid "Auto-reload is off.\n" msgstr "Auto-reload disattivato.\n" diff --git a/locale/pt_BR.po b/locale/pt_BR.po index 415bb0b4c3976..77e1beff654f7 100644 --- a/locale/pt_BR.po +++ b/locale/pt_BR.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-03-08 12:45-0800\n" +"POT-Creation-Date: 2019-03-12 11:17-0700\n" "PO-Revision-Date: 2018-10-02 21:14-0000\n" "Last-Translator: \n" "Language-Team: \n" @@ -290,6 +290,10 @@ msgstr "Array deve conter meias palavras (tipo 'H')" msgid "Array values should be single bytes." msgstr "" +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" + #: main.c msgid "Auto-reload is off.\n" msgstr "A atualização automática está desligada.\n" diff --git a/main.c b/main.c index f0913db6ee9aa..4b58b778d2232 100755 --- a/main.c +++ b/main.c @@ -139,8 +139,7 @@ void stop_mp(void) { MP_STATE_VM(vfs_cur) = vfs; #endif - // Run any finalizers before we stop using the heap. - gc_sweep_all(); + gc_deinit(); } #define STRING_LIST(...) {__VA_ARGS__, ""} diff --git a/mpy-cross/Makefile b/mpy-cross/Makefile index fb1ab1ffdc33c..42dbace9841aa 100644 --- a/mpy-cross/Makefile +++ b/mpy-cross/Makefile @@ -78,6 +78,7 @@ endif SRC_C = \ main.c \ gccollect.c \ + supervisor/stub/safe_mode.c \ supervisor/stub/stack.c \ supervisor/shared/translate.c diff --git a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk index efd45d0491574..b9643cb74b4fb 100644 --- a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk @@ -12,6 +12,8 @@ LONGINT_IMPL = MPZ CHIP_VARIANT = SAMD21G18A CHIP_FAMILY = samd21 +CFLAGS_INLINE_LIMIT = 70 + CIRCUITPY_NETWORK = 1 MICROPY_PY_WIZNET5K = 5500 diff --git a/ports/atmel-samd/boards/pybadge/board.c b/ports/atmel-samd/boards/pybadge/board.c new file mode 100644 index 0000000000000..0881d8f457844 --- /dev/null +++ b/ports/atmel-samd/boards/pybadge/board.c @@ -0,0 +1,111 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "boards/board.h" +#include "mpconfigboard.h" +#include "hal/include/hal_gpio.h" +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/displayio/FourWire.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" +#include "tick.h" + +displayio_fourwire_obj_t board_display_obj; + +#define DELAY 0x80 + +uint8_t display_init_sequence[] = { + 0x01, 0 | DELAY, 150, // SWRESET + 0x11, 0 | DELAY, 255, // SLPOUT + 0xb1, 3, 0x01, 0x2C, 0x2D, // _FRMCTR1 + 0xb2, 3, 0x01, 0x2C, 0x2D, // + 0xb3, 6, 0x01, 0x2C, 0x2D, 0x01, 0x2C, 0x2D, + 0xb4, 1, 0x07, // _INVCTR line inversion + 0xc0, 3, 0xa2, 0x02, 0x84, // _PWCTR1 GVDD = 4.7V, 1.0uA + 0xc1, 1, 0xc5, // _PWCTR2 VGH=14.7V, VGL=-7.35V + 0xc2, 2, 0x0a, 0x00, // _PWCTR3 Opamp current small, Boost frequency + 0xc3, 2, 0x8a, 0x2a, + 0xc4, 2, 0x8a, 0xee, + 0xc5, 1, 0x0e, // _VMCTR1 VCOMH = 4V, VOML = -1.1V + 0x2a, 0, // _INVOFF + 0x36, 1, 0x00, // _MADCTL top to bottom refresh in vsync aligned order. + // 1 clk cycle nonoverlap, 2 cycle gate rise, 3 sycle osc equalie, + // fix on VTL + 0x3a, 1, 0x05, // COLMOD - 16bit color + 0xe0, 16, 0x02, 0x1c, 0x07, 0x12, // _GMCTRP1 Gamma + 0x37, 0x32, 0x29, 0x2d, + 0x29, 0x25, 0x2B, 0x39, + 0x00, 0x01, 0x03, 0x10, + 0xe1, 16, 0x03, 0x1d, 0x07, 0x06, // _GMCTRN1 + 0x2E, 0x2C, 0x29, 0x2D, + 0x2E, 0x2E, 0x37, 0x3F, + 0x00, 0x00, 0x02, 0x10, + 0x2a, 3, 0x02, 0x00, 0x81, // _CASET XSTART = 2, XEND = 129 + 0x2b, 3, 0x02, 0x00, 0x81, // _RASET XSTART = 2, XEND = 129 + 0x13, 0 | DELAY, 10, // _NORON + 0x29, 0 | DELAY, 100, // _DISPON +}; + +STATIC busio_spi_obj_t display_spi_obj; + +void board_init(void) { + common_hal_busio_spi_construct(&display_spi_obj, &pin_PB13, &pin_PB12, NULL); + common_hal_busio_spi_never_reset(&display_spi_obj); + + displayio_fourwire_obj_t* bus = &displays[0].fourwire_bus; + bus->base.type = &displayio_fourwire_type; + common_hal_displayio_fourwire_construct(bus, + &display_spi_obj, + &pin_PB05, // TFT_DC Command or data + &pin_PB07, // TFT_CS Chip select + &pin_PA01); // TFT_RST Reset + + displayio_display_obj_t* display = &displays[0].display; + display->base.type = &displayio_display_type; + common_hal_displayio_display_construct(display, + bus, + 160, // Width + 128, // Height + 0, // column start + 0, // row start + 270, // rotation + 16, // Color depth + MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command + MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command + 0x37, // set vertical scroll command + display_init_sequence, + sizeof(display_init_sequence), + &pin_PA00); + common_hal_displayio_display_set_auto_brightness(display, true); +} + +bool board_requests_safe_mode(void) { + return false; +} + +void reset_board(void) { +} diff --git a/ports/atmel-samd/boards/pybadge/mpconfigboard.h b/ports/atmel-samd/boards/pybadge/mpconfigboard.h new file mode 100644 index 0000000000000..36115bc873378 --- /dev/null +++ b/ports/atmel-samd/boards/pybadge/mpconfigboard.h @@ -0,0 +1,37 @@ +#define MICROPY_HW_BOARD_NAME "Adafruit Pybadge" +#define MICROPY_HW_MCU_NAME "samd51j19" + +#define CIRCUITPY_MCU_FAMILY samd51 + +// This is for Rev B +#define MICROPY_HW_LED_STATUS (&pin_PA23) + +// These are pins not to reset. +// QSPI Data pins +#define MICROPY_PORT_A (PORT_PA08 | PORT_PA09 | PORT_PA10 | PORT_PA11) +// DotStar pins, QSPI CS, and QSPI SCK +#define MICROPY_PORT_B (PORT_PB10 | PORT_PB11) +#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) + +#define DEFAULT_SPI_BUS_SCK (&pin_PA17) +#define DEFAULT_SPI_BUS_MOSI (&pin_PB23) +#define DEFAULT_SPI_BUS_MISO (&pin_PB22) + +#define DEFAULT_UART_BUS_RX (&pin_PB17) +#define DEFAULT_UART_BUS_TX (&pin_PB16) + +// 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/pybadge/mpconfigboard.mk b/ports/atmel-samd/boards/pybadge/mpconfigboard.mk new file mode 100644 index 0000000000000..8ab759865607e --- /dev/null +++ b/ports/atmel-samd/boards/pybadge/mpconfigboard.mk @@ -0,0 +1,18 @@ +LD_FILE = boards/samd51x19-bootloader-external-flash.ld +USB_VID = 0x239A +USB_PID = 0x802C +USB_PRODUCT = "PyBadge" +USB_MANUFACTURER = "Adafruit Industries LLC" + +QSPI_FLASH_FILESYSTEM = 1 +EXTERNAL_FLASH_DEVICE_COUNT = 1 +EXTERNAL_FLASH_DEVICES = GD25Q64C +LONGINT_IMPL = MPZ + +# No I2S on SAMD51G +CIRCUITPY_AUDIOBUSIO = 0 +# No touch on SAMD51 yet +CIRCUITPY_TOUCHIO = 0 + +CHIP_VARIANT = SAMD51J19A +CHIP_FAMILY = samd51 diff --git a/ports/atmel-samd/boards/pybadge/pins.c b/ports/atmel-samd/boards/pybadge/pins.c new file mode 100644 index 0000000000000..41ab634c9e238 --- /dev/null +++ b/ports/atmel-samd/boards/pybadge/pins.c @@ -0,0 +1,42 @@ +#include "shared-bindings/board/__init__.h" + +#include "boards/board.h" +#include "supervisor/shared/board_busses.h" +#include "shared-module/displayio/__init__.h" + +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PB08) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PB09) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA04) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PA06) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PA16) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA18) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA19) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA20) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA21) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA22) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PA23) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_PA15) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_AVCC), MP_ROM_PTR(&pin_PA03) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LEFT_DAC), MP_ROM_PTR(&pin_PA02) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_RIGHT_DAC), MP_ROM_PTR(&pin_PA05) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA17) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_LITE), MP_ROM_PTR(&pin_PA00) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_MOSI), MP_ROM_PTR(&pin_PA12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_SCK), MP_ROM_PTR(&pin_PA13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_RST), MP_ROM_PTR(&pin_PA01) }, + { MP_ROM_QSTR(MP_QSTR_TFT_CS), MP_ROM_PTR(&pin_PB07) }, + { MP_ROM_QSTR(MP_QSTR_TFT_DC), MP_ROM_PTR(&pin_PB05) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)} +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table); diff --git a/ports/atmel-samd/common-hal/busio/SPI.c b/ports/atmel-samd/common-hal/busio/SPI.c index 8fb831a69a09d..ca58e3fd5c245 100644 --- a/ports/atmel-samd/common-hal/busio/SPI.c +++ b/ports/atmel-samd/common-hal/busio/SPI.c @@ -89,14 +89,16 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, Sercom* sercom = NULL; uint8_t sercom_index; uint32_t clock_pinmux = 0; - bool mosi_none = mosi == mp_const_none; - bool miso_none = miso == mp_const_none; + bool mosi_none = mosi == mp_const_none || mosi == NULL; + bool miso_none = miso == mp_const_none || miso == NULL; uint32_t mosi_pinmux = 0; uint32_t miso_pinmux = 0; uint8_t clock_pad = 0; uint8_t mosi_pad = 0; uint8_t miso_pad = 0; uint8_t dopo = 255; + + // Special case for SAMR boards. #ifdef PIN_PC19 if (miso == &pin_PC19) { if (mosi == &pin_PB30 && clock == &pin_PC18) { diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c index 8d25806b7e7d1..f8d830d8be4ba 100644 --- a/ports/atmel-samd/supervisor/port.c +++ b/ports/atmel-samd/supervisor/port.c @@ -171,6 +171,9 @@ safe_mode_t port_init(void) { init_shared_dma(); + // Reset everything into a known state before board_init. + reset_port(); + // Init the board last so everything else is ready board_init(); diff --git a/ports/unix/Makefile b/ports/unix/Makefile index 05b1fcaf8efb2..7ffa0fd082f09 100644 --- a/ports/unix/Makefile +++ b/ports/unix/Makefile @@ -150,6 +150,7 @@ SRC_C = \ coverage.c \ fatfs_port.c \ supervisor/stub/filesystem.c \ + supervisor/stub/safe_mode.c \ supervisor/stub/serial.c \ supervisor/stub/stack.c \ supervisor/shared/translate.c \ @@ -256,7 +257,7 @@ coverage: $(MAKE) \ COPT="-O0" CFLAGS_EXTRA='$(CFLAGS_EXTRA) -DMP_CONFIGFILE="" \ -fprofile-arcs -ftest-coverage \ - -Wdouble-promotion -Wformat -Wmissing-declarations -Wmissing-prototypes -Wsign-compare \ + -Wformat -Wmissing-declarations -Wmissing-prototypes -Wsign-compare \ -Wold-style-definition -Wpointer-arith -Wshadow -Wuninitialized -Wunused-parameter \ -DMICROPY_UNIX_COVERAGE' \ LDFLAGS_EXTRA='-fprofile-arcs -ftest-coverage' \ diff --git a/py/gc.c b/py/gc.c index 1f5cd8d017eea..81e609730e819 100755 --- a/py/gc.c +++ b/py/gc.c @@ -31,6 +31,8 @@ #include "py/gc.h" #include "py/runtime.h" +#include "supervisor/shared/safe_mode.h" + #if MICROPY_ENABLE_GC #if MICROPY_DEBUG_VERBOSE // print debugging info @@ -182,6 +184,13 @@ void gc_init(void *start, void *end) { DEBUG_printf(" pool at %p, length " UINT_FMT " bytes, " UINT_FMT " blocks\n", MP_STATE_MEM(gc_pool_start), gc_pool_block_len * BYTES_PER_BLOCK, gc_pool_block_len); } +void gc_deinit(void) { + // Run any finalizers before we stop using the heap. + gc_sweep_all(); + + MP_STATE_MEM(gc_pool_start) = 0; +} + void gc_lock(void) { GC_ENTER(); MP_STATE_MEM(gc_lock_depth)++; @@ -463,6 +472,10 @@ void *gc_alloc(size_t n_bytes, bool has_finaliser, bool long_lived) { return NULL; } + if (MP_STATE_MEM(gc_pool_start) == 0) { + reset_into_safe_mode(GC_ALLOC_OUTSIDE_VM); + } + GC_ENTER(); // check if GC is locked diff --git a/py/gc.h b/py/gc.h index 64f4b0d177d85..c05e006b4f8aa 100644 --- a/py/gc.h +++ b/py/gc.h @@ -32,6 +32,7 @@ #include "py/misc.h" void gc_init(void *start, void *end); +void gc_deinit(void); // These lock/unlock functions can be nested. // They can be used to prevent the GC from allocating/freeing. diff --git a/supervisor/shared/safe_mode.c b/supervisor/shared/safe_mode.c index c1ce1fc9c51e5..3bb75b8973fb3 100644 --- a/supervisor/shared/safe_mode.c +++ b/supervisor/shared/safe_mode.c @@ -105,7 +105,7 @@ void print_safe_mode_message(safe_mode_t reason) { if (reason != NO_SAFE_MODE) { serial_write("\r\n"); serial_write_compressed(translate("You are running in safe mode which means something unanticipated happened.\n")); - if (reason == HARD_CRASH || reason == MICROPY_NLR_JUMP_FAIL || reason == MICROPY_FATAL_ERROR) { + if (reason == HARD_CRASH || reason == MICROPY_NLR_JUMP_FAIL || reason == MICROPY_FATAL_ERROR || reason == GC_ALLOC_OUTSIDE_VM) { serial_write_compressed(translate("Looks like our core CircuitPython code crashed hard. Whoops!\nPlease file an issue at https://github.com/adafruit/circuitpython/issues\n with the contents of your CIRCUITPY drive and this message:\n")); if (reason == HARD_CRASH) { serial_write_compressed(translate("Crash into the HardFault_Handler.\n")); @@ -113,6 +113,8 @@ void print_safe_mode_message(safe_mode_t reason) { serial_write_compressed(translate("MicroPython NLR jump failed. Likely memory corruption.\n")); } else if (reason == MICROPY_FATAL_ERROR) { serial_write_compressed(translate("MicroPython fatal error.\n")); + } else if (reason == GC_ALLOC_OUTSIDE_VM) { + serial_write_compressed(translate("Attempted heap allocation when MicroPython VM not running.\n")); } } else if (reason == BROWNOUT) { serial_write_compressed(translate("The microcontroller's power dipped. Please make sure your power supply provides\nenough power for the whole circuit and press reset (after ejecting CIRCUITPY).\n")); diff --git a/supervisor/shared/safe_mode.h b/supervisor/shared/safe_mode.h index eba2668ac7a4d..59480b55b8c66 100644 --- a/supervisor/shared/safe_mode.h +++ b/supervisor/shared/safe_mode.h @@ -35,7 +35,8 @@ typedef enum { HEAP_OVERWRITTEN, MANUAL_SAFE_MODE, MICROPY_NLR_JUMP_FAIL, - MICROPY_FATAL_ERROR + MICROPY_FATAL_ERROR, + GC_ALLOC_OUTSIDE_VM } safe_mode_t; safe_mode_t wait_for_safe_mode_reset(void); diff --git a/supervisor/stub/safe_mode.c b/supervisor/stub/safe_mode.c new file mode 100644 index 0000000000000..1a792becd917e --- /dev/null +++ b/supervisor/stub/safe_mode.c @@ -0,0 +1,39 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/shared/safe_mode.h" + +safe_mode_t wait_for_safe_mode_reset(void) { + return NO_SAFE_MODE; +} + +void reset_into_safe_mode(safe_mode_t reason) { + (void) reason; +} + +void print_safe_mode_message(safe_mode_t reason) { + (void) reason; +}