From 4b4d432fa54e8130f216f97d1a976795f3c446a4 Mon Sep 17 00:00:00 2001 From: travisutk Date: Tue, 25 Sep 2012 12:31:50 +0000 Subject: [PATCH] Reading and writing of CC2420 RAM. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@1276 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- client/GoodFET.py | 6 +-- client/GoodFETCCSPI.py | 17 ++++++- client/goodfet.ccspi | 28 ++++++++++++ firmware/apps/radios/ccspi.c | 87 +++++++++++++++++++++++++++++++----- firmware/include/ccspi.h | 14 +++--- 5 files changed, 130 insertions(+), 22 deletions(-) diff --git a/client/GoodFET.py b/client/GoodFET.py index 1ee0ed9..11ca616 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -195,17 +195,17 @@ class GoodFET: #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. diff --git a/client/GoodFETCCSPI.py b/client/GoodFETCCSPI.py index 3b787d5..d55af3c 100644 --- a/client/GoodFETCCSPI.py +++ b/client/GoodFETCCSPI.py @@ -115,7 +115,7 @@ class GoodFETCCSPI(GoodFET): #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"; @@ -174,6 +174,21 @@ class GoodFETCCSPI(GoodFET): """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 diff --git a/client/goodfet.ccspi b/client/goodfet.ccspi index 0372521..78d7691 100755 --- a/client/goodfet.ccspi +++ b/client/goodfet.ccspi @@ -17,6 +17,8 @@ if(len(sys.argv)==1): 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]; @@ -97,6 +99,32 @@ if(sys.argv[1]=="regs"): 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])); diff --git a/firmware/apps/radios/ccspi.c b/firmware/apps/radios/ccspi.c index 5d40f11..a124b53 100644 --- a/firmware/apps/radios/ccspi.c +++ b/firmware/apps/radios/ccspi.c @@ -154,7 +154,43 @@ void ccspireflexjam(u16 delay){ #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){ @@ -207,6 +243,21 @@ void ccspi_handle_fn( uint8_t const app, 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? @@ -249,7 +300,7 @@ void ccspi_handle_fn( uint8_t const app, 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{ @@ -278,17 +329,34 @@ void ccspi_handle_fn( uint8_t const app, //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