62 #include "contiki-conf.h" 
   64 extern uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE];
 
   65 #define DEBUGFLOW(c) if (debugflowsize<(DEBUGFLOWSIZE-1)) debugflow[debugflowsize++]=c 
   76 #if defined(__AVR_ATmega128RFA1__) 
   85 volatile extern signed char rf230_last_rssi;
 
   91 #if defined(__AVR_ATmega128RFA1__) 
   94 #include <avr/interrupt.h> 
   96 #elif defined(__AVR_XMEGA__) 
   98 #include <avr/interrupt.h> 
  100 #define HAL_SPI_TRANSFER_OPEN() { \ 
  101   HAL_ENTER_CRITICAL_REGION();    \ 
  105 #define HAL_SPI_TRANSFER_WRITE(to_write) (SPIC.DATA = (to_write)) 
  108 #define HAL_SPI_TRANSFER_WAIT() ({while((SPIC.STATUS & SPI_IF_bm) == 0) {;}})  
  110 #define HAL_SPI_TRANSFER_READ() (SPIC.DATA) 
  112 #define HAL_SPI_TRANSFER_CLOSE() \ 
  114     HAL_LEAVE_CRITICAL_REGION(); \ 
  117 #define HAL_SPI_TRANSFER(to_write) (      \ 
  118                                     HAL_SPI_TRANSFER_WRITE(to_write),   \ 
  119                                     HAL_SPI_TRANSFER_WAIT(),            \ 
  120                                     HAL_SPI_TRANSFER_READ() ) 
  122 #elif defined(__AVR__)  
  127 #include <avr/interrupt.h> 
  129 #define HAL_SPI_TRANSFER_OPEN() { \ 
  130   HAL_ENTER_CRITICAL_REGION();    \ 
  132 #define HAL_SPI_TRANSFER_WRITE(to_write) (SPDR = (to_write)) 
  133 #define HAL_SPI_TRANSFER_WAIT() ({while ((SPSR & (1 << SPIF)) == 0) {;}})  
  134 #define HAL_SPI_TRANSFER_READ() (SPDR) 
  135 #define HAL_SPI_TRANSFER_CLOSE() \ 
  137     HAL_LEAVE_CRITICAL_REGION(); \ 
  139 #define HAL_SPI_TRANSFER(to_write) (      \ 
  140                                     HAL_SPI_TRANSFER_WRITE(to_write),   \ 
  141                                     HAL_SPI_TRANSFER_WAIT(),            \ 
  142                                     HAL_SPI_TRANSFER_READ() ) 
  148 #include "contiki-mulle.h"  
  151 #define HAL_SPI_TRANSFER_OPEN() { uint8_t spiTemp; \ 
  152   HAL_ENTER_CRITICAL_REGION();    \ 
  154 #define HAL_SPI_TRANSFER_WRITE(to_write) (spiTemp = spiWrite(to_write)) 
  155 #define HAL_SPI_TRANSFER_WAIT()  ({0;}) 
  156 #define HAL_SPI_TRANSFER_READ() (spiTemp) 
  157 #define HAL_SPI_TRANSFER_CLOSE() \ 
  159     HAL_LEAVE_CRITICAL_REGION(); \ 
  161 #define HAL_SPI_TRANSFER(to_write) (spiTemp = spiWrite(to_write)) 
  163 inline uint8_t spiWrite(uint8_t byte)
 
  169         if( (byte & mask) != 0 )
 
  179     } 
