updated features for two different types of sniffing. fixed and scrolling. This can...
[goodfet] / client / goodfet.mcpcan
1 #!/usr/bin/env python
2 # GoodFET SPI Flash Client
3 #
4 # (C) 2012 Travis Goodspeed <travis at radiantmachines.com>
5 #
6 # This code is being rewritten and refactored.  You've been warned!
7
8 import sys;
9 import binascii;
10 import array;
11
12 from GoodFETMCPCAN import GoodFETMCPCAN;
13 from intelhex import IntelHex;
14
15 if(len(sys.argv)==1):
16     print "Usage: %s verb [objects]\n" % sys.argv[0];
17     print "%s info" % sys.argv[0];
18     print "%s test" % sys.argv[0];
19     print "%s peek 0x$start [0x$stop]" % sys.argv[0];
20     #print "%s poke 0x$adr 0x$val" % sys.argv[0];
21
22     print "\n%s sniff [kHz]" % sys.argv[0];
23     print "\n%s isniff [kHz]" % sys.argv[0];
24     print "\n%s spit [kHz]" % sys.argv[0];
25
26     print "\nSupported rates: 83.3, 100, 125, 250, 500, 1000 kHz.";
27     sys.exit();
28
29 #Initialize FET and set baud rate
30 client=GoodFETMCPCAN();
31 client.serInit()
32
33
34 client.MCPsetup();
35
36 #Dummy read.
37 #Might read as all ones if chip has a startup delay.
38
39 if(sys.argv[1]=="info"):
40     print "MCP2515 Info:\n\n";
41     
42     print "Mode: %s" % client.MCPcanstatstr();
43     print "Read Status: %02x" % client.MCPreadstatus();
44     print "Rx Status:   %02x" % client.MCPrxstatus();
45     print "Tx Errors:  %3d" % client.peek8(0x1c);
46     print "Rx Errors:  %3d\n" % client.peek8(0x1d);
47     
48     print "Timing Info:";
49     print "CNF1: %02x" %client.peek8(0x2a);
50     print "CNF2: %02x" %client.peek8(0x29);
51     print "CNF3: %02x\n" %client.peek8(0x28);
52     print "RXB0 CTRL: %02x" %client.peek8(0x60);
53     print "RXB1 CTRL: %02x" %client.peek8(0x70);
54     print "RX Buffers:"
55     packet0=client.readrxbuffer(0);
56     packet1=client.readrxbuffer(1);
57     for foo in [packet0, packet1]:
58         print client.packet2str(foo);
59
60 if(sys.argv[1]=="sniff"):
61     if len(sys.argv)>2:
62         rate=float(sys.argv[2]);
63         print "Calling MCPsetrate for %i." %rate;
64         client.MCPsetrate(rate);
65     client.MCPreqstatListenOnly();
66     
67     print "Mode: %s" % client.MCPcanstatstr();
68
69     print "CNF1: %02x" %client.peek8(0x2a);
70     print "CNF2: %02x" %client.peek8(0x29);
71     print "CNF3: %02x\n" %client.peek8(0x28);
72     
73     while(1):
74         packet=client.rxpacket();
75         if packet!=None:
76             print client.packet2str(packet);
77                 
78             if (client.peek8(0x2C) & 0x80):
79                 client.MCPbitmodify(0x2C,0x80,0x00);
80                 print"...malformed packet recieved";
81     
82 if(sys.argv[1]=="snifftest"):
83
84     freqrange=[10.4, 41.6, 83.3, 100, 125, 250, 500, 1000];
85     
86     for rate in freqrange:
87
88         print "CAN Freq Test: %3d kHz" %rate;
89         client.MCPsetrate(rate);
90         #print "CNF1/2/3: %02x %02x %02x" %(client.peek8(0x2a), client.peek8(0x29),client.peek8(0x28));
91         client.MCPreqstatListenOnly();
92         print "Mode: %s" % client.MCPcanstatstr();
93         x = 0;
94         errors = 0;
95
96         for n in range(0,400):
97             packet=client.rxpacket();
98             if packet!=None:
99                 print client.packet2str(packet);
100                 x+=1;
101                 
102                 if (client.peek8(0x2C) & 0x80):
103                     errors+=1;
104                     client.MCPbitmodify(0x2C,0x80,0x00);
105
106         if x==0:
107             print "No packets sniffed for %3d kHz" %rate;
108         else:
109             percenterror = float(errors/x);
110         
111             print "Results for %3.1 kHz: recieved %3d packets, registered %3d RX errors, for a %3.3f percent error rate." %(rate, x, errors, percenterrors);
112             
113         client.MCPreset();
114
115 if(sys.argv[1]=="isniff"):
116     """ An intelligent sniffer, decodes message format """
117     """ More features to be added soon """
118     if len(sys.argv)>2:
119         rate=float(sys.argv[2]);
120         client.MCPsetrate(rate);
121     client.MCPreqstatListenOnly();
122     while 1:
123         packet=client.rxpacket();
124         if packet!=None:
125             plist=[];
126             for byte in packet:
127                 plist.append(byte);
128             arbid=plist[0:2];
129             eid=plist[2:4];
130             dlc=plist[4:5];
131             data=plist[5:13];         
132             print "\nArbID: " + client.packet2str(arbid);
133             print "EID: " + client.packet2str(eid);
134             print "DLC: " + client.packet2str(dlc);
135             print "Data: " + client.packet2str(data);
136
137 if(sys.argv[1]=="test"):
138     print "\nMCP2515 Self Test:";
139     
140     #Switch to config mode and try to rewrite TEC.
141     client.MCPreqstatConfiguration();
142     client.poke8(0x00,0xde);
143     if client.peek8(0x00)!=0xde:
144         print "ERROR: Poke to TEC failed.";
145     else:
146         print "SUCCESS: Register read/write.";
147     
148     #Switch to Loopback mode and try to catch our own packet.
149     client.MCPreqstatLoopback();
150
151     packet1 = [0x00, 
152                0x08, # LOWER nibble must be 8 or greater to set EXTENDED ID 
153                0x00, 0x00,
154                0x08, # UPPER nibble must be 0 to set RTR bit for DATA FRAME
155                   # LOWER nibble is DLC
156                0x01,0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xFF]
157     client.txpacket(packet1);
158     client.txpacket(packet1);
159     print "Waiting on loopback packets.";
160     packet=None;
161     while(1):
162         packet=client.rxpacket();
163         if packet!=None:
164             print "Message recieved: %s" % client.packet2str(packet);
165
166     
167     
168 if(sys.argv[1]=="peek"):
169     start=0x0000;
170     if(len(sys.argv)>2):
171         start=int(sys.argv[2],16);
172     stop=start;
173     if(len(sys.argv)>3):
174         stop=int(sys.argv[3],16);
175     print "Peeking from %04x to %04x." % (start,stop);
176     while start<=stop:
177         print "%04x: %02x" % (start,client.peek8(start));
178         start=start+1;
179
180 if(sys.argv[1]=="spit"):
181
182     if len(sys.argv)>2:
183         rate=float(sys.argv[2]);
184         print "Calling MCPsetrate for %i." %rate;
185         client.MCPsetrate(rate);
186
187     client.MCPreqstatNormal();
188     
189     packet = [0x00, 
190                0x08, # LOWER nibble must be 8 or greater to set EXTENDED ID 
191                0x00, 0x00,
192                0x08, # UPPER nibble must be 0 to set RTR bit for DATA FRAME
193                   # LOWER nibble is DLC
194                0x01,0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xFF]    
195     
196     client.txpacket(packet);
197     data = client.peek8(0x30);
198     while (data&0x08)==0:
199         print "waiting...";
200         data=client.peek8(0x30);
201     print "message successfully sent!";
202
203 if(sys.argv[1]=="setbitrate"):
204     if len(sys.argv)>2:
205         rate=float(sys.argv[2]);
206         print "Calling MCPsetrate for %i." %rate;
207         client.MCPsetrate(rate);
208
209
210
211
212     
213