1
0
mirror of https://github.com/ARM-software/workload-automation.git synced 2025-02-21 20:38:57 +00:00

daq: adding gpio_sync option.

When enabled, this wil cause the instrument to insert a marker into
ftrace, while at the same time setting a GPIO pin high.

For this to work, GPIO sysfs interface must be be enabed in the kernel
and the specified pin must be exported.
This commit is contained in:
Sergei Trofimov 2015-09-25 15:03:16 +01:00
parent f1d3ebc466
commit a6feb65b34

View File

@ -25,7 +25,8 @@ from collections import OrderedDict
from multiprocessing import Process, Queue from multiprocessing import Process, Queue
from wlauto import Instrument, Parameter from wlauto import Instrument, Parameter
from wlauto.exceptions import ConfigError, InstrumentError from wlauto.core import signal
from wlauto.exceptions import ConfigError, InstrumentError, DeviceError
from wlauto.utils.misc import ensure_directory_exists as _d from wlauto.utils.misc import ensure_directory_exists as _d
from wlauto.utils.types import list_of_ints, list_of_strs from wlauto.utils.types import list_of_ints, list_of_strs
@ -47,6 +48,10 @@ UNITS = {
} }
GPIO_ROOT = '/sys/class/gpio'
TRACE_MARKER_PATH = '/sys/kernel/debug/tracing/trace_marker'
class Daq(Instrument): class Daq(Instrument):
name = 'daq' name = 'daq'
@ -146,6 +151,13 @@ class Daq(Instrument):
:abs: take the absoulte value of negave samples :abs: take the absoulte value of negave samples
"""), """),
Parameter('gpio_sync', kind=int, constraint=lambda x: x > 0,
description="""
If specified, the instrument will simultaneously set the
specified GPIO pin high and put a marker into ftrace. This is
to facillitate syncing kernel trace events to DAQ power
trace.
"""),
] ]
def initialize(self, context): def initialize(self, context):
@ -153,6 +165,22 @@ class Daq(Instrument):
if status == daq.Status.OK and not devices: if status == daq.Status.OK and not devices:
raise InstrumentError('DAQ: server did not report any devices registered with the driver.') raise InstrumentError('DAQ: server did not report any devices registered with the driver.')
self._results = OrderedDict() self._results = OrderedDict()
self.gpio_path = None
if self.gpio_sync:
if not self.device.file_exists(GPIO_ROOT):
raise InstrumentError('GPIO sysfs not enabled on the device.')
try:
export_path = self.device.path.join(GPIO_ROOT, 'export')
self.device.set_sysfile_value(export_path, self.gpio_sync, verify=False)
pin_root = self.device.path.join(GPIO_ROOT, 'gpio{}'.format(self.gpio_sync))
direction_path = self.device.path.join(pin_root, 'direction')
self.device.set_sysfile_value(direction_path, 'out')
self.gpio_path = self.device.path.join(pin_root, 'value')
self.device.set_sysfile_value(self.gpio_path, 0, verify=False)
signal.connect(self.insert_start_marker, signal.BEFORE_WORKLOAD_EXECUTION, priority=11)
signal.connect(self.insert_stop_marker, signal.AFTER_WORKLOAD_EXECUTION, priority=11)
except DeviceError as e:
raise InstrumentError('Could not configure GPIO on device: {}'.format(e))
def setup(self, context): def setup(self, context):
self.logger.debug('Initialising session.') self.logger.debug('Initialising session.')
@ -216,6 +244,11 @@ class Daq(Instrument):
self.logger.debug('Terminating session.') self.logger.debug('Terminating session.')
self._execute_command('close') self._execute_command('close')
def finalize(self, context):
if self.gpio_path:
unexport_path = self.device.path.join(GPIO_ROOT, 'unexport')
self.device.set_sysfile_value(unexport_path, self.gpio_sync, verify=False)
def validate(self): def validate(self):
if not daq: if not daq:
raise ImportError(import_error_mesg) raise ImportError(import_error_mesg)
@ -255,6 +288,16 @@ class Daq(Instrument):
writer = csv.writer(fh) writer = csv.writer(fh)
writer.writerows(rows) writer.writerows(rows)
def insert_start_marker(self, context):
if self.gpio_path:
command = 'echo DAQ_START_MARKER > {}; echo 1 > {}'.format(TRACE_MARKER_PATH, self.gpio_path)
self.device.execute(command, as_root=self.device.is_rooted)
def insert_stop_marker(self, context):
if self.gpio_path:
command = 'echo DAQ_STOP_MARKER > {}; echo 0 > {}'.format(TRACE_MARKER_PATH, self.gpio_path)
self.device.execute(command, as_root=self.device.is_rooted)
def _execute_command(self, command, **kwargs): def _execute_command(self, command, **kwargs):
# pylint: disable=E1101 # pylint: disable=E1101
q = Queue() q = Queue()