atmel-samd: Introduce board reset mechanic used on CircuitPlayground

Express to ensure the Neopixels are off after reloads.
This commit is contained in:
Scott Shawcroft 2017-06-16 15:40:15 -07:00
parent 3e23464b1e
commit a715bf6bac
10 changed files with 44 additions and 2 deletions

View File

@ -44,3 +44,6 @@ void board_init(void)
bool board_requests_safe_mode(void) {
return false;
}
void reset_board(void) {
}

View File

@ -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__

View File

@ -24,9 +24,14 @@
* THE SOFTWARE.
*/
#include <string.h>
#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);
}

View File

@ -33,3 +33,6 @@ void board_init(void)
bool board_requests_safe_mode(void) {
return false;
}
void reset_board(void) {
}

View File

@ -33,3 +33,6 @@ void board_init(void)
bool board_requests_safe_mode(void) {
return false;
}
void reset_board(void) {
}

View File

@ -33,3 +33,6 @@ void board_init(void)
bool board_requests_safe_mode(void) {
return false;
}
void reset_board(void) {
}

View File

@ -33,3 +33,6 @@ void board_init(void)
bool board_requests_safe_mode(void) {
return false;
}
void reset_board(void) {
}

View File

@ -44,3 +44,6 @@ void board_init(void)
bool board_requests_safe_mode(void) {
return false;
}
void reset_board(void) {
}

View File

@ -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) {
}

View File

@ -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;