From da91bb6d1ec2edda204eb50bb1ec6a0e00a4d557 Mon Sep 17 00:00:00 2001 From: NĂ©lio Laranjeiro Date: Fri, 6 Mar 2009 22:57:57 +0100 Subject: tools/trace: Ended the interpretor part of the trace tool. --- tools/trace/tinter/thost.py | 74 ++++++++++++++++++++++++++++++++++++++++++-- tools/trace/tinter/tinter.py | 62 ++++++++++++++++++------------------- tools/trace/tinter/utils.py | 15 +++++++++ 3 files changed, 117 insertions(+), 34 deletions(-) create mode 100644 tools/trace/tinter/utils.py (limited to 'tools/trace/tinter') diff --git a/tools/trace/tinter/thost.py b/tools/trace/tinter/thost.py index 5608874c..bbbdf0d0 100644 --- a/tools/trace/tinter/thost.py +++ b/tools/trace/tinter/thost.py @@ -1,2 +1,72 @@ -def thost_dump_memory(): - return "000000000100000002000301000000020000000300040200FEDA0056789A" +import serial +import time +from proto import * +from utils import * + +FLASH_MEMORY_HIGH = 0x1fffff +FLASH_BUFFER_SIZE = 128 +FLASH_CMD_INIT = 0 +FLASH_CMD_READ = 1 + +def flash_memory_addr (val): + return (val & FLASH_MEMORY_HIGH) + +def log (x): + print x + +class THost: + """Class to connect to the flash memory.""" + def __init__(self): + self.__proto = Proto (serial.Serial ('/dev/ttyACM0'), time.time, 0.1) + self.__memory = list() + self.__status = False + self.__addr_init = 0 + self.__addr_end = 0 + + def __dump_callback (self, *memory): + """Callback call on each data reception""" + for i in range(len (memory)): + self.__memory.append (memory[i]) + + def __flash_status (self, status): + """Get the flash status.""" + print "Flash activate : ", status + self.__status = status + + def __flash_log_init (self, *addr): + """Get the flash log start address.""" + # Don't request the code start + addr = reverse_tupple (addr) + self.__addr_init = get_size (addr, 3) + + def __flash_log_end (self, *addr): + """Get the flash log end address.""" + addr = reverse_tupple (addr) + self.__addr_end = get_size (addr, 3) + + def dump_memory(self): + """Dump the flash memory.""" + # Initialise the flash access. + self.__proto.register ('r', FLASH_BUFFER_SIZE * 'B', self.__dump_callback) + self.__proto.register ('s', 'b', self.__flash_status) + self.__proto.register ('i', 3*'B', self.__flash_log_init) + self.__proto.register ('e', 3*'B', self.__flash_log_end) + print "Callback registered" + print "Initialise the Flash memory" + self.__proto.send ('l', 'b', FLASH_CMD_INIT) + self.__proto.wait (lambda: True) + + if self.__status == True: + print "Dumping from " + str (self.__addr_init) + " to " + str (self.__addr_end) + + i = self.__addr_init + while i != self.__addr_end: + self.__proto.send ('l', 'bI', FLASH_CMD_READ, (i << 8) | FLASH_BUFFER_SIZE) + i = flash_memory_addr (i + FLASH_BUFFER_SIZE) + self.__proto.wait (lambda: True) + else: + self.__memory = None + + def get_trace (self): + """Return the traces dumped from the flash memory.""" + return reverse_tupple (self.__memory[4:len (self.__memory)]) diff --git a/tools/trace/tinter/tinter.py b/tools/trace/tinter/tinter.py index ecf99696..28197fd2 100644 --- a/tools/trace/tinter/tinter.py +++ b/tools/trace/tinter/tinter.py @@ -1,16 +1,20 @@ import sys from thost import * +from utils import * try: from lib.parser import * except: print "--> You should run yapps on lib/parser.g" + class TInter: - def __init__(self, infile): + def __init__(self, infile, outfile): self.__infile = infile self.__events = None + self.__outfile = outfile + self.__file = None def __events_get (self): infile = open (self.__infile, 'r') @@ -20,43 +24,37 @@ class TInter: def __event_print (self, events, memory): if len(memory) > 0: - cmd = int (memory[0:2], 16) - if cmd < len(events) - 1: + cmd = get_size (memory, 2) + if cmd < len(events): e = events[cmd] string = e.string_get() - memory = memory[2:len(memory)] for i in range (0, e.param_nb()): p = e.param_get(i) - size = p.length() * 2 - val = memory[0:size] - memory = memory[size:len(memory)] - string = string.replace('%d', str(int(val, 16)), 1) - return [memory, string] + size = p.length() + val = get_size (memory, size) + string = string.replace('%d', str(val), 1) + + if self.__file == None: + print string[1:len(string)-1] + else: + self.__file.write (string[1:len(string)-1] + "\n") + + return memory else: return None - def __get_last_trace (self, data): - while len (data): - memory = data.split('f33ff22f') - memory = memory[len(memory) - 1] - return memory - - def trace_print (self, file=None): + def trace_print (self): events = self.__events_get () + host = THost() + host.dump_memory() + memory = host.get_trace () - if file == None: - memory = thost_dump_memory() - else: - file = open (file, 'r') - memory = file.read() - file.close() - memory = self.__get_last_trace (memory) - - while len(memory) > 0: - data = self.__event_print(events, memory) - if data != None: - string = data[1] - memory = data[0] - print string[1:len(string)-1] - else: - memory = "" + if self.__outfile != None: + self.__file = open (self.__outfile, 'w') + self.__file.write ('APBTeam v1.0 Log interpretor\n') + + while memory != None: + memory = self.__event_print(events, memory) + + if self.__file != None: + self.__file.close () diff --git a/tools/trace/tinter/utils.py b/tools/trace/tinter/utils.py new file mode 100644 index 00000000..dd01eb5c --- /dev/null +++ b/tools/trace/tinter/utils.py @@ -0,0 +1,15 @@ +def get_size (mem, size): + if size == 1: + return mem.pop() + elif size == 2: + return ((mem.pop() << 8) | mem.pop()) + elif size == 3: + return ((mem.pop() << 16) | (mem.pop() << 8) | mem.pop()) + elif size == 4: + return ((mem.pop() << 24) | (mem.pop() << 16) | (mem.pop() << 8) | mem.pop()) + +def reverse_tupple (tupple): + mem = [] + for i in tupple: + mem = [i] + mem + return mem -- cgit v1.2.3