241885428443519d54bd52323b818730cdfad5d9
[goodfet] / client / goodfet.avr
1 #!/usr/bin/env python
2
3 import sys;
4 import binascii;
5
6 from GoodFETAVR import GoodFETAVR;
7 from intelhex import IntelHex16bit, IntelHex;
8
9 if(len(sys.argv)==1):
10     print "Usage: %s verb [objects]\n" % sys.argv[0];
11     print "%s test" % sys.argv[0];
12     print "%s info" % sys.argv[0];
13     print "%s lockbits [value]" % sys.argv[0];
14     print "%s dumpflash $foo.hex [0x$start 0x$stop]" % sys.argv[0];
15     print "%s erase" % sys.argv[0];
16     #print "%s flash $foo.hex [0x$start 0x$stop]" % sys.argv[0];
17     #print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0];
18     print "%s peekeeprom 0x$start [0x$stop]" % sys.argv[0];
19     sys.exit();
20
21 #Initialize FET and set baud rate
22 client=GoodFETAVR();
23 client.serInit()
24
25 #Connect to target
26 client.start();
27
28 if(sys.argv[1]=="glitch"):
29     print "Identifies as %s" % client.identstr();
30     client.glitchVoltages(0x880, 0xfff);
31     for i in range(1,20):
32         client.start();
33         print "Identifies as %s, fused 0x%02x" % (
34             client.identstr(),
35             client.lockbits());
36 if(sys.argv[1]=="glitchgraph"):
37     print "Identifies as %s" % client.identstr();
38     for voltage in range(0x860,0x890,5):
39         str="";
40         count=0;
41         #five minutes for 1,80
42         #thirty minutes for 1,500
43         
44         for i in range(1,40):
45             client.glitchVoltages(voltage, voltage);
46             client.start();
47             if(client.lockbits()==0xFF):
48                 str="%s." % str;
49                 count+=1;
50         print "%04x %s" % (voltage,str);
51         #print "%f, %i" % (voltage*(3.3/4096.0),count);
52 if(sys.argv[1]=="info"):
53     print "Identifies as %s" % client.identstr();
54 if(sys.argv[1]=="erase"):
55     print "Erasing %s" % client.identstr();
56     client.erase();
57 if(sys.argv[1]=="lockbits"):
58     print "Lockbits are 0x%02x" % client.lockbits();
59     if(len(sys.argv)>2):
60         print "Lockbits set 0x%02x" %  client.setlockbits(int(sys.argv[2],16));
61 #if(sys.argv[1]=="lock"):
62 #if(sys.argv[1]=="unlock"):
63     
64
65
66 if(sys.argv[1]=="dumpflash"):
67     f = sys.argv[2];
68     start=0x0000;
69     stop=0xFFFF;
70     if(len(sys.argv)>3):
71         start=int(sys.argv[3],16);
72     if(len(sys.argv)>4):
73         stop=int(sys.argv[4],16);
74     
75     print "Dumping from %04x to %04x as %s." % (start,stop,f);
76     #h = IntelHex16bit(None);
77     h = IntelHex(None);
78     i=start;
79     while i<=stop:
80         data=client.flashpeekblock(i);
81         print "Dumped %06x."%i;
82         for j in data:
83             if i<=stop: h[i]=ord(j);
84             i+=1;
85     h.write_hex_file(f);
86
87
88 if(sys.argv[1]=="peekeeprom"):
89     start=0x0000;
90     if(len(sys.argv)>2):
91         start=int(sys.argv[2],16);
92     stop=start;
93     if(len(sys.argv)>3):
94         stop=int(sys.argv[3],16);
95     print "Peeking from %06x to %06x." % (start,stop);
96     while start<=stop:
97         print "%06x: %02x" % (start,client.eeprompeek(start));
98         start=start+1;
99
100 if(sys.argv[1]=="peekflash"):
101     start=0x0000;
102     if(len(sys.argv)>2):
103         start=int(sys.argv[2],16);
104     stop=start;
105     if(len(sys.argv)>3):
106         stop=int(sys.argv[3],16);
107     print "Peeking from %06x to %06x." % (start,stop);
108     while start<=stop:
109         print "%06x: %02x" % (start,client.flashpeek(start));
110         start=start+1;
111
112 if(sys.argv[1]=="pokeeeprom"):
113     start=0x0000;
114     val=0x00;
115     if(len(sys.argv)>2):
116         start=int(sys.argv[2],16);
117     if(len(sys.argv)>3):
118         val=int(sys.argv[3],16);
119     client.eeprompoke(start,val);
120
121