From a715bf6bac8b5a3316cf96181960a82d33aca31b Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Fri, 16 Jun 2017 15:40:15 -0700 Subject: [PATCH] atmel-samd: Introduce board reset mechanic used on CircuitPlayground Express to ensure the Neopixels are off after reloads. --- atmel-samd/boards/arduino_zero/board.c | 3 +++ atmel-samd/boards/board.h | 3 +++ .../boards/circuitplayground_express/board.c | 16 ++++++++++++++++ atmel-samd/boards/feather_m0_adalogger/board.c | 3 +++ atmel-samd/boards/feather_m0_basic/board.c | 3 +++ atmel-samd/boards/feather_m0_express/board.c | 3 +++ atmel-samd/boards/gemma_m0/board.c | 3 +++ atmel-samd/boards/metro_m0_express/board.c | 3 +++ atmel-samd/boards/trinket_m0/board.c | 6 ++++-- atmel-samd/main.c | 3 +++ 10 files changed, 44 insertions(+), 2 deletions(-) diff --git a/atmel-samd/boards/arduino_zero/board.c b/atmel-samd/boards/arduino_zero/board.c index 519e5db1a2..4192802742 100644 --- a/atmel-samd/boards/arduino_zero/board.c +++ b/atmel-samd/boards/arduino_zero/board.c @@ -44,3 +44,6 @@ void board_init(void) bool board_requests_safe_mode(void) { return false; } + +void reset_board(void) { +} diff --git a/atmel-samd/boards/board.h b/atmel-samd/boards/board.h index a5d96c5508..72f3563a94 100644 --- a/atmel-samd/boards/board.h +++ b/atmel-samd/boards/board.h @@ -39,4 +39,7 @@ void board_init(void); // way. bool board_requests_safe_mode(void); +// Reset the state of off MCU components such as neopixels. +void reset_board(void); + #endif // __MICROPY_INCLUDED_ATMEL_SAMD_BOARDS_BOARD_H__ diff --git a/atmel-samd/boards/circuitplayground_express/board.c b/atmel-samd/boards/circuitplayground_express/board.c index 9ed56d952d..3b7ccff463 100644 --- a/atmel-samd/boards/circuitplayground_express/board.c +++ b/atmel-samd/boards/circuitplayground_express/board.c @@ -24,9 +24,14 @@ * THE SOFTWARE. */ +#include + #include "boards/board.h" #include "asf/sam0/drivers/port/port.h" #include "common-hal/microcontroller/Pin.h" +#include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/neopixel_write/__init__.h" +#include "samd21_pins.h" void board_init(void) { @@ -47,3 +52,14 @@ bool board_requests_safe_mode(void) { reset_pin(PIN_PA28); return safe_mode; } + +void reset_board(void) { + uint8_t empty[30]; + memset(empty, 0, 30); + digitalio_digitalinout_obj_t neopixel_pin; + common_hal_digitalio_digitalinout_construct(&neopixel_pin, &pin_PB23); + common_hal_digitalio_digitalinout_switch_to_output(&neopixel_pin, false, + DRIVE_MODE_PUSH_PULL); + common_hal_neopixel_write(&neopixel_pin, empty, 30); + common_hal_digitalio_digitalinout_deinit(&neopixel_pin); +} diff --git a/atmel-samd/boards/feather_m0_adalogger/board.c b/atmel-samd/boards/feather_m0_adalogger/board.c index 06e67e11cc..1ecbe167cf 100644 --- a/atmel-samd/boards/feather_m0_adalogger/board.c +++ b/atmel-samd/boards/feather_m0_adalogger/board.c @@ -33,3 +33,6 @@ void board_init(void) bool board_requests_safe_mode(void) { return false; } + +void reset_board(void) { +} diff --git a/atmel-samd/boards/feather_m0_basic/board.c b/atmel-samd/boards/feather_m0_basic/board.c index 06e67e11cc..1ecbe167cf 100644 --- a/atmel-samd/boards/feather_m0_basic/board.c +++ b/atmel-samd/boards/feather_m0_basic/board.c @@ -33,3 +33,6 @@ void board_init(void) bool board_requests_safe_mode(void) { return false; } + +void reset_board(void) { +} diff --git a/atmel-samd/boards/feather_m0_express/board.c b/atmel-samd/boards/feather_m0_express/board.c index 06e67e11cc..1ecbe167cf 100644 --- a/atmel-samd/boards/feather_m0_express/board.c +++ b/atmel-samd/boards/feather_m0_express/board.c @@ -33,3 +33,6 @@ void board_init(void) bool board_requests_safe_mode(void) { return false; } + +void reset_board(void) { +} diff --git a/atmel-samd/boards/gemma_m0/board.c b/atmel-samd/boards/gemma_m0/board.c index 06e67e11cc..1ecbe167cf 100644 --- a/atmel-samd/boards/gemma_m0/board.c +++ b/atmel-samd/boards/gemma_m0/board.c @@ -33,3 +33,6 @@ void board_init(void) bool board_requests_safe_mode(void) { return false; } + +void reset_board(void) { +} diff --git a/atmel-samd/boards/metro_m0_express/board.c b/atmel-samd/boards/metro_m0_express/board.c index 519e5db1a2..4192802742 100644 --- a/atmel-samd/boards/metro_m0_express/board.c +++ b/atmel-samd/boards/metro_m0_express/board.c @@ -44,3 +44,6 @@ void board_init(void) bool board_requests_safe_mode(void) { return false; } + +void reset_board(void) { +} diff --git a/atmel-samd/boards/trinket_m0/board.c b/atmel-samd/boards/trinket_m0/board.c index 06e67e11cc..2214631460 100644 --- a/atmel-samd/boards/trinket_m0/board.c +++ b/atmel-samd/boards/trinket_m0/board.c @@ -26,10 +26,12 @@ #include "boards/board.h" -void board_init(void) -{ +void board_init(void) { } bool board_requests_safe_mode(void) { return false; } + +void reset_board(void) { +} diff --git a/atmel-samd/main.c b/atmel-samd/main.c index aaffcf90ea..563237a3c0 100644 --- a/atmel-samd/main.c +++ b/atmel-samd/main.c @@ -594,6 +594,7 @@ int main(void) { // Reset everything and prep MicroPython to run boot.py. reset_samd21(); + reset_board(); reset_mp(); // Turn on autoreload by default but before boot.py in case it wants to change it. @@ -656,6 +657,7 @@ int main(void) { autoreload_enable(); } reset_samd21(); + reset_board(); reset_mp(); } if (exit_code == PYEXEC_FORCED_EXIT) { @@ -665,6 +667,7 @@ int main(void) { first_run = false; skip_repl = start_mp(safe_mode); reset_samd21(); + reset_board(); reset_mp(); } else if (exit_code != 0) { break;