while( (mask >>= 1) != 0 );
 
  187 #if defined(__AVR_ATmega128RFA1__) 
  196 #elif defined(__AVR_XMEGA__) 
  198 #define HAL_RF230_ISR() ISR(RADIO_VECT) 
  199 #define HAL_TIME_ISR()  () 
  200 #define HAL_TICK_UPCNT() () 
  219         PORTC.DIR = (1 << SSPIN) | (1 << MOSIPIN) | (1 << SCKPIN) | (1 << RSTPIN) | (1 << SLPTRPIN); 
 
  220         PORTC.OUT |= (1 << SSPIN); 
 
  222         SPIC.CTRL |= SPI_ENABLE_bm | SPI_MASTER_bm | SPI_MODE_0_gc | RADIO_PRESCALER; 
 
  232 #elif defined(__AVR__) 
  234 #define HAL_RF230_ISR() ISR(RADIO_VECT) 
  256     SPCR         = (1 << SPE) | (1 << MSTR); 
 
  265 #define HAL_RF230_ISR() M16C_INTERRUPT(M16C_INT1) 
  266 #define HAL_TIME_ISR()  M16C_INTERRUPT(M16C_TMRB4) 
  267 #define HAL_TICK_UPCNT() (0xFFFF-TB4) // TB4 counts down so we need to convert it to upcounting 
  292     TB3MR.BYTE = 0b00000000; 
 
  296     TB4MR.BYTE = 0b10000001; 
 
  299     HAL_ENABLE_OVERFLOW_INTERRUPT(); 
 
  307 #if defined(__AVR_ATmega128RFA1__) 
  326     return (_SFR_MEM8(address)&mask)>>position;
 
  334     uint8_t register_value = _SFR_MEM8(address);
 
  335     register_value &= ~mask;
 
  338     value |= register_value;
 
  339     _SFR_MEM8(address) = value;
 
  344 #elif defined(__AVR_XMEGA__)  
  349     uint8_t register_value;
 
  355     HAL_SPI_TRANSFER_OPEN();
 
  358     HAL_SPI_TRANSFER(address);
 
  359     register_value = HAL_SPI_TRANSFER(0);
 
  361     HAL_SPI_TRANSFER_CLOSE();
 
  363     return register_value;
 
  370     address = 0xc0 | address;
 
  374     HAL_SPI_TRANSFER_OPEN();
 
  377     HAL_SPI_TRANSFER(address);
 
  379     HAL_SPI_TRANSFER(value);
 
  381     HAL_SPI_TRANSFER_CLOSE();
 
  391     register_value &= mask;
 
  392     register_value >>= position; 
 
  394     return register_value;
 
  403     register_value &= ~mask;
 
  409     value |= register_value; 
 
  429     uint8_t register_value;
 
  435     HAL_SPI_TRANSFER_OPEN();
 
  438     HAL_SPI_TRANSFER(address);
 
  439     register_value = HAL_SPI_TRANSFER(0);
 
  441     HAL_SPI_TRANSFER_CLOSE();
 
  443     return register_value;
 
  459     address = 0xc0 | address;
 
  461     HAL_SPI_TRANSFER_OPEN();
 
  464     HAL_SPI_TRANSFER(address);
 
  465     HAL_SPI_TRANSFER(value);
 
  467     HAL_SPI_TRANSFER_CLOSE();
 
  485     register_value &= mask;
 
  486     register_value >>= position; 
 
  488     return register_value;
 
  508     register_value &= ~mask;
 
  514     value |= register_value; 
 
  535 #if defined(__AVR_ATmega128RFA1__) 
  537     uint8_t frame_length,*rx_data,*rx_buffer;
 
  542     frame_length = TST_RX_LENGTH;
 
  547         rx_frame->
crc    = 
false;
 
  550     rx_frame->
length = frame_length;
 
  553     rx_buffer=(uint8_t *)0x180;
 
  554     rx_data = (rx_frame->
data);
 
  557         *rx_data++ = _SFR_MEM8(rx_buffer++);
 
  558     } 
while (--frame_length > 0);
 
  561     rx_frame->
lqi = *rx_buffer;
 
  566     rx_frame->
crc   = 
true;
 
  570     uint8_t frame_length, *rx_data;
 
  573     HAL_SPI_TRANSFER_OPEN();
 
  574     HAL_SPI_TRANSFER(0x20);
 
  577     frame_length = HAL_SPI_TRANSFER(0);
 
  584         rx_frame->
crc    = 
false;
 
  587         rx_data = (rx_frame->
data);
 
  588         rx_frame->
length = frame_length;
 
  592         HAL_SPI_TRANSFER_WRITE(0);
 
  593         HAL_SPI_TRANSFER_WAIT();
 
  595             *rx_data++ = HAL_SPI_TRANSFER_READ();
 
  596             HAL_SPI_TRANSFER_WRITE(0);
 
  607             HAL_SPI_TRANSFER_WAIT();
 
  609         } 
while (--frame_length > 0);
 
  613         rx_frame->
lqi = HAL_SPI_TRANSFER_READ();
 
  618         rx_frame->
crc   = 
true;
 
  621     HAL_SPI_TRANSFER_CLOSE();
 
  636 #if defined(__AVR_ATmega128RFA1__) 
  638     tx_buffer=(uint8_t *)0x180;  
 
  643     _SFR_MEM8(tx_buffer++) = length;
 
  649 #if !RF230_CONF_CHECKSUM 
  652     do  _SFR_MEM8(tx_buffer++)= *write_buffer++; 
