summaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
authorNélio Laranjeiro2009-05-07 10:07:49 +0200
committerNélio Laranjeiro2009-05-07 10:07:49 +0200
commitee5a468417fb6810a5bbe4d46617618a9ddb588a (patch)
treea3e418380029b83494a77e4d94eac961faf7b76a /tools
parenteb2c866a65980de8c7447a72d91d9dea7d36ffbf (diff)
* 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.
Diffstat (limited to 'tools')
-rw-r--r--tools/trace/tinter/thost.py77
-rw-r--r--tools/trace/tinter/tinter.py31
-rw-r--r--tools/trace/tinter/utils.py15
-rw-r--r--tools/trace/trace.py11
4 files changed, 85 insertions, 49 deletions
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"