diff --git a/boards/common/samd21-arduino-bootloader/Makefile b/boards/common/samd21-arduino-bootloader/Makefile new file mode 100644 index 0000000000..7b62d52544 --- /dev/null +++ b/boards/common/samd21-arduino-bootloader/Makefile @@ -0,0 +1,3 @@ +MODULE = boards_common_samd21-arduino-bootloader + +include $(RIOTBASE)/Makefile.base diff --git a/boards/common/samd21-arduino-bootloader/Makefile.dep b/boards/common/samd21-arduino-bootloader/Makefile.dep new file mode 100644 index 0000000000..13b7258073 --- /dev/null +++ b/boards/common/samd21-arduino-bootloader/Makefile.dep @@ -0,0 +1,13 @@ +# Provide stdio over USB by default +# This is a temporary solution until management of stdio is correctly +# handled by the build system +DEFAULT_MODULE += stdio_cdc_acm + +# Default auto-initialization of usbus for stdio other USB +USEMODULE += auto_init_usbus + +# This boards requires support for Arduino bootloader. +USEMODULE += usb_board_reset +USEMODULE += boards_common_samd21-arduino-bootloader + +FEATURES_REQUIRED += bootloader_arduino diff --git a/boards/common/samd21-arduino-bootloader/Makefile.include b/boards/common/samd21-arduino-bootloader/Makefile.include new file mode 100644 index 0000000000..cbc6d0fba0 --- /dev/null +++ b/boards/common/samd21-arduino-bootloader/Makefile.include @@ -0,0 +1,31 @@ +# setup the flash tool used +# Bossa is the default programmer +PROGRAMMER ?= bossa + +ifeq ($(PROGRAMMER),bossa) + # by default, we use BOSSA to flash this board and take into account the + # preinstalled Arduino bootloader. ROM_OFFSET skips the space taken by + # such bootloader. + ROM_OFFSET ?= 0x2000 + BOSSA_ARDUINO_PREFLASH = yes + PREFLASH_DELAY = 1 + + ifneq (,$(filter reset flash flash-only, $(MAKECMDGOALS))) + # By default, add 2 seconds delay before opening terminal: this is required + # when opening the terminal right after flashing. In this case, the stdio + # over USB needs some time after reset before being ready. + TERM_DELAY ?= 2 + TERMDEPS += term-delay + endif + + include $(RIOTMAKE)/tools/bossa.inc.mk +endif + +term-delay: + sleep $(TERM_DELAY) + +TESTRUNNER_CONNECT_DELAY ?= $(TERM_DELAY) +$(call target-export-variables,test,TESTRUNNER_CONNECT_DELAY) + +# Add the samd21-arduino-bootloader directory to the build +DIRS += $(RIOTBOARD)/common/samd21-arduino-bootloader diff --git a/boards/common/samd21-arduino-bootloader/reset.c b/boards/common/samd21-arduino-bootloader/reset.c new file mode 100644 index 0000000000..ced63c7953 --- /dev/null +++ b/boards/common/samd21-arduino-bootloader/reset.c @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2019 Inria + * 2019 Kees Bakker, SODAQ + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup boards_common + * @{ + * @file + * @brief Board common implementations for managing an Arduino bootloader + * + * @author Alexandre Abadie + * @author Kees Bakker + * + * @} + */ + +#define USB_H_USER_IS_RIOT_INTERNAL + +#include "usb_board_reset.h" + + +#define SAMD21_DOUBLE_TAP_ADDR (0x20007FFCUL) +#define SAMD21_DOUBLE_TAP_MAGIC_NUMBER (0x07738135UL) + +void usb_board_reset_in_bootloader(void) +{ + /* The Arduino bootloader checks for a magic number in SRAM to remain in + bootloader mode. + See + https://github.com/arduino/ArduinoCore-samd/blob/master/bootloaders/zero/board_definitions_arduino_mkr1000.h#L38 + and + https://github.com/arduino/ArduinoCore-samd/blob/master/bootloaders/zero/main.c#L94 + for implementation details. */ + uint32_t *reset_addr = (uint32_t *)SAMD21_DOUBLE_TAP_ADDR; + *reset_addr = (uint32_t)SAMD21_DOUBLE_TAP_MAGIC_NUMBER; + + usb_board_reset_in_application(); +}