while (--length);
 
  660     HAL_SPI_TRANSFER_OPEN();
 
  663     HAL_SPI_TRANSFER(0x60);
 
  664     HAL_SPI_TRANSFER(length);
 
  670 #if !RF230_CONF_CHECKSUM 
  673     do HAL_SPI_TRANSFER(*write_buffer++); 
while (--length);
 
  675     HAL_SPI_TRANSFER_CLOSE();
 
  688 #if 0  //Uses 80 bytes (on Raven) omit unless needed 
  690 hal_sram_read(uint8_t address, uint8_t length, uint8_t *data)
 
  692     HAL_SPI_TRANSFER_OPEN();
 
  695     HAL_SPI_TRANSFER(0x00);
 
  696     HAL_SPI_TRANSFER(address);
 
  698     HAL_SPI_TRANSFER_WRITE(0);
 
  699     HAL_SPI_TRANSFER_WAIT();
 
  703         *data++ = HAL_SPI_TRANSFER_READ();
 
  704         HAL_SPI_TRANSFER_WRITE(0);
 
  705         HAL_SPI_TRANSFER_WAIT();
 
  706     } 
while (--length > 0);
 
  708     HAL_SPI_TRANSFER_CLOSE();
 
  721 #if 0  //omit unless needed 
  725     HAL_SPI_TRANSFER_OPEN();
 
  728     HAL_SPI_TRANSFER(0x40);
 
  731     HAL_SPI_TRANSFER(address);
 
  735         HAL_SPI_TRANSFER(*data++);
 
  736     } 
while (--length > 0);
 
  738     HAL_SPI_TRANSFER_CLOSE();
 
  754 void rf230_interrupt(
void);
 
  757 extern uint8_t rxframe_head,rxframe_tail;
 
  762 volatile char rf230interruptflag;
 
  763 #define INTERRUPTDEBUG(arg) rf230interruptflag=arg 
  765 #define INTERRUPTDEBUG(arg) 
  768 #if defined(__AVR_ATmega128RFA1__) 
  773 ISR(TRX24_RX_END_vect)
 
  776 #if RF230_CONF_AUTOACK 
  782         if (rxframe[rxframe_tail].length) {DEBUGFLOW(
'0');} 
else ;
 
  784 #ifdef RF230_MIN_RX_POWER                 
  787         if (rf230_last_rssi >= RF230_MIN_RX_POWER) {
 
  793                 rxframe_tail++;
if (rxframe_tail >= RF230_CONF_RX_BUFFERS) rxframe_tail=0;
 
  798 ISR(TRX24_RX_START_vect)
 
  802 #if !RF230_CONF_AUTOACK 
  809 ISR(TRX24_PLL_LOCK_vect)
 
  815 ISR(TRX24_PLL_UNLOCK_vect)
 
  820 extern volatile uint8_t rf230_wakewait, rf230_txendwait,rf230_ccawait;
 
  823 ISR(TRX24_AWAKE_vect)
 
  830 ISR(TRX24_TX_END_vect)
 
  837 ISR(TRX24_XAH_AMI_vect)
 
  843 ISR(TRX24_CCA_ED_DONE_vect)
 
  853     volatile uint8_t state;
 
  854     uint8_t interrupt_source; 
 
  861     HAL_SPI_TRANSFER_OPEN();
 
  867     HAL_SPI_TRANSFER_WAIT(); 
 
  869     interrupt_source = HAL_SPI_TRANSFER(0);
 
  871     HAL_SPI_TRANSFER_CLOSE();
 
  877 #if !RF230_CONF_AUTOACK 
  878 #if 0  // 3-clock shift and add is faster on machines with no hardware multiply 
  881         rf230_last_rssi = (rf230_last_rssi <<1)  + rf230_last_rssi;
 
  882 #else  // Faster with 1-clock multiply. Raven and Jackdaw have 2-clock multiply so same speed while saving 2 bytes of program memory 
  894          if (rxframe[rxframe_tail].length) INTERRUPTDEBUG(42); 
else INTERRUPTDEBUG(12);
 
  896 #ifdef RF230_MIN_RX_POWER                 
  899 #if RF230_CONF_AUTOACK 
  903          if (rf230_last_rssi >= RF230_MIN_RX_POWER) {
 
  906            rxframe_tail++;
if (rxframe_tail >= RF230_CONF_RX_BUFFERS) rxframe_tail=0;
 
  908 #ifdef RF230_MIN_RX_POWER 
  928         trx_isr_mask &= ~HAL_BAT_LOW_MASK;