Applying some good recommendations from Bruce Barnett
[goodfet] / client / goodfet.i2ceeprom
1 #!/usr/bin/env python
2
3 #GoodFET I2C eeprom Client
4
5 import re
6 import sys
7 import binascii
8 import array
9 from GoodFETI2C import GoodFETI2C
10 #from intelhex import IntelHex
11
12 if(len(sys.argv)==1):
13     print "Usage: %s verb [objects]\n" % sys.argv[0]
14     print "%s dump 0x$target $filename.bin [0x$start [0x$length]]" % sys.argv[0]
15     print "%s read 0x$target [0x$start [0x$length]]" % sys.argv[0]
16     print "%s write 0x$target 0x$adr 0x$val [0x...]" % sys.argv[0]
17     sys.exit()
18
19 #Initialize FET and set baud rate
20 client=GoodFETI2C()
21 #client.verbose=True
22 client.serInit()
23 client.I2Csetup()
24
25 control_chars = ''.join(map(chr, range(0,32) + range(127,256)))
26 control_char_re = re.compile('[%s]' % re.escape(control_chars))
27
28 def dotnpc(s):
29     """Replace non-printing-characters with dots"""
30     return control_char_re.sub('.', s)
31
32 def xxd(data):
33     for offset in range(0, len(data), 16):
34         line = data[offset:offset+16]
35         hex = binascii.hexlify(line)
36         print "%07x: %4s %4s %4s %4s %4s %4s %4s %4s  %s" %tuple([offset] + [hex[s:s+4] for s in range(0,32,4)] + [dotnpc(line)])
37
38 if(sys.argv[1]=="dump"):
39     devadr = int(sys.argv[2],16)
40     f = sys.argv[3]
41     start=0x00
42     count=0x100
43     if(len(sys.argv)>4):
44         start=int(sys.argv[4],16)
45     if(len(sys.argv)>5):
46         count=int(sys.argv[5],16)
47     
48     print "Dumping %i bytes from device 0x%02x starting at 0x%02x to file: %s." % (count,devadr,start,f)
49     file = open(f, mode='wb')
50     data=client.I2Ctrans(count, [devadr, start])
51     print "Dumped %i bytes."%len(data)
52     file.write(data)
53     file.close()
54
55 if(sys.argv[1]=="read"):
56     devadr = int(sys.argv[2],16)
57     start=0x00
58     if(len(sys.argv)>3):
59         start=int(sys.argv[3],16)
60     count=1
61     if(len(sys.argv)>4):
62         count=int(sys.argv[4],16)
63     print "Reading %i bytes from device 0x%02x starting at 0x%02x." % (count,devadr,start)
64     data=client.I2Ctrans(count, [devadr, start])
65     if(data):
66         xxd(data)
67     else:
68         print "No data received"
69
70 if(sys.argv[1]=="write"):
71     if(len(sys.argv)>2):
72         data=[int(x,16) for x in sys.argv[2:]]
73     for i,byte in enumerate(data):
74         print "0x%02x: 0x%02x" % (i,byte)
75     client.I2Cwritebytes(data)