34 |
# |
# |
35 |
|
|
36 |
import string |
import string |
37 |
|
import re |
38 |
from xml.parsers import expat |
from xml.parsers import expat |
39 |
|
|
40 |
class Element: |
class Element: |
143 |
def CharacterData(self,data): |
def CharacterData(self,data): |
144 |
'SAX character data event handler' |
'SAX character data event handler' |
145 |
if string.strip(data): |
if string.strip(data): |
146 |
|
data = data.replace('&', '&') |
147 |
data = data.encode(Xml2Obj.encoding) |
data = data.encode(Xml2Obj.encoding) |
148 |
element = self.nodeStack[-1] |
element = self.nodeStack[-1] |
149 |
element.cdata += data |
element.cdata += data |
241 |
xsram_start, xsram_size) |
xsram_start, xsram_size) |
242 |
print ' </memory_sizes>' |
print ' </memory_sizes>' |
243 |
|
|
244 |
def dump_vectors (root): |
def dump_vectors (root, tradnames): |
245 |
"""Get the interupt vectors. |
"""Get the interupt vectors. |
246 |
""" |
""" |
247 |
|
|
248 |
path = [ 'AVRPART', 'INTERRUPT_VECTOR' ] |
path = [ 'AVRPART', 'INTERRUPT_VECTOR' ] |
249 |
|
|
250 |
irqs = root.getSubTree (path) |
irqs = root.getSubTree (path) |
253 |
|
|
254 |
vectors = [] |
vectors = [] |
255 |
for i in range (1, nvects+1): |
for i in range (1, nvects+1): |
256 |
vect = irqs.getElements ('VECTOR%d' % (i))[0] |
try: |
257 |
|
vect = irqs.getElements ('VECTOR%d' % (i))[0] |
258 |
|
except IndexError: |
259 |
|
# some devices have holes in the vector table =:-) |
260 |
|
vectors.append(()) |
261 |
|
continue |
262 |
|
|
263 |
name = vect.getElements ('SOURCE')[0].getData () |
name = vect.getElements ('SOURCE')[0].getData () |
264 |
saddr = vect.getElements ('PROGRAM_ADDRESS')[0].getData () |
saddr = vect.getElements ('PROGRAM_ADDRESS')[0].getData () |
275 |
nvects) |
nvects) |
276 |
n = 0 |
n = 0 |
277 |
for v in vectors: |
for v in vectors: |
278 |
print ' <vector addr="0x%04x" num="%d" name="%s">' % (v[0], n, v[1]) |
# we are not really interested in the reset vector |
279 |
print_wrapped (' ', '<description>%s</description>' % (v[2])) |
if n == 0: |
280 |
print ' <sig_name></sig_name>' |
n += 1 |
281 |
print ' </vector>' |
continue |
282 |
|
try: |
283 |
|
name = re.sub('[/,-]', '', v[1].upper()) |
284 |
|
name = re.sub(r'\s+', '_', name) |
285 |
|
if re.match('^[A-Z0-9_]+$', name): |
286 |
|
pass |
287 |
|
else: |
288 |
|
raise 'Invalid characters in vector name even after substitution', name |
289 |
|
|
290 |
|
print ' <vector addr="0x%04x" num="%d" name="%s">' % (v[0], n, v[1]) |
291 |
|
print_wrapped (' ', '<description>%s</description>' % (v[2])) |
292 |
|
print ' <sig_name>%s_vect</sig_name>' % name |
293 |
|
for altname in tradnames.Vecname(n): |
294 |
|
print ' <alt_name>%s</alt_name>' % altname |
295 |
|
print ' </vector>' |
296 |
|
except IndexError: |
297 |
|
# this catches holes in the vector table |
298 |
|
pass |
299 |
n += 1 |
n += 1 |
300 |
print ' </interrupts>' |
print ' </interrupts>' |
301 |
|
|
365 |
reg_desc = '' |
reg_desc = '' |
366 |
except KeyError: |
except KeyError: |
367 |
reg_info = None |
reg_info = None |
368 |
|
reg_desc = '' |
369 |
|
|
370 |
addr = ioreg.getElements ('IO_ADDR')[0].getData () |
addr = ioreg.getElements ('IO_ADDR')[0].getData () |
371 |
if addr[0] == '$': |
if addr[0] == '$': |
415 |
info = root.getSubTree (path) |
info = root.getSubTree (path) |
416 |
if info: |
if info: |
417 |
# The device has bootloader support. |
# The device has bootloader support. |
418 |
|
try: |
419 |
data = info.getElements ('NRWW_START_ADDR')[0].getData () |
data = info.getElements ('NRWW_START_ADDR')[0].getData () |
420 |
if data[0] == '$': |
if data[0] == '$': |
421 |
data = '0x' + data[1:] |
data = '0x' + data[1:] |
422 |
if data == 'x': |
if data == 'x': |
423 |
|
nrww_start = '' |
424 |
|
else: |
425 |
|
nrww_start = ' nrww_start="0x%x"' % (int (data, 16)) |
426 |
|
except IndexError: |
427 |
nrww_start = '' |
nrww_start = '' |
428 |
else: |
|
429 |
nrww_start = ' nrww_start="0x%x"' % (int (data, 16)) |
try: |
430 |
|
data = info.getElements ('NRWW_STOP_ADDR')[0].getData () |
431 |
data = info.getElements ('NRWW_STOP_ADDR')[0].getData () |
if data[0] == '$': |
432 |
if data[0] == '$': |
data = '0x' + data[1:] |
433 |
data = '0x' + data[1:] |
if data == 'x': |
434 |
if data == 'x': |
nrww_end = '' |
435 |
|
else: |
436 |
|
nrww_end = ' nrww_end="0x%x"' % (int (data, 16)) |
437 |
|
except IndexError: |
438 |
nrww_end = '' |
nrww_end = '' |
439 |
else: |
|
440 |
nrww_end = ' nrww_end="0x%x"' % (int (data, 16)) |
try: |
441 |
|
data = info.getElements ('RWW_START_ADDR')[0].getData () |
442 |
data = info.getElements ('RWW_START_ADDR')[0].getData () |
if data[0] == '$': |
443 |
if data[0] == '$': |
data = '0x' + data[1:] |
444 |
data = '0x' + data[1:] |
try: |
445 |
if data == 'x': |
rww_start = ' rww_start="0x%x"' % (int (data, 16)) |
446 |
|
except ValueError: |
447 |
|
rww_start = '' |
448 |
|
except IndexError: |
449 |
rww_start = '' |
rww_start = '' |
|
else: |
|
|
rww_start = ' rww_start="0x%x"' % (int (data, 16)) |
|
450 |
|
|
451 |
data = info.getElements ('RWW_STOP_ADDR')[0].getData () |
try: |
452 |
if data[0] == '$': |
data = info.getElements ('RWW_STOP_ADDR')[0].getData () |
453 |
data = '0x' + data[1:] |
if data[0] == '$': |
454 |
if data == 'x': |
data = '0x' + data[1:] |
455 |
|
try: |
456 |
|
rww_end = ' rww_end="0x%x"' % (int (data, 16)) |
457 |
|
except ValueError: |
458 |
|
rww_end = '' |
459 |
|
except IndexError: |
460 |
rww_end = '' |
rww_end = '' |
|
else: |
|
|
rww_end = ' rww_end="0x%x"' % (int (data, 16)) |
|
461 |
|
|
462 |
# The Atmel files give the pagesize in words, we need it in bytes. |
# The Atmel files give the pagesize in words, we need it in bytes. |
463 |
|
|
464 |
pagesize = 'pagesize="%d"' % ( \ |
pagesize = 'pagesize="%d"' % ( \ |
465 |
2 * int (info.getElements ('PAGESIZE')[0].getData ())) |
2 * int (info.getElements ('PAGESIZE')[0].getData ())) |
466 |
|
|
491 |
|
|
492 |
print ' </bootloader>' |
print ' </bootloader>' |
493 |
|
|
494 |
|
class HeaderToVec: |
495 |
|
'Parse header file for traditional vector names' |
496 |
|
|
497 |
|
def __init__(self): |
498 |
|
self.vects = {} |
499 |
|
|
500 |
|
def Read(self, fname): |
501 |
|
'Read header file' |
502 |
|
f = open(fname) |
503 |
|
r = re.compile(r'#\s*define\s+(SIG_[A-Z0-9_]+)\s+_VECTOR[(](\d+)[)]') |
504 |
|
for line in f: |
505 |
|
m = r.match(line) |
506 |
|
if m != None: |
507 |
|
intno = int(m.group(2)) |
508 |
|
try: |
509 |
|
x = self.vects[intno] |
510 |
|
except KeyError: |
511 |
|
x = [] |
512 |
|
x.append(m.group(1)) |
513 |
|
self.vects[intno] = x |
514 |
|
f.close() |
515 |
|
|
516 |
|
def Vecname(self, idx): |
517 |
|
try: |
518 |
|
return self.vects[idx] |
519 |
|
except KeyError: |
520 |
|
return '' |
521 |
|
|
522 |
|
|
523 |
if __name__ == '__main__': |
if __name__ == '__main__': |
524 |
import sys |
import sys |
525 |
|
|
526 |
parser = Xml2Obj() |
parser = Xml2Obj() |
527 |
root = parser.Parse(sys.argv[1]) |
root = parser.Parse(sys.argv[1]) |
528 |
|
|
529 |
|
tradheader = HeaderToVec() |
530 |
|
tradheader.Read(sys.argv[2]) |
531 |
|
|
532 |
dump_header (root) |
dump_header (root) |
533 |
dump_memory_sizes (root) |
dump_memory_sizes (root) |
534 |
dump_vectors (root) |
dump_vectors (root, tradheader) |
535 |
dump_ioregs (root) |
dump_ioregs (root) |
536 |
dump_boot_info (root) |
dump_boot_info (root) |
537 |
dump_footer (root) |
dump_footer (root) |