scripts: runner: pyocd: support DT-based flashing

Enable DT support in the pyOCD flasher, and turn it on in the build
system.

Signed-off-by: Marti Bolivar <marti@opensourcefoundries.com>
diff --git a/boards/common/pyocd.board.cmake b/boards/common/pyocd.board.cmake
index 9a2f45f..26b0cc5 100644
--- a/boards/common/pyocd.board.cmake
+++ b/boards/common/pyocd.board.cmake
@@ -1,3 +1,3 @@
 set_ifndef(BOARD_FLASH_RUNNER pyocd)
 set_ifndef(BOARD_DEBUG_RUNNER pyocd)
-board_finalize_runner_args(pyocd) # No default arguments to provide.
+board_finalize_runner_args(pyocd "--dt-flash=y")
diff --git a/scripts/support/runner/pyocd.py b/scripts/support/runner/pyocd.py
index cf17168..afc9d8d 100644
--- a/scripts/support/runner/pyocd.py
+++ b/scripts/support/runner/pyocd.py
@@ -6,8 +6,7 @@
 
 import os
 import sys
-
-from .core import ZephyrBinaryRunner
+from .core import ZephyrBinaryRunner, RunnerCaps, BuildConfiguration
 
 DEFAULT_PYOCD_GDB_PORT = 3333
 
@@ -15,7 +14,8 @@
 class PyOcdBinaryRunner(ZephyrBinaryRunner):
     '''Runner front-end for pyOCD.'''
 
-    def __init__(self, target, flashtool='pyocd-flashtool',
+    def __init__(self, target,
+                 flashtool='pyocd-flashtool', flash_addr=0x0,
                  gdb=None, gdbserver='pyocd-gdbserver',
                  gdb_port=DEFAULT_PYOCD_GDB_PORT, tui=False,
                  bin_name=None, elf_name=None,
@@ -24,6 +24,7 @@
 
         self.target_args = ['-t', target]
         self.flashtool = flashtool
+        self.flash_addr_args = ['-a', hex(flash_addr)] if flash_addr else []
         self.gdb_cmd = [gdb] if gdb is not None else None
         self.gdbserver = gdbserver
         self.gdb_port = gdb_port
@@ -46,6 +47,10 @@
         return 'pyocd'
 
     @classmethod
+    def capabilities(cls):
+        return RunnerCaps(flash_addr=True)
+
+    @classmethod
     def do_add_parser(cls, parser):
         parser.add_argument('--target', required=True,
                             help='target override')
@@ -77,8 +82,12 @@
                       file=sys.stderr)
                 args.daparg = daparg
 
+        build_conf = BuildConfiguration(os.getcwd())
+        flash_addr = cls.get_flash_address(args, build_conf)
+
         return PyOcdBinaryRunner(
-            args.target, flashtool=args.flashtool, gdb=args.gdb,
+            args.target, flashtool=args.flashtool,
+            flash_addr=flash_addr, gdb=args.gdb,
             gdbserver=args.gdbserver, gdb_port=args.gdb_port, tui=args.tui,
             bin_name=args.kernel_bin, elf_name=args.kernel_elf,
             board_id=args.board_id, daparg=args.daparg, debug=args.verbose)
@@ -97,6 +106,7 @@
             raise ValueError('Cannot flash; bin_name is missing')
 
         cmd = ([self.flashtool] +
+               self.flash_addr_args +
                self.daparg_args +
                self.target_args +
                self.board_args +