From cd628bcde6d86cac40be31993bac4338120d75ff Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Fri, 18 Jun 2021 09:29:09 +0200 Subject: [PATCH] nrf52840: add support for flashing with the BOSSA tool This only works with a custom bossac build from Arduino, not with the upstream version. It avoids needing the manual "double tap" to enter bootloader mode before flashing firmware. --- .../machine_nrf52840_usb_reset_bossa.go | 26 +++++++++++++++++++ .../machine_nrf52840_usb_reset_none.go | 2 +- targets/nano-33-ble.json | 2 +- 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 src/machine/machine_nrf52840_usb_reset_bossa.go diff --git a/src/machine/machine_nrf52840_usb_reset_bossa.go b/src/machine/machine_nrf52840_usb_reset_bossa.go new file mode 100644 index 00000000..42c6ad00 --- /dev/null +++ b/src/machine/machine_nrf52840_usb_reset_bossa.go @@ -0,0 +1,26 @@ +// +build nrf52840,nrf52840_reset_bossa + +package machine + +import ( + "device/arm" + "device/nrf" +) + +const DFU_MAGIC_SERIAL_ONLY_RESET = 0xb0 + +// checkShouldReset is called by the USB-CDC implementation to check whether to +// reset into the bootloader/OTA and if so, resets the chip appropriately. +func checkShouldReset() { + if usbLineInfo.dwDTERate == 1200 && usbLineInfo.lineState&usb_CDC_LINESTATE_DTR == 0 { + EnterSerialBootloader() + } +} + +// EnterSerialBootloader resets the chip into the serial bootloader. After +// reset, it can be flashed using serial/nrfutil. +func EnterSerialBootloader() { + arm.DisableInterrupts() + nrf.POWER.GPREGRET.Set(DFU_MAGIC_SERIAL_ONLY_RESET) + arm.SystemReset() +} diff --git a/src/machine/machine_nrf52840_usb_reset_none.go b/src/machine/machine_nrf52840_usb_reset_none.go index 08c615eb..796a021e 100644 --- a/src/machine/machine_nrf52840_usb_reset_none.go +++ b/src/machine/machine_nrf52840_usb_reset_none.go @@ -1,4 +1,4 @@ -// +build nrf52840,!nrf52840_reset_uf2 +// +build nrf52840,!nrf52840_reset_uf2,!nrf52840_reset_bossa package machine diff --git a/targets/nano-33-ble.json b/targets/nano-33-ble.json index 53b4fcac..df22221f 100644 --- a/targets/nano-33-ble.json +++ b/targets/nano-33-ble.json @@ -1,6 +1,6 @@ { "inherits": ["nrf52840"], - "build-tags": ["nano_33_ble"], + "build-tags": ["nano_33_ble", "nrf52840_reset_bossa"], "flash-command": "bossac_arduino2 -d -i -e -w -v -R --port={port} {bin}", "flash-1200-bps-reset": "true", "linkerscript": "targets/nano-33-ble.ld"