yield instead of returning a list of values for ARMreadChunk. also, check out ARMrea...
[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 "\nSupported rates: 83.3, 100, 125, 250, 500, 1000 kHz.";
25     sys.exit();
26
27 #Initialize FET and set baud rate
28 client=GoodFETMCPCAN();
29 client.serInit()
30
31
32 client.MCPsetup();
33
34 #Dummy read.
35 #Might read as all ones if chip has a startup delay.
36
37 if(sys.argv[1]=="info"):
38     print "MCP2515 Info:\n\n";
39     
40     print "Mode: %s" % client.MCPcanstatstr();
41     print "Read Status: %02x" % client.MCPreadstatus();
42     print "Rx Status:   %02x" % client.MCPrxstatus();
43     print "Tx Errors:  %3d" % client.peek8(0x1c);
44     print "Rx Errors:  %3d" % client.peek8(0x1d);
45     print "RX Buffers:"
46     packet0=client.readrxbuffer(0);
47     packet1=client.readrxbuffer(1);
48     for foo in [packet0, packet1]:
49         print client.packet2str(foo);
50
51 if(sys.argv[1]=="sniff"):
52     if len(sys.argv)>2:
53         rate=float(sys.argv[2]);
54         client.MCPsetrate(rate);
55     client.MCPreqstatListenOnly();
56     while 1:
57         packet=client.rxpacket();
58         if packet!=None:
59             print client.packet2str(packet);
60
61 if(sys.argv[1]=="isniff"):
62     """ An intelligent sniffer, decodes message format """
63     """ More features to be added soon """
64     if len(sys.argv)>2:
65         rate=float(sys.argv[2]);
66         client.MCPsetrate(rate);
67     client.MCPreqstatListenOnly();
68     while 1:
69         packet=client.rxpacket();
70         if packet!=None:
71             plist=[];
72             for byte in packet:
73                 plist.append(byte);
74             arbid=plist[0:2];
75             eid=plist[2:4];
76             dlc=plist[4:5];
77             data=plist[5:13];         
78             print "\nArbID: " + client.packet2str(arbid);
79             print "EID: " + client.packet2str(eid);
80             print "DLC: " + client.packet2str(dlc);
81             print "Data: " + client.packet2str(data);
82
83 if(sys.argv[1]=="test"):
84     print "MCP2515 Self Test:";
85     
86     #Switch to config mode and try to rewrite TEC.
87     client.MCPreqstatConfiguration();
88     client.poke8(0x00,0xde);
89     if client.peek8(0x00)!=0xde:
90         print "ERROR: Poke to TEC failed.";
91     else:
92         print "SUCCESS: Register read/write.";
93     
94     #Switch to Loopback mode and try to catch our own packet.
95     client.MCPreqstatLoopback();
96     client.txpacket([0xb1, 0x6b, 0x00, 0x65,
97                      0xb1, 0x6b, 0x00, 0x65
98                      ]);
99     print "Waiting on loopback packet.";
100     packet=None;
101     while packet==None:
102         packet=client.rxpacket();
103     print "Success!  Got %s" % client.packet2str(packet);
104 if(sys.argv[1]=="peek"):
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 %04x to %04x." % (start,stop);
112     while start<=stop:
113         print "%04x: %02x" % (start,client.peek8(start));
114         start=start+1;