intel_s1000: scripts: Fix the runner script

This reverts commit bc7b1c595ed4090be6d80859a01a0bb372ae030c in
the zephyr main tree to fix the runner script and also does the
below modifications.
1) explicitly terminate processes.
2) implicitly call debugserver when debug is called.

Signed-off-by: Rajavardhan Gundi <rajavardhan.gundi@intel.com>
This commit is contained in:
Rajavardhan Gundi 2018-11-07 22:18:03 +05:30 committed by Marti Bolivar
parent f917b440bf
commit ab260c5f0e
1 changed files with 55 additions and 24 deletions

View File

@ -3,11 +3,11 @@
#
# SPDX-License-Identifier: Apache-2.0
'''Runner for debugging and flashing intel_s1000 devices'''
'''Runner for debugging and flashing Intel S1000 CRB'''
from os import path
import time
import subprocess
import signal
from west import log
from west.runners.core import ZephyrBinaryRunner
@ -15,7 +15,7 @@ DEFAULT_XT_GDB_PORT = 20000
class IntelS1000BinaryRunner(ZephyrBinaryRunner):
'''Runner front-end for Intel_s1000.'''
'''Runner front-end for Intel S1000.'''
def __init__(self, cfg, xt_ocd_dir,
ocd_topology, ocd_jtag_instr, gdb_flash_file,
@ -38,8 +38,8 @@ class IntelS1000BinaryRunner(ZephyrBinaryRunner):
def do_add_parser(cls, parser):
# Optional
parser.add_argument(
'--xt-ocd-dir', default='/opt/Tensilica/xocd-12.0.4/xt-ocd',
help='ocd-dir, defaults to /opt/Tensilica/xocd-12.0.4/xt-ocd')
'--xt-ocd-dir', default='/opt/tensilica/xocd-12.0.4/xt-ocd',
help='ocd-dir, defaults to /opt/tensilica/xocd-12.0.4/xt-ocd')
parser.add_argument(
'--ocd-topology', default='topology_dsp0_flyswatter2.xml',
help='ocd-topology, defaults to topology_dsp0_flyswatter2.xml')
@ -73,8 +73,7 @@ class IntelS1000BinaryRunner(ZephyrBinaryRunner):
elif command == 'debugserver':
self.debugserver(**kwargs)
else:
self.debugserver(**kwargs)
self.do_debug()
self.do_debug(**kwargs)
def flash(self, **kwargs):
topology_file = kwargs['ocd-topology']
@ -87,36 +86,66 @@ class IntelS1000BinaryRunner(ZephyrBinaryRunner):
'-I', jtag_instr_file]
# Start the server
# Note that XTOCD always fails the first time. It has to be
# relaunched the second time to work.
self.call(server_cmd)
# Note that XTOCD takes a few seconds to execute and always fails the
# first time. It has to be relaunched the second time to work.
server_proc = self.popen_ignore_int(server_cmd)
time.sleep(3)
time.sleep(6)
server_proc.terminate()
server_proc = self.popen_ignore_int(server_cmd)
time.sleep(6)
# Start the client, and wait for it to finish flashing the file.
# Start the client
gdb_cmd = [self.gdb_cmd, '-x', gdb_flash_file]
client_proc = self.popen_ignore_int(gdb_cmd)
client_proc.wait()
# Wait for 3 seconds (waiting for XTGDB to finish loading the image)
time.sleep(3)
# At this point, the ELF image is loaded and the program is in
# execution. Now we can quit the server (xt-ocd); it is not
# needed anymore. The loaded program (ELF) will continue to
# run.
# execution. Now we can quit the client (xt-gdb) and the server
# (xt-ocd) as they are not needed anymore. The loaded program
# (ELF) will continue to run though.
client_proc.terminate()
server_proc.terminate()
def do_debug(self):
def do_debug(self, **kwargs):
if self.elf_name is None:
raise ValueError('Cannot debug; elf is missing')
if self.gdb_cmd is None:
raise ValueError('Cannot debug; no gdb specified')
topology_file = kwargs['ocd-topology']
jtag_instr_file = kwargs['ocd-jtag-instr']
self.print_gdbserver_message(self.gdb_port)
server_cmd = [self.xt_ocd_dir,
'-c', topology_file,
'-I', jtag_instr_file]
# Start the server
# Note that XTOCD takes a few seconds to execute and always fails the
# first time. It has to be relaunched the second time to work.
server_proc = self.popen_ignore_int(server_cmd)
time.sleep(6)
server_proc.terminate()
server_proc = self.popen_ignore_int(server_cmd)
time.sleep(6)
gdb_cmd = [self.gdb_cmd,
'-ex', 'target remote :{}'.format(self.gdb_port),
self.elf_name]
gdb_proc = self.popen_ignore_int(gdb_cmd)
retcode = gdb_proc.wait()
if retcode:
raise subprocess.CalledProcessError((retcode, gdb_cmd))
# Start the client
# The below statement will consume the "^C" keypress ensuring
# the python main application doesn't exit. This is important
# since ^C in gdb means a "halt" operation.
previous = signal.signal(signal.SIGINT, signal.SIG_IGN)
try:
self.check_call(gdb_cmd)
finally:
signal.signal(signal.SIGINT, previous)
server_proc.terminate()
server_proc.wait()
def print_gdbserver_message(self, gdb_port):
log.inf('Intel S1000 GDB server running on port {}'.format(gdb_port))
@ -130,7 +159,9 @@ class IntelS1000BinaryRunner(ZephyrBinaryRunner):
'-c', topology_file,
'-I', jtag_instr_file]
# Note that XTOCD always fails the first time. It has to be
# relaunched the second time to work.
self.call(server_cmd)
# Note that XTOCD takes a few seconds to execute and always fails the
# first time. It has to be relaunched the second time to work.
server_proc = self.popen_ignore_int(server_cmd)
time.sleep(6)
server_proc.terminate()
self.check_call(server_cmd)