diff --git a/makefiles/boards/sam0.inc.mk b/makefiles/boards/sam0.inc.mk
index 89a76ea42c1497bf97dc3f84b74ac4388b7e604a..ef7578e5288f7ea24ac74068375b21f2c9708c13 100644
--- a/makefiles/boards/sam0.inc.mk
+++ b/makefiles/boards/sam0.inc.mk
@@ -10,6 +10,7 @@ include $(RIOTMAKE)/tools/serial.inc.mk
 #   Usage: SERIAL="ATML..." BOARD=<board> make flash
 ifneq (,$(SERIAL))
     export OPENOCD_EXTRA_INIT += "-c cmsis_dap_serial $(SERIAL)"
+    EDBG_ARGS += "--serial $(SERIAL)"
     SERIAL_TTY = $(firstword $(shell $(RIOTBASE)/dist/tools/usb-serial/find-tty.sh $(SERIAL)))
     ifeq (,$(SERIAL_TTY))
         $(error Did not find a device with serial $(SERIAL))
@@ -17,5 +18,15 @@ ifneq (,$(SERIAL))
     PORT_LINUX := $(SERIAL_TTY)
 endif
 
-# this board uses openocd
+# set this to either openocd or edbg
+PROGRAMMER ?= edbg
+
+# use edbg if selected and a device type has been set
+ifeq ($(PROGRAMMER),edbg)
+  ifneq (,$(EDBG_DEVICE_TYPE))
+    include $(RIOTMAKE)/tools/edbg.inc.mk
+  endif
+endif
+
+# this board uses openocd for debug and possibly flashing
 include $(RIOTMAKE)/tools/openocd.inc.mk
diff --git a/makefiles/tools/edbg.inc.mk b/makefiles/tools/edbg.inc.mk
new file mode 100644
index 0000000000000000000000000000000000000000..353be21a90a0ad9ebf72a46aadab9cb03d0654d2
--- /dev/null
+++ b/makefiles/tools/edbg.inc.mk
@@ -0,0 +1,10 @@
+RIOT_EDBG = $(RIOTBASE)/dist/tools/edbg/edbg
+EDBG ?= $(RIOT_EDBG)
+FLASHER ?= $(EDBG)
+OFLAGS ?= -O binary
+HEXFILE = $(ELFFILE:.elf=.bin)
+FFLAGS ?= $(EDBG_ARGS) -t $(EDBG_DEVICE_TYPE) -b -e -v -p -f $(HEXFILE)
+
+ifeq ($(RIOT_EDBG),$(FLASHER))
+  FLASHDEPS += $(RIOT_EDBG)
+endif