RNG test.
[goodfet] / client / GoodFETEM260.py
1 #!/usr/bin/env python
2 # GoodFET EM260 Radio Client
3
4 # (C) 2010 Travis Goodspeed <travis at radiantmachines.com>
5 #
6 # This code is being rewritten and refactored.  You've been warned!
7
8 # The EM260 is almost textbook SPI, except that the response cannot be
9 # read until after the nHOST_INT pin of the EM260 drops low and a dummy
10 # byte is read.  That is, the sequence will look like the following:
11
12 # Transmit Host->Slave Data
13 # while(nHOST_INT); //Sleep until ready.
14 # Recv Dummy Byte
15 # Recv Slave->Host Data
16
17 # The delay is mandatory.
18
19 import sys, time, string, cStringIO, struct, glob, serial, os;
20
21 from GoodFETSPI import GoodFETSPI;
22
23 class GoodFETEM260(GoodFETSPI):
24     EM260APP=0x01;
25     seq=0;
26     def EM260trans(self,data,retry=1):
27         """Exchange data by EM260 SPI. (Slightly nonstandard.)"""
28         
29         if retry==0:
30             #Retries exceeded.  Send a trivial command to clear error.
31             data=[0x0A,0xA7];
32         self.writecmd(0x01,0x82,len(data),data);
33         
34         
35         try:
36             reply=ord(self.data[0]);
37             if(reply==0x00):
38                 #print "Warning: EM260 rebooted.";
39                 return self.EM260trans(data,retry-1);
40             if(reply==0x02):
41                 #print "Error: Aborted Transaction.";
42                 return self.EM260trans(data,retry-1);
43             if(reply==0x03):
44                 print "Error: Missing Frame Terminator.";
45                 return self.data;
46             if(reply==0x04):
47                 print "Error: Reserved Error.  (Access denied?)";
48                 return self.data;
49         except:
50             print "Error in EM260trans.";
51         return self.data;
52     
53     def EZSPtrans(self,frame):
54         """Send an EZSP frame."""
55         data=self.EM260trans([0xFE,len(frame)+2,
56                               self.seq,0x00,
57                               ]+frame+[
58                               0xA7]);
59         #s="";
60         #for foo in data:
61         #    s=s+"%02x " % ord(foo);
62         #print s;
63         if ord(data[0])!=0xFE:
64             print "EZSP error: 0x%02x" % ord(data[0]);
65         if frame[0]!=ord(data[4]):
66             print "EZSP warning: Command 0x%02x returned type 0x%02x." % (
67                 frame[0],ord(data[4]));
68         self.seq=self.seq+1;
69         return data;
70         #return ord(data[0]);
71         
72     def peek8(self,adr):
73         """Read a byte from the given address."""
74         
75         data=self.EZSPtrans([0x47,adr&0xFF]);
76         
77         return ord(data[0]);
78     
79     def rand16(self):
80         """Read a byte from the given address."""
81         
82         data=self.EZSPtrans([0x49]);
83         return ord(data[6])+(ord(data[7])<<8);
84     
85     def info(self):
86         """Read the info bytes."""
87         print "Ember EM26 Z-Stack SPI Module.";
88         version=self.EM260spiversion();
89         status=self.EM260spistatus();
90         print "Version: %i" % (version); 
91         print "Status:  %s" % (["dead","alive"][status]);
92     def EM260spiversion(self):
93         """Read the SPI version number from EM260."""
94         data=self.EM260trans([0x0A,0xA7]);        
95         version=ord(data[0]);
96         
97         if version==0x00:
98             return self.EM260spiversion();
99         if version==0x02:
100             return self.EM260spiversion();
101         if not version&0x80:
102             print "Version misread.";
103             return 0;
104         return version&0x7F;
105     
106     def EM260spistatus(self):
107         """Read the status bit."""
108         data=self.EM260trans([0x0B,0xA7]);
109         status=ord(data[0]);
110         
111         if status==0x00:
112             return self.EM260spistatus();
113         if status==0x02:
114             return self.EM260spistatus();
115         if not status&0x80 and status&0x40:
116             print "Status misread.";
117             return 0;
118         return status&1;