Glitching functions.
[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" % sys.argv[0];
14     #print "%s dump $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(sys.argv[1]=="lock"):
60 #if(sys.argv[1]=="unlock"):
61     
62
63
64 if(sys.argv[1]=="dump"):
65     f = sys.argv[2];
66     start=0x0000;
67     stop=0xFFFF;
68     if(len(sys.argv)>3):
69         start=int(sys.argv[3],16);
70     if(len(sys.argv)>4):
71         stop=int(sys.argv[4],16);
72     
73     print "Dumping from %04x to %04x as %s." % (start,stop,f);
74     #h = IntelHex16bit(None);
75     h = IntelHex(None);
76     i=start;
77     while i<=stop:
78         data=client.flashpeekblock(i);
79         print "Dumped %06x."%i;
80         for j in data:
81             if i<=stop: h[i]=ord(j);
82             i+=1;
83     h.write_hex_file(f);
84
85
86 if(sys.argv[1]=="peekeeprom"):
87     start=0x0000;
88     if(len(sys.argv)>2):
89         start=int(sys.argv[2],16);
90     stop=start;
91     if(len(sys.argv)>3):
92         stop=int(sys.argv[3],16);
93     print "Peeking from %06x to %06x." % (start,stop);
94     while start<=stop:
95         print "%06x: %02x" % (start,client.eeprompeek(start));
96         start=start+1;
97 if(sys.argv[1]=="peekflash"):
98     start=0x0000;
99     if(len(sys.argv)>2):
100         start=int(sys.argv[2],16);
101     stop=start;
102     if(len(sys.argv)>3):
103         stop=int(sys.argv[3],16);
104     print "Peeking from %06x to %06x." % (start,stop);
105     while start<=stop:
106         print "%06x: %02x" % (start,client.flashpeek(start));
107         start=start+1;
108
109 if(sys.argv[1]=="pokeeeprom"):
110     start=0x0000;
111     val=0x00;
112     if(len(sys.argv)>2):
113         start=int(sys.argv[2],16);
114     if(len(sys.argv)>3):
115         val=int(sys.argv[3],16);
116     client.eeprompoke(start,val);
117
118