X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=firmware%2Fapps%2Fradios%2Fccspi.c;h=dd70a3d15af92d7d6751d2d0fc8ba635b7d3ee2a;hb=ed70ab984559f85637b5d3ef88493e5cde92d9d5;hp=4ab98fdb43b8f0ed6861ff1b1c54aca168cc6b85;hpb=5c9f0bab9a953ecae957f8ac1c376c228a55026f;p=goodfet diff --git a/firmware/apps/radios/ccspi.c b/firmware/apps/radios/ccspi.c index 4ab98fd..dd70a3d 100644 --- a/firmware/apps/radios/ccspi.c +++ b/firmware/apps/radios/ccspi.c @@ -50,12 +50,14 @@ void ccspisetup(){ DIRSS; DIRCE; - P4OUT|=BIT5; //activate CC2420 voltage regulator + //P4OUT|=BIT5; //activate CC2420 voltage regulator msdelay(100); //Reset the CC2420. - P4OUT&=~BIT6; - P4OUT|=BIT6; + /*P4OUT&=~BIT6; FIXME Does the new code work on Z1 and Telosb? + P4OUT|=BIT6;*/ + CLRCE; + SETCE; //Begin a new transaction. CLRSS; @@ -87,6 +89,109 @@ u8 ccspitrans8(u8 byte){ } +//! Reflexively jam on the present channel. +void ccspireflexjam(u16 delay){ + unsigned long i; + #if defined(FIFOP) && defined(SFD) && defined(FIFO) && defined(PLED2DIR) && defined(PLED2PIN) && defined(PLED2OUT) + + prep_timer(); + debugstr("Reflex jamming until reset."); + debughex(delay); + txdata(CCSPI,CCSPI_REFLEX,1); //Let the client continue its business. + while(1) { + //Wait until a packet is received + while(!SFD){ + //Has there been an overflow in the RX buffer? + if((!FIFO)&&FIFOP){ + //debugstr("Clearing RX overflow"); + CLRSS; + ccspitrans8(0x08); //SFLUSHRX + SETSS; + } + } + //Turn on LED 2 (green) as signal + PLED2DIR |= PLED2PIN; + PLED2OUT &= ~PLED2PIN; + + + + //Wait a few us to send it. + delay_us(delay); + + //Transmit the packet. + CLRSS; + ccspitrans8(0x04); + SETSS; + + + //Load the next jamming packet. + //Note: attempts to preload this actually slowed the jam time down from 7 to 9 bytes. + CLRSS; + ccspitrans8(CCSPI_TXFIFO); + char pkt[5] = {0x05, 0, 0, 0, 0}; + //char pkt[15] = {0x0f, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef, 0xba, 0xbe, 0xc0}; + //char pkt[12] = {0x0c, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef}; + for(i=0;i>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){ CLRSS; @@ -117,8 +222,6 @@ void ccspi_handle_fn( uint8_t const app, unsigned long i; u8 j; - //debugstr("Chipcon SPI handler."); - switch(verb){ case PEEK: cmddata[0]|=0x40; //Set the read bit. @@ -138,18 +241,58 @@ 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_REPEAT_RX: + + /* CCSPI_REPEAT_RX repeatedly requests new packets, forwarding + them to the server without waiting for the next request. This + allows for sniffing of packets that would otherwise overflow + the buffer. + */ + + //debugstr("Looping CCSPI_RX."); + + //Loop forever in RX mode. + while(1){ + ccspi_handle_fn(app,CCSPI_RX,0); + } + break; case CCSPI_RX: #ifdef FIFOP //Has there been an overflow? + if((!FIFO)&&FIFOP){ - //debugstr("Clearing overflow"); + 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); @@ -157,20 +300,101 @@ void ccspi_handle_fn( uint8_t const app, CLRSS; ccspitrans8(CCSPI_RXFIFO | 0x40); //ccspitrans8(0x3F|0x40); - cmddata[0]=0xff; //to be replaced with length - for(i=0;i