continuing to improve arm support with AT91X40 and adding AT91SAM7
[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,2000):
32         client.start();
33         print "Identifies as %s, fused 0x%02x; eeprom(0)=%02x" % (
34             client.identstr(),
35             client.lockbits(),
36             client.eeprompeek(0));
37 if(sys.argv[1]=="glitchgraph"):
38     print "Identifies as %s" % client.identstr();
39     for voltage in range(0x860,0x890,5):
40         str="";
41         count=0;
42         #five minutes for 1,80
43         #thirty minutes for 1,500
44         
45         for i in range(1,40):
46             client.glitchVoltages(voltage, voltage);
47             client.start();
48             if(client.lockbits()==0xFF):
49                 str="%s." % str;
50                 count+=1;
51         print "%04x %s" % (voltage,str);
52         #print "%f, %i" % (voltage*(3.3/4096.0),count);
53 if(sys.argv[1]=="info"):
54     print "Identifies as %s, lock=%02x" % (client.identstr(),client.lockbits());
55 if(sys.argv[1]=="erase"):
56     print "Erasing %s" % client.identstr();
57     client.erase();
58 if(sys.argv[1]=="lockbits"):
59     print "Lockbits are 0x%02x" % client.lockbits();
60     if(len(sys.argv)>2):
61         print "Lockbits set 0x%02x" %  client.setlockbits(int(sys.argv[2],16));
62 if(sys.argv[1]=="lock"):
63     client.setlockbits(0xFC);
64
65 if(sys.argv[1]=="unlock"):
66     print "Identifies as %s" % client.identstr();
67     client.glitchVoltages(0x880, 0xfff);
68     for i in range(1,20):
69         client.start();
70         print "Identifies as %s, fused 0x%02x; eeprom(0)=%02x" % (
71             client.identstr(),
72             client.lockbits(),
73             client.eeprompeek(0));
74         if(client.lockbits()==0xFF):
75             client.setlockbits(0xFF);
76             print "Chip unlocked!"
77             exit();
78 #if(sys.argv[1]=="unlock"):
79     
80
81
82 if(sys.argv[1]=="dumpflash"):
83     f = sys.argv[2];
84     start=0x0000;
85     stop=0xFFFF;
86     if(len(sys.argv)>3):
87         start=int(sys.argv[3],16);
88     if(len(sys.argv)>4):
89         stop=int(sys.argv[4],16);
90     
91     print "Dumping from %04x to %04x as %s." % (start,stop,f);
92     #h = IntelHex16bit(None);
93     h = IntelHex(None);
94     i=start;
95     while i<=stop:
96         data=client.flashpeekblock(i);
97         print "Dumped %06x."%i;
98         for j in data:
99             if i<=stop: h[i]=ord(j);
100             i+=1;
101     h.write_hex_file(f);
102
103
104 if(sys.argv[1]=="peekeeprom"):
105     start=0x0000;
106     if(len(sys.argv)>2):
107         start=int(sys.argv[2],16);
108     stop=start;
109     if(len(sys.argv)>3):
110         stop=int(sys.argv[3],16);
111     print "Peeking from %06x to %06x." % (start,stop);
112     while start<=stop:
113         print "%06x: %02x" % (start,client.eeprompeek(start));
114         start=start+1;
115
116 if(sys.argv[1]=="peekflash"):
117     start=0x0000;
118     if(len(sys.argv)>2):
119         start=int(sys.argv[2],16);
120     stop=start;
121     if(len(sys.argv)>3):
122         stop=int(sys.argv[3],16);
123     print "Peeking from %06x to %06x." % (start,stop);
124     while start<=stop:
125         print "%06x: %02x" % (start,client.flashpeek(start));
126         start=start+1;
127
128 if(sys.argv[1]=="pokeeeprom"):
129     start=0x0000;
130     val=0x00;
131     if(len(sys.argv)>2):
132         start=int(sys.argv[2],16);
133     if(len(sys.argv)>3):
134         val=int(sys.argv[3],16);
135     client.eeprompoke(start,val);
136
137