#print "'%s'!=\n'%s'" % (self.data,"http://goodfet.sf.net/");
if attemptlimit is not None and attempts >= attemptlimit:
return
- elif attempts==2:
+ elif attempts==2 and os.environ.get("board")!='telosb':
print "See the GoodFET FAQ about missing info flash.";
self.serialport.setTimeout(0.2);
#self.serialport.flushInput()
#self.serialport.flushOutput()
#TelosB reset, prefer software to I2C SPST Switch.
- if (os.environ.get("platform")=='telosb' or os.environ.get("board")=='telosb'):
+ if (os.environ.get("board")=='telosb'):
#print "TelosB Reset";
self.telosBReset();
- elif (os.environ.get("board")=='zolertiaz1' or os.environ.get("board")=='z1'):
+ elif (os.environ.get("board")=='z1'):
self.bslResetZ1(invokeBSL=0);
elif (os.environ.get("board")=='apimote1') or (os.environ.get("board")=='apimote'):
#Explicitly set RTS and DTR to halt board.
#Radio stuff begins here.
def RF_setenc(self,code="802.15.4"):
"""Set the encoding type."""
- return;
+ return code;
def RF_getenc(self):
"""Get the encoding type."""
return "802.15.4";
"""Returns the received signal strength, with a weird offset."""
rssival=self.peek(0x13)&0xFF; #raw RSSI register
return rssival^0x80;
+
+ def peekram(self,adr,count):
+ """Peeks data from CC2420 RAM."""
+ data=[
+ adr&0xFF,adr>>8, # Address first.
+ count&0xFF,count>>8 # Then length.
+ ];
+ self.writecmd(self.CCSPIAPP,0x84,len(data),data);
+ return self.data;
+ def pokeram(self,adr,data):
+ """Pokes data into CC2420 RAM."""
+ data=[adr&0xFF, adr>>8]+data;
+ self.writecmd(self.CCSPIAPP,0x85,len(data),data);
+ return;
+
lastpacket=range(0,0xff);
def RF_rxpacket(self):
"""Get a packet from the radio. Returns None if none is
print "Usage: %s verb [objects]\n" % sys.argv[0];
print "%s info" % sys.argv[0];
print "%s regs" % sys.argv[0];
+ print "%s ram" % sys.argv[0];
+ print "%s ramtest" % sys.argv[0];
print "%s test" % sys.argv[0];
print "%s peek 0x$start [0x$stop]" % sys.argv[0];
print "%s poke 0x$adr 0x$val" % sys.argv[0];
for adr in range(0x10,0x40): #*1024):
val=client.peek(adr);
print "%04x:=0x%04x" % (adr,val);
+if(sys.argv[1]=="ram"):
+ for adr in range(0x0,0x16D,16):
+ row=client.peekram(adr,32);
+ s="";
+ for foo in row:
+ s=s+(" %02x" % ord(foo))
+ print "%04x: %s" % (adr,s);
+if(sys.argv[1]=="ramtest"):
+ client.pokeram(0x00,[0xde,0xad,0xbe,0xef,
+ 0xde,0xad,0xbe,0xef,
+ 0xde,0xad,0xbe,0xef,
+ 0xde,0xad,0xbe,0xef,
+ 0xde,0xad,0xbe,0xef,
+ 0xde,0xad,0xbe,0xef,
+ 0xde,0xad,0xbe,0xef,
+ 0xde,0xad,0xbe,0xef,
+ 0xde,0xad,0xbe,0xef,
+ 0xde,0xad,0xbe,0xef,
+ 0xde,0xad,0xbe,0xef]);
+
+ for adr in range(0x0,0x16D,16):
+ row=client.peekram(adr,32);
+ s="";
+ for foo in row:
+ s=s+(" %02x" % ord(foo))
+ print "%04x: %s" % (adr,s);
if(sys.argv[1]=="test"):
data=client.trans([0x20, 0xde, 0xad]);
print "%02x %02x" % (ord(data[1]), ord(data[2]));
#endif
}
+//! Writes bytes into the CC2420's RAM. Untested.
+void ccspi_pokeram(u8 addr, char *data, int len){
+ CLRSS;
+ //Begin with the start address.
+ ccspitrans8(0x80 | (addr & 0x7F));
+ ccspitrans8(((addr>>1)&0xC0) // MSBits are high bits of 9-bit address.
+ // Read/!Write bit should be clear to write.
+ );
+
+ //Data goes here.
+ while(len--)
+ ccspitrans8(*data++);
+
+ SETSS;
+}
+
+//! Read bytes from the CC2420's RAM. Untested.
+void ccspi_peekram(u16 addr, u8 *data, u16 len){
+ CLRSS;
+
+ //Begin with the start address.
+ ccspitrans8(0x80 | (addr & 0x7F));
+ ccspitrans8(((addr>>1)&0xC0) // MSBits are high bits of 9-bit address.
+ | BIT5 // Read/!Write bit should be set to read.
+ );
+
+ //Data goes here.
+ while(len--)
+ *data++=ccspitrans8(0);
+
+ SETSS;
+}
+//! Updates the Nonce's sequence number.
+void ccspi_updaterxnonce(u32 seq){
+
+}
//! Writes a register
u8 ccspi_regwrite(u8 reg, const u8 *buf, int len){
ccspisetup();
txdata(app,verb,0);
break;
+ case CCSPI_PEEK_RAM:
+ i=cmddataword[1]; // Backup length.
+ ccspi_peekram(cmddataword[0], // First word is the address.
+ cmddata, // Return in the same buffer.
+ cmddataword[1] // Second word is the length.
+ );
+ txdata(app,verb,i);
+ break;
+ case CCSPI_POKE_RAM:
+ ccspi_pokeram(cmddataword[0], //First word is address
+ cmddata+2, //Remainder of buffer is dat.
+ len-2 //Length implied by packet length.
+ );
+ txdata(app,verb,0);
+ break;
case CCSPI_RX:
#ifdef FIFOP
//Has there been an overflow?
SETSS;
*/
- //Only should transmit a packet if the length is legal.
+ //Only transmit a packet if the length is legal.
if(cmddata[0]&0x80) i=0;
txdata(app,verb,i);
}else{
//Wait for completion.
while(SFD);
- //Decrypt the packet.
- CLRSS; ccspitrans8(CCSPI_SRXDEC); SETSS;
+ CLRSS;
+ ccspitrans8(CCSPI_RXFIFO | 0x40);
+ // Grab the length.
+ cmddata[0]=ccspitrans8(0x00);
- //Wait for decryption to complete.
- while(!FIFO);
+ //Read the header first.
+ for(i=1;i<cmddata[0]+1 && i<0x11;i++)
+ cmddata[i]=ccspitrans8(0x00);
+ SETSS;
- //Get the packet.
+ //Is the frame encrypted?
+ if(cmddata[1]&BIT3){
+ //Copy the sequence number to the Nonce.
+
+
+ //Decrypt the rest of the packet.
+ CLRSS; ccspitrans8(CCSPI_SRXDEC); SETSS;
+
+ //Wait for decryption to complete.
+ while(!FIFO);
+
+ }
+
+
+ //Get the packet, which is now decrypted in position.
CLRSS;
ccspitrans8(CCSPI_RXFIFO | 0x40);
//ccspitrans8(0x3F|0x40);
- cmddata[0]=0x20; //to be replaced with length
/* This reads too far on some CC2420 revisions, but on others it
A software fix is to reset the CC2420 between packets. This
works, but a better solution is desired.
*/
- for(i=0;i<cmddata[0]+1;i++)
- //for(i=0;FIFO && i<0x80;i++)
+ for(;i<cmddata[0]+1;i++)
cmddata[i]=ccspitrans8(0x00);
SETSS;
- //Only should transmit a packet if the length is legal.
+ //Only forward a packet if the length is legal.
if(cmddata[0]&0x80) i=0;
txdata(app,verb,i);
}else{
#define CCSPI_RX_FLUSH 0x82
//Flush TX
#define CCSPI_TX_FLUSH 0x83
+//Peek RAM
+#define CCSPI_PEEK_RAM 0x84
+//Poke RAM
+#define CCSPI_POKE_RAM 0x85
+
+
//Reflexive jam.
#define CCSPI_REFLEX 0xA0
//Reflexive jam that sends a forged ACK frame if one was requested
#define CCSPI_REFLEX_AUTOACK 0xA1
-//Bit fields for command word.
-#define CCSPI_R_REGISTER 0
-#define CCSPI_W_REGISTER BIT7
-#define CCSPI_R_RAM BIT6
-#define CCSPI_W_RAM (BIT6|BIT7)
-
-
-
//Register definitions might go here, at least for buffers.
#define CCSPI_MANFIDL 0x1E
#define CCSPI_MANFIDH 0x1F