From ee5a468417fb6810a5bbe4d46617618a9ddb588a Mon Sep 17 00:00:00 2001 From: NĂ©lio Laranjeiro Date: Thu, 7 May 2009 10:07:49 +0200 Subject: * digital/avr/modules/trace: (See #67) * Adapted the trace module to: * Find the last trace in order to start the new one, trace_i = trace_i-1 + 1 * A quarter of the flash is completely erased on the trace init to be used in the future. * Removed the start code useless from now. * tools/trace: * Update the python scripts to use the new trace implementation. --- tools/trace/tinter/thost.py | 77 ++++++++++++++++++++++++-------------------- tools/trace/tinter/tinter.py | 31 ++++++++++++++++-- tools/trace/tinter/utils.py | 15 +++------ tools/trace/trace.py | 11 ++++++- 4 files changed, 85 insertions(+), 49 deletions(-) (limited to 'tools') diff --git a/tools/trace/tinter/thost.py b/tools/trace/tinter/thost.py index bbbdf0d0..885fbbb3 100644 --- a/tools/trace/tinter/thost.py +++ b/tools/trace/tinter/thost.py @@ -1,9 +1,11 @@ import serial import time +import sys from proto import * from utils import * FLASH_MEMORY_HIGH = 0x1fffff +FLASH_PAGE = 0x80000 FLASH_BUFFER_SIZE = 128 FLASH_CMD_INIT = 0 FLASH_CMD_READ = 1 @@ -19,54 +21,59 @@ class THost: 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 + self.__traces = [] def __dump_callback (self, *memory): """Callback call on each data reception""" for i in range(len (memory)): self.__memory.append (memory[i]) + sys.stderr.write (".") - def __flash_status (self, status): - """Get the flash status.""" - print "Flash activate : ", status - self.__status = status + def __trace_present (self, val): + """Get the trace value and the first byte following.""" + self.__traces.append (val) - 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 trace_list (self): + """Read the flash memory and return the addresses of the traces + present with the trace value in a array.""" + self.__proto.register ('r', 'B', self.__trace_present) + self.__proto.send ('l', 'b', FLASH_CMD_INIT) + self.__proto.send ('l', 4*'b', FLASH_CMD_READ, 0x0, 0x0, 0x0) + self.__proto.send ('l', 4*'b', FLASH_CMD_READ, 0x8, 0x0, 0x0) + self.__proto.send ('l', 4*'b', FLASH_CMD_READ, 0x10, 0x0, 0x0) + self.__proto.send ('l', 4*'b', FLASH_CMD_READ, 0x18, 0x0, 0x0) + self.__proto.wait (lambda: True) - def __flash_log_end (self, *addr): - """Get the flash log end address.""" - addr = reverse_tupple (addr) - self.__addr_end = get_size (addr, 3) + return self.__traces - def dump_memory(self): + def dump_memory(self, val): """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) + self.__proto.register ('r', FLASH_BUFFER_SIZE * 'B', + self.__dump_callback) + self.__proto.register ('r', 'B', self.__trace_present) - 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) + i = 0 + self.__traces.append (0x100) + while self.__traces[0] != val and i < FLASH_MEMORY_HIGH: + self.__traces = [] + addr = i >> 16 + self.__proto.send ('l', 4*'b', FLASH_CMD_READ, addr, 0, 0) self.__proto.wait (lambda: True) - else: - self.__memory = None + i += FLASH_PAGE + i -= FLASH_PAGE + + start_addr = i + end_addr = start_addr + FLASH_PAGE + print "Dump memory from address : " + hex(start_addr) + " to " + \ + hex(end_addr) + + for i in range (start_addr, end_addr, FLASH_BUFFER_SIZE): + self.__proto.send ('l', 'bI', FLASH_CMD_READ, (i << 8) | \ + FLASH_BUFFER_SIZE) + self.__proto.wait (lambda: True) + sys.stderr.write ("\nDump ended\n") def get_trace (self): """Return the traces dumped from the flash memory.""" - return reverse_tupple (self.__memory[4:len (self.__memory)]) + return self.__memory[1:] diff --git a/tools/trace/tinter/tinter.py b/tools/trace/tinter/tinter.py index 28197fd2..855f97da 100644 --- a/tools/trace/tinter/tinter.py +++ b/tools/trace/tinter/tinter.py @@ -25,6 +25,7 @@ class TInter: def __event_print (self, events, memory): if len(memory) > 0: cmd = get_size (memory, 2) + memory = memory[2:] if cmd < len(events): e = events[cmd] string = e.string_get() @@ -32,6 +33,7 @@ class TInter: p = e.param_get(i) size = p.length() val = get_size (memory, size) + memory = memory[size:] string = string.replace('%d', str(val), 1) if self.__file == None: @@ -43,12 +45,13 @@ class TInter: else: return None - def trace_print (self): - events = self.__events_get () + def __dump (self, val): + print "Dump trace ", val host = THost() - host.dump_memory() + host.dump_memory (val) memory = host.get_trace () + events = self.__events_get () if self.__outfile != None: self.__file = open (self.__outfile, 'w') self.__file.write ('APBTeam v1.0 Log interpretor\n') @@ -58,3 +61,25 @@ class TInter: if self.__file != None: self.__file.close () + + def available_traces (self): + host = THost() + traces = host.trace_list() + print "Traces available " + for i in traces: + print i + + def trace_print (self, trace_num = None): + events = self.__events_get () + host = THost() + + if trace_num: + traces = host.trace_list() + if traces.count (trace_num) >= 1: + self.__dump (trace_num) + else: + print "Trace not available." + else: + traces = host.trace_list() + val = max(traces) + self.__dump (val) diff --git a/tools/trace/tinter/utils.py b/tools/trace/tinter/utils.py index dd01eb5c..ee75559a 100644 --- a/tools/trace/tinter/utils.py +++ b/tools/trace/tinter/utils.py @@ -1,15 +1,10 @@ def get_size (mem, size): + table = mem[0:size] if size == 1: - return mem.pop() + return table[0] elif size == 2: - return ((mem.pop() << 8) | mem.pop()) + return ((table[0] << 8) | table[1]) elif size == 3: - return ((mem.pop() << 16) | (mem.pop() << 8) | mem.pop()) + return ((table[0] << 16) | (table[1] << 8) | table[2]) 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 + return ((table[0] << 24) | (table[1] << 16) | (table[2] << 8) | table[3]) diff --git a/tools/trace/trace.py b/tools/trace/trace.py index 6850a4cd..b41ef9ef 100644 --- a/tools/trace/trace.py +++ b/tools/trace/trace.py @@ -17,6 +17,10 @@ parser.add_option("-i", "--infile", dest="infile", help="Read the data from the file") parser.add_option("-t", "--type", dest="type", help="create to create the enumeration, inter to read the log from the flash.") +parser.add_option("-l", "--list", dest="list_trace", action="store_true", + help="List the number of the traces.") +parser.add_option("-n", "--num", type="int", dest="trace", + help="Dump the trace num provided, only used in inter mode.") [options, args] = parser.parse_args() @@ -25,6 +29,11 @@ if options.type == 'create': cre.create () elif options.type == "inter": inter = TInter (options.infile, options.outfile) - inter.trace_print() + if options.list_trace: + inter.available_traces () + elif options.trace: + inter.trace_print (options.trace) + else: + inter.trace_print() else: print "see the help\n python trace --help" -- cgit v1.2.3