blob: d6e3cac93dba001fc3b985166e401310582eac07 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright (c) 2016 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<link rel="import" href="/tracing/extras/importer/linux_perf/parser.html">
<script>
'use strict';
/**
* @fileoverview Parses i2c driver events in the Linux event trace format.
*/
tr.exportTo('tr.e.importer.linux_perf', function() {
var ColorScheme = tr.b.ColorScheme;
var Parser = tr.e.importer.linux_perf.Parser;
/**
* Parses linux i2c trace events.
* @constructor
*/
function I2cParser(importer) {
Parser.call(this, importer);
importer.registerEventHandler('i2c_write',
I2cParser.prototype.i2cWriteEvent.bind(this));
importer.registerEventHandler('i2c_read',
I2cParser.prototype.i2cReadEvent.bind(this));
importer.registerEventHandler('i2c_reply',
I2cParser.prototype.i2cReplyEvent.bind(this));
importer.registerEventHandler('i2c_result',
I2cParser.prototype.i2cResultEvent.bind(this));
}
// Matches the i2c_write and i2c_reply records
var i2cWriteReplyRE = new RegExp(
'i2c-(\\d+) #(\\d+) a=([\\da-fA-F]+) f=([\\da-fA-F]+) l=(\\d+) ' +
'(\\[[\\da-fA-F\\-]+\\])');
// Matches the i2c_read record
var i2cReadRE = /i2c-(\d+) #(\d+) a=([\da-fA-F]+) f=([\da-fA-F]+) l=(\d+)/;
// Matches the i2c_result record
var i2cResultRE = /i2c-(\d+) n=(\d+) ret=(\d+)/;
I2cParser.prototype = {
__proto__: Parser.prototype,
/**
* Parses i2c events and sets up state in the importer.
*/
i2cWriteEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
var event = i2cWriteReplyRE.exec(eventBase.details);
if (!event)
return false;
var adapterNumber = parseInt(event[1]);
var messageNumber = event[2];
var address = event[3];
var flags = event[4];
var dataLength = event[5];
var data = event[6];
var thread = this.importer.getOrCreatePseudoThread(
'i2c adapter ' + adapterNumber);
pushLastSliceIfNeeded(thread, event[1], ts);
thread.lastEntryTitle = 'i2c write';
thread.lastEntryTs = ts;
thread.lastEntryArgs = {
'Message number': messageNumber,
'Address': address,
'Flags': flags,
'Data Length': dataLength,
'Data': data
};
return true;
},
i2cReadEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
var event = i2cReadRE.exec(eventBase.details);
if (!event)
return false;
var adapterNumber = parseInt(event[1]);
var messageNumber = event[2];
var address = event[3];
var flags = event[4];
var dataLength = event[5];
var thread = this.importer.getOrCreatePseudoThread(
'i2c adapter ' + adapterNumber);
pushLastSliceIfNeeded(thread, event[1], ts);
thread.lastEntryTitle = 'i2c read';
thread.lastEntryTs = ts;
thread.lastEntryArgs = {
'Message number': messageNumber,
'Address': address,
'Flags': flags,
'Data Length': dataLength
};
return true;
},
i2cReplyEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
var event = i2cWriteReplyRE.exec(eventBase.details);
if (!event)
return false;
var adapterNumber = parseInt(event[1]);
var messageNumber = event[2];
var address = event[3];
var flags = event[4];
var dataLength = event[5];
var data = event[6];
var thread = this.importer.getOrCreatePseudoThread(
'i2c adapter ' + adapterNumber);
pushLastSliceIfNeeded(thread, event[1], ts);
thread.lastEntryTitle = 'i2c reply';
thread.lastEntryTs = ts;
thread.lastEntryArgs = {
'Message number': messageNumber,
'Address': address,
'Flags': flags,
'Data Length': dataLength,
'Data': data
};
return true;
},
i2cResultEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
var event = i2cResultRE.exec(eventBase.details);
if (!event)
return false;
var adapterNumber = parseInt(event[1]);
var numMessages = event[2];
var ret = event[3];
var thread = this.importer.getOrCreatePseudoThread(
'i2c adapter ' + adapterNumber);
var args = thread.lastEntryArgs;
if (args !== undefined) {
args['Number of messages'] = numMessages;
args['Return'] = ret;
}
pushLastSliceIfNeeded(thread, event[1], ts);
thread.lastEntryTitle = undefined;
thread.lastEntryTs = undefined;
thread.lastEntryArgs = undefined;
return true;
},
};
function pushLastSliceIfNeeded(thread, id, currentTs) {
if (thread.lastEntryTs !== undefined) {
var duration = currentTs - thread.lastEntryTs;
var slice = new tr.model.ThreadSlice(
'', thread.lastEntryTitle,
ColorScheme.getColorIdForGeneralPurposeString(id),
thread.lastEntryTs, thread.lastEntryArgs, duration);
thread.thread.sliceGroup.pushSlice(slice);
}
}
Parser.register(I2cParser);
return {
I2cParser: I2cParser
};
});
</script>