107 lines
2.3 KiB
Python
Executable File
107 lines
2.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
"""
|
|
EEPROM dump parser
|
|
Supports Saleae Logic 2 format that has following columns:
|
|
- name
|
|
- type
|
|
- start_time
|
|
- duration
|
|
- ack
|
|
- address
|
|
- read
|
|
- data
|
|
"""
|
|
|
|
import sys
|
|
from collections import namedtuple
|
|
from dataclasses import dataclass
|
|
|
|
from IPython import embed
|
|
|
|
struct = namedtuple(
|
|
'struct',
|
|
[
|
|
'name',
|
|
'typ',
|
|
'start_time',
|
|
'duration',
|
|
'ack',
|
|
'address',
|
|
'read',
|
|
'data',
|
|
],
|
|
)
|
|
|
|
|
|
def load(fn) -> list[struct]:
|
|
l = []
|
|
with open(fn, 'r') as f:
|
|
f.readline()
|
|
for line in f.readlines():
|
|
values = line.replace('"', '').strip().split(',')
|
|
s = struct(*values)
|
|
l.append(s)
|
|
|
|
return l
|
|
|
|
|
|
def main():
|
|
@dataclass
|
|
class Chunk:
|
|
word_address: int
|
|
length: int
|
|
body: bytes
|
|
|
|
data = load(sys.argv[1])
|
|
chunks = []
|
|
|
|
di = iter(data)
|
|
|
|
while True:
|
|
try:
|
|
d = next(di)
|
|
if d.typ != 'start':
|
|
raise ValueError(f'unexpected type: {d.typ}, expected = start')
|
|
except StopIteration:
|
|
break
|
|
|
|
d = next(di)
|
|
if d.typ != 'address':
|
|
raise ValueError(f'unexpected type: {d.typ}, expected = address')
|
|
|
|
d1, d2 = next(di), next(di)
|
|
if d1.typ != 'data' or d2.typ != 'data':
|
|
raise ValueError(f'unexpected type: {d1.typ} and {d2.typ}, expected = data and data')
|
|
|
|
hi, lo = eval(d1.data), eval(d2.data)
|
|
|
|
d = next(di)
|
|
if d.typ != 'start':
|
|
raise ValueError(f'unexpected type: {d.typ}, expected = start')
|
|
|
|
d = next(di)
|
|
if d.typ != 'address':
|
|
raise ValueError(f'unexpected type: {d.typ}, expected = address')
|
|
|
|
body = []
|
|
while True:
|
|
d = next(di)
|
|
if d.typ == 'stop':
|
|
break
|
|
body.append(eval(d.data))
|
|
|
|
chunks.append(Chunk((hi << 8) + lo, len(body), bytes(body)))
|
|
|
|
with open(sys.argv[1] + '.bin', 'wb') as f:
|
|
for chunk in chunks:
|
|
f.write(chunk.body)
|
|
|
|
print('* Parse summary *')
|
|
for i, chunk in enumerate(chunks):
|
|
print(f'Chunk {i+1}: address={chunk.word_address}, length={chunk.length}')
|
|
print('Total length = {}'.format(sum(c.length for c in chunks)))
|
|
|
|
|
|
main()
|