X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fradios%2Fccspi.c;h=9a9c13d011fffd8607d1a0f06e6721e187183620;hp=7c72ddd2d018e097166588d3af38e9ce1098d4fe;hb=0d6f0d8ae390c2ae59cf92d6f37f363aa2e68c80;hpb=3ce193dd33e5e9e4c16989d85b8fb15715b139de diff --git a/firmware/apps/radios/ccspi.c b/firmware/apps/radios/ccspi.c index 7c72ddd..9a9c13d 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? @@ -214,13 +265,20 @@ void ccspi_handle_fn( uint8_t const app, debugstr("Clearing overflow"); CLRSS; ccspitrans8(0x08); //SFLUSHRX + ccspitrans8(0x08); //SFLUSHRX SETSS; txdata(app,verb,0); //no packet return; } - + + /* Uncomment this to wait around a bit for the packet. + Might reduce dropped packet count. + i=1000; //Number of tries. + while(!(FIFOP&&FIFO) && i--); + */ + //Is there a packet? - if(FIFOP&&FIFO){ + if (FIFOP && FIFO){ //Wait for completion. while(SFD); @@ -238,8 +296,8 @@ void ccspi_handle_fn( uint8_t const app, A software fix is to reset the CC2420 between packets. This works, but a better solution is desired. */ - for(i=0;i