54 #include <util/delay_basic.h>
55 #define delay_us( us ) ( _delay_loop_2(1+((unsigned long long)us*F_CPU)/4000000UL) )
57 #include <avr/pgmspace.h>
58 #elif defined(__MSP430__)
70 #define WITH_SEND_CCA 0
73 #if RF230_CONF_TIMESTAMPS
75 #define TIMESTAMP_LEN 3
77 #define TIMESTAMP_LEN 0
83 #ifndef RF230_CONF_CHECKSUM
84 #define RF230_CONF_CHECKSUM 0
88 #ifndef RF230_CONF_AUTOACK
89 #define RF230_CONF_AUTOACK 1
93 #if RF230_CONF_AUTOACK
94 static bool is_promiscuous;
99 #ifndef RF230_CONF_FRAME_RETRIES
100 #ifdef RF230_CONF_AUTORETRIES
101 #define RF230_CONF_FRAME_RETRIES RF230_CONF_AUTORETRIES
103 #define RF230_CONF_FRAME_RETRIES 0
119 #if RF320_CONF_INSERTACK && RF230_CONF_FRAME_RETRIES
120 #define RF230_INSERTACK 1
121 uint8_t ack_pending,ack_seqnum;
130 #ifndef RF230_CONF_CSMA_RETRIES
131 #define RF230_CONF_CSMA_RETRIES 5
135 #if RF230_CONF_CHECKSUM || defined(RF230BB_HOOK_TX_PACKET)
138 #define CHECKSUM_LEN 2
141 #define AUX_LEN (CHECKSUM_LEN + TIMESTAMP_LEN + FOOTER_LEN)
142 #if AUX_LEN != CHECKSUM_LEN
143 #warning RF230 Untested Configuration!
148 uint8_t authority_level;
151 #define FOOTER1_CRC_OK 0x80
152 #define FOOTER1_CORRELATION 0x7f
157 #define RADIOALWAYSON 1
159 #define RADIOALWAYSON 0
160 #define RADIOSLEEPSWHENOFF 1
166 #define PRINTF(FORMAT,args...) printf_P(PSTR(FORMAT),##args)
167 #define PRINTSHORT(FORMAT,args...) printf_P(PSTR(FORMAT),##args)
170 #define PRINTSHORT(...)
186 uint16_t RF230_sendpackets,RF230_receivepackets,RF230_sendfail,RF230_receivefail;
189 #if RADIO_CONF_CALIBRATE_INTERVAL
192 uint8_t rf230_calibrate;
193 uint8_t rf230_calibrated;
198 extern uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE];
199 #define DEBUGFLOW(c) if (debugflowsize<(DEBUGFLOWSIZE-1)) debugflow[debugflowsize++]=c
205 #if RF230_CONF_TIMESTAMPS
206 rtimer_clock_t rf230_time_of_arrival, rf230_time_of_departure;
208 int rf230_authority_level_of_sender;
210 static rtimer_clock_t setup_time_for_transmission;
211 static unsigned long total_time_for_transmission, total_transmission_len;
212 static int num_transmissions;
215 #if defined(__AVR_ATmega128RFA1__) || defined(__AVR_ATmega128RFR2__) || defined(__AVR_ATmega256RFR2__)
216 volatile uint8_t rf230_wakewait, rf230_txendwait, rf230_ccawait;
219 uint8_t
volatile rf230_pending;
237 PROCESS(rf230_process,
"RF230 driver");
240 int rf230_interrupt(
void);
242 static int rf230_on(
void);
243 static int rf230_off(
void);
245 static int rf230_read(
void *buf,
unsigned short bufsize);
247 static int rf230_prepare(
const void *data,
unsigned short len);
248 static int rf230_transmit(
unsigned short len);
249 static int rf230_send(
const void *data,
unsigned short len);
251 static int rf230_receiving_packet(
void);
252 static int rf230_pending_packet(
void);
253 static int rf230_cca(
void);
255 uint8_t rf230_last_correlation,rf230_last_rssi,rf230_smallest_rssi;
258 static radio_result_t
261 return RADIO_RESULT_NOT_SUPPORTED;
264 static radio_result_t
267 return RADIO_RESULT_NOT_SUPPORTED;
270 static radio_result_t
271 get_object(radio_param_t param,
void *dest,
size_t size)
273 return RADIO_RESULT_NOT_SUPPORTED;
276 static radio_result_t
277 set_object(radio_param_t param,
const void *src,
size_t size)
279 return RADIO_RESULT_NOT_SUPPORTED;
290 rf230_receiving_packet,
291 rf230_pending_packet,
300 uint8_t RF230_receive_on;
301 static uint8_t channel;
304 uint8_t rxframe_head,rxframe_tail;
367 bool sleeping =
false;
408 if (RF230_receive_on) DEBUGFLOW(
'-');
432 if (rf230_isidle())
break;
438 static uint8_t rpc = 0xFF;
440 rf230_set_rpc(uint8_t data)
472 uint8_t current_state;
475 if (!((new_state ==
TRX_OFF) ||
476 (new_state ==
RX_ON) ||
492 if (new_state == current_state){
525 #if defined(__AVR_ATmega128RFR2__) || defined(__AVR_ATmega256RFR2__)
538 if (current_state != new_state) {
539 if (((new_state ==
RX_ON) && (current_state ==
BUSY_RX)) ||
543 DEBUGFLOW(
'N');DEBUGFLOW(
'A'+new_state);DEBUGFLOW(
'A'+
radio_get_trx_state());DEBUGFLOW(
'N');
552 rf230_set_promiscuous_mode(
bool isPromiscuous) {
553 #if RF230_CONF_AUTOACK
554 is_promiscuous = isPromiscuous;
561 rf230_is_ready_to_send() {
576 rxframe[rxframe_head].
length=0;
578 if (rxframe_head >= RF230_CONF_RX_BUFFERS) {
582 if (rxframe[rxframe_head].length) {
594 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
595 RF230_receive_on = 1;
596 #ifdef RF230BB_HOOK_RADIO_ON
597 RF230BB_HOOK_RADIO_ON();
602 ENERGEST_ON(ENERGEST_TYPE_LED_RED);
603 #if RF230BB_CONF_LEDONPORTE1
606 #if defined(__AVR_ATmega128RFA1__) || defined(__AVR_ATmega128RFR2__) || defined(__AVR_ATmega256RFR2__)
616 for (i=0;i<10000;i++) {
617 if (!rf230_wakewait)
break;
635 #if RF230_CONF_AUTOACK
646 RF230_receive_on = 0;
652 #if RF230BB_CONF_LEDONPORTE1
655 #ifdef RF230BB_HOOK_RADIO_OFF
656 RF230BB_HOOK_RADIO_OFF();
673 #if RADIOSLEEPSWHENOFF
676 ENERGEST_OFF(ENERGEST_TYPE_LED_RED);
680 ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
684 set_txpower(uint8_t power)
686 if (power > TX_PWR_17_2DBM){
687 power=TX_PWR_17_2DBM;
691 PRINTF(
"rf230_set_txpower:Sleeping");
697 void rf230_setpendingbit(uint8_t value)
711 #define AVR_ENTER_CRITICAL_REGION( ) {uint8_t volatile saved_sreg = SREG; cli( )
712 #define AVR_LEAVE_CRITICAL_REGION( ) SREG = saved_sreg;}
713 uint8_t osccal_original,osccal_calibrated;
725 uint8_t osccal_original = OSCCAL;
726 volatile uint16_t temp;
745 uint8_t counter = 128;
751 while (ASSR & ((1 << TCN2UB)|(1 << OCR2AUB)|(1 << TCR2AUB)|(1 << TCR2BUB))) { ; }
762 while (!(TIFR2 & (1 << TOV2))){
770 #define cal_upper 32812 //(31250*1.05) // 32812 = 0x802c
771 #define cal_lower 29687 //(31250*0.95) // 29687 = 0x73f7
773 if (temp < cal_lower) {
775 if (OSCCAL==0x7e)
break;
776 if (OSCCAL==0xff)
break;
778 }
else if (temp > cal_upper) {
780 if (OSCCAL==0x81)
break;
781 if (OSCCAL==0x00)
break;
789 }
while ((counter != 0) && (
false == cal_ok));
791 osccal_calibrated=OSCCAL;
792 if (
true != cal_ok) {
794 OSCCAL = osccal_original;
797 OSCCAL = osccal_original;
825 for (i=0;i<RF230_CONF_RX_BUFFERS;i++) {
828 rxframe_head=0;rxframe_tail=0;
854 if ((tvers != RF230_REVA) && (tvers != RF230_REVB))
855 PRINTF(
"rf230: Unsupported version %u\n",tvers);
856 if (tmanu != SUPPORTED_MANUFACTURER_ID)
857 PRINTF(
"rf230: Unsupported manufacturer ID %u\n",tmanu);
859 PRINTF(
"rf230: Version %u, ID %u\n",tvers,tmanu);
873 void rf230_warm_reset(
void) {
874 #if RF230_CONF_SNEEZER && JACKDAW
876 #warning Manipulating PORTB pins for RF230 Sneezer mode!
886 (RF230_CONF_FRAME_RETRIES > 0) ? (RF230_CONF_FRAME_RETRIES - 1) : 0 );
902 #ifdef RF230_MIN_RX_POWER
903 #if RF230_MIN_RX_POWER > 84
904 #warning rf231 power threshold clipped to -48dBm by hardware register
906 #elif RF230_MIN_RX_POWER < 0
907 #error RF230_MIN_RX_POWER can not be negative!
914 #ifdef RF230_CONF_CCA_THRES
915 #if RF230_CONF_CCA_THRES < -91
917 #warning RF230_CONF_CCA_THRES below hardware limit, setting to -91dBm
920 #elif RF230_CONF_CCA_THRES > -61
922 #warning RF230_CONF_CCA_THRES above hardware limit, setting to -61dBm
931 #if RF230_CONF_CHECKSUM
938 #ifdef RF230_MAX_TX_POWER
939 set_txpower(RF230_MAX_TX_POWER);
946 rf230_transmit(
unsigned short payload_len)
951 #if RF230_CONF_TIMESTAMPS
952 struct timestamp timestamp;
958 #if defined(__AVR_ATmega128RFA1__) || defined(__AVR_ATmega128RFR2__) || defined(__AVR_ATmega256RFR2__)
959 ENERGEST_ON(ENERGEST_TYPE_LED_RED);
960 #if RF230BB_CONF_LEDONPORTE1
967 for (i=0;i<10000;i++) {
968 if (!rf230_wakewait)
break;
979 #if RADIO_CONF_CALIBRATE_INTERVAL
981 if (rf230_calibrate) {
994 if(RF230_receive_on) {
995 ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
998 #if RF230_CONF_FRAME_RETRIES
1008 if(packetbuf_attr(PACKETBUF_ATTR_RADIO_TXPOWER) > 0) {
1010 txpower = rf230_get_txpower();
1012 set_txpower(packetbuf_attr(PACKETBUF_ATTR_RADIO_TXPOWER) - 1);
1015 total_len = payload_len + AUX_LEN;
1017 #if RF230_CONF_TIMESTAMPS
1021 ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
1034 PRINTF(
"rf230_transmit: %d\n", (
int)total_len);
1043 for (i=0;i<total_len;i++) PRINTF(
" %02x",buffer[i]);
1049 RF230_sendpackets++;
1057 #if RF230_CONF_FRAME_RETRIES
1060 tx_result=RADIO_TX_OK;
1063 #ifdef ENERGEST_CONF_LEVELDEVICE_LEVELS
1064 ENERGEST_OFF_LEVEL(ENERGEST_TYPE_TRANSMIT,rf230_get_txpower());
1068 if(packetbuf_attr(PACKETBUF_ATTR_RADIO_TXPOWER) > 0) {
1069 set_txpower(txpower & 0xff);
1072 #if RF230_CONF_TIMESTAMPS
1073 setup_time_for_transmission = txtime - timestamp.time;
1075 if(num_transmissions < 10000) {
1077 total_transmission_len += total_len;
1078 num_transmissions++;
1083 ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT);
1084 if(RF230_receive_on) {
1086 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
1094 PRINTF(
"rf230_transmit: turning radio off\n");
1103 tx_result=RADIO_TX_OK;
1106 if (tx_result==RADIO_TX_OK) {
1107 RIMESTATS_ADD(lltx);
1108 #if NETSTACK_CONF_WITH_RIME
1109 if(packetbuf_attr(PACKETBUF_ATTR_RELIABLE))
1110 RIMESTATS_ADD(ackrx);
1114 if (!((buffer[5]==0xff) && (buffer[6]==0xff)) && (buffer[0]&(1<<6)))
1118 }
else if (tx_result==3) {
1120 RIMESTATS_ADD(contentiondrop);
1121 PRINTF(
"rf230_transmit: Transmission never started\n");
1122 tx_result = RADIO_TX_COLLISION;
1123 }
else if (tx_result==5) {
1125 tx_result = RADIO_TX_NOACK;
1126 PRINTF(
"rf230_transmit: ACK not received\n");
1127 RIMESTATS_ADD(badackrx);
1128 }
else if (tx_result==7) {
1130 tx_result = RADIO_TX_ERR;
1137 rf230_prepare(
const void *payload,
unsigned short payload_len)
1140 uint8_t total_len,*pbuf;
1141 #if RF230_CONF_TIMESTAMPS
1142 struct timestamp timestamp;
1144 #if RF230_CONF_CHECKSUM
1149 ack_seqnum=*(((uint8_t *)payload)+2);
1159 #if RF230_CONF_CHECKSUM
1160 checksum =
crc16_data(payload, payload_len, 0);
1164 total_len = payload_len + AUX_LEN;
1174 memcpy(pbuf,payload,payload_len);
1177 #if RF230_CONF_CHECKSUM
1178 memcpy(pbuf,&checksum,CHECKSUM_LEN);
1182 #if RF230_CONF_TIMESTAMPS
1185 memcpy(pbuf,×tamp,TIMESTAMP_LEN);
1186 pbuf+=TIMESTAMP_LEN;
1190 #ifdef RF230BB_HOOK_TX_PACKET
1191 #if !RF230_CONF_CHECKSUM
1194 checksum =
crc16_data(payload, payload_len, 0);
1195 memcpy(buffer+total_len-CHECKSUM_LEN,&checksum,CHECKSUM_LEN);
1198 RF230BB_HOOK_TX_PACKET(buffer,total_len);
1207 rf230_send(
const void *payload,
unsigned short payload_len)
1211 #ifdef RF230BB_HOOK_IS_SEND_ENABLED
1212 if(!RF230BB_HOOK_IS_SEND_ENABLED()) {
1217 if((ret=rf230_prepare(payload, payload_len))) {
1218 PRINTF(
"rf230_send: Unable to send, prep failed (%d)\n",ret);
1222 ret = rf230_transmit(payload_len);
1226 if (ret) RF230_sendfail++;
1235 if(RF230_receive_on == 0) {
1245 if (!rf230_isidle()) {
1247 PRINTF(
"rf230_off: busy receiving\r\n");
1258 if(RF230_receive_on) {
1268 rf230_get_channel(
void)
1276 rf230_set_channel(uint8_t c)
1279 PRINTF(
"rf230: Set Channel %u\n",c);
1286 rf230_listen_channel(uint8_t c)
1290 rf230_set_channel(c);
1295 rf230_set_pan_addr(
unsigned pan,
1297 const uint8_t ieee_addr[8])
1300 PRINTF(
"rf230: PAN=%x Short Addr=%x\n",pan,addr);
1305 abyte = (pan >> 8*1) & 0xFF;
1308 abyte = addr & 0xFF;
1310 abyte = (addr >> 8*1) & 0xFF;
1313 if (ieee_addr !=
NULL) {
1314 PRINTF(
"MAC=%x",*ieee_addr);
1316 PRINTF(
":%x",*ieee_addr);
1318 PRINTF(
":%x",*ieee_addr);
1320 PRINTF(
":%x",*ieee_addr);
1322 PRINTF(
":%x",*ieee_addr);
1324 PRINTF(
":%x",*ieee_addr);
1326 PRINTF(
":%x",*ieee_addr);
1328 PRINTF(
":%x",*ieee_addr);
1337 #if RF230_CONF_TIMESTAMPS
1338 static volatile rtimer_clock_t interrupt_time;
1339 static volatile int interrupt_time_set;
1342 rf230_interrupt(
void)
1346 if (RF230_receive_on) {
1349 #if RF230_CONF_TIMESTAMPS
1351 interrupt_time_set = 1;
1358 #if RADIOSTATS //TODO:This will double count buffered packets
1359 RF230_receivepackets++;
1361 RIMESTATS_ADD(llrx);
1366 rxframe[rxframe_head].
length=0;
1378 uint8_t rf230processflag;
1379 #define RF230PROCESSFLAG(arg) rf230processflag=arg
1381 #define RF230PROCESSFLAG(arg)
1388 RF230PROCESSFLAG(99);
1392 RF230PROCESSFLAG(42);
1403 PRINTF(
"rf230_read: %u bytes lqi %u\n",len,rf230_last_correlation);
1405 if(is_promiscuous) {
1419 for (i=0;i<len;i++) putchar(rxdata[i]);
1428 for (i=0;i<len+AUX_LEN;i++) PRINTF(
" %02x",rxdata[i]);
1434 RF230PROCESSFLAG(1);
1437 RF230PROCESSFLAG(2);
1438 NETSTACK_RDC.input();
1441 RF230_receivefail++;
1458 rf230_read(
void *buf,
unsigned short bufsize)
1460 uint8_t len,*framep;
1462 uint8_t footer[FOOTER_LEN];
1464 #if RF230_CONF_CHECKSUM
1467 #if RF230_CONF_TIMESTAMPS
1472 if(ack_pending && bufsize == 3){
1474 uint8_t *buff=(uint8_t *)buf;
1483 len=rxframe[rxframe_head].
length;
1485 #if RADIOALWAYSON && DEBUGFLOWSIZE
1486 if (RF230_receive_on==0) {
if (debugflow[debugflowsize-1]!=
'z') DEBUGFLOW(
'z');}
1492 #if RF230_CONF_TIMESTAMPS
1493 if(interrupt_time_set) {
1494 rf230_time_of_arrival = interrupt_time;
1495 interrupt_time_set = 0;
1497 rf230_time_of_arrival = 0;
1499 rf230_time_of_departure = 0;
1506 RIMESTATS_ADD(badsynch);
1510 if(len <= AUX_LEN) {
1514 RIMESTATS_ADD(tooshort);
1518 if(len - AUX_LEN > bufsize) {
1522 RIMESTATS_ADD(toolong);
1527 framep=&(rxframe[rxframe_head].
data[0]);
1528 memcpy(buf,framep,len-AUX_LEN+CHECKSUM_LEN);
1529 rf230_last_correlation = rxframe[rxframe_head].
lqi;
1535 framep+=len-AUX_LEN;
1536 #if RF230_CONF_CHECKSUM
1537 memcpy(&checksum,framep,CHECKSUM_LEN);
1539 framep+=CHECKSUM_LEN;
1540 #if RF230_CONF_TIMESTAMPS
1541 memcpy(&t,framep,TIMESTAMP_LEN);
1543 framep+=TIMESTAMP_LEN;
1545 memcpy(footer,framep,FOOTER_LEN);
1547 #if RF230_CONF_CHECKSUM
1548 if(checksum !=
crc16_data(buf, len - AUX_LEN, 0)) {
1554 if(footer[1] & FOOTER1_CRC_OK &&
1555 checksum ==
crc16_data(buf, len - AUX_LEN, 0)) {
1560 #if 0 //more general
1561 rf230_last_rssi = rf230_get_raw_rssi();
1563 #if RF230_CONF_AUTOACK
1573 if ((rf230_smallest_rssi==0) || (rf230_last_rssi<rf230_smallest_rssi))
1574 rf230_smallest_rssi=rf230_last_rssi;
1577 packetbuf_set_attr(PACKETBUF_ATTR_RSSI, rf230_last_rssi);
1578 packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, rf230_last_correlation);
1582 #if RF230_CONF_TIMESTAMPS
1583 rf230_time_of_departure =
1585 setup_time_for_transmission +
1586 (total_time_for_transmission * (len - 2)) / total_transmission_len;
1588 rf230_authority_level_of_sender = t.authority_level;
1590 packetbuf_set_attr(PACKETBUF_ATTR_TIMESTAMP, t.time);
1593 #if RF230_CONF_CHECKSUM
1598 RIMESTATS_ADD(badcrc);
1604 #ifdef RF230BB_HOOK_RX_PACKET
1605 RF230BB_HOOK_RX_PACKET(buf,len);
1609 return len - AUX_LEN;
1613 rf230_set_txpower(uint8_t power)
1619 rf230_get_txpower(
void)
1621 uint8_t power = TX_PWR_UNDEFINED;
1623 PRINTF(
"rf230_get_txpower:Sleeping");
1632 rf230_get_raw_rssi(
void)
1635 bool radio_was_off = 0;
1638 if(!RF230_receive_on) {
1650 #if 0 // 3-clock shift and add is faster on machines with no hardware multiply
1653 rssi = (rssi << 1) + rssi;
1654 #else // 1 or 2 clock multiply, or compiler with correct optimization
1671 uint8_t radio_was_off = 0;
1676 if(RF230_receive_on) {
1681 if (!rf230_isidle()) {
1691 ENERGEST_ON(ENERGEST_TYPE_LED_YELLOW);
1698 #if defined(__AVR_ATmega128RFA1__) || defined(__AVR_ATmega128RFR2__) || defined(__AVR_ATmega256RFR2__)
1699 #if 1 //interrupt method
1702 #ifdef RF230_MIN_RX_POWER
1716 uint8_t
volatile saved_sreg = SREG;
1719 while (rf230_ccawait) {}
1724 #ifdef RF230_CONF_CCA_THRES
1731 #if RF230_CONF_AUTOACK
1736 #ifdef RF230_MIN_RX_POWER
1746 #ifdef RF230_CONF_CCA_THRES
1758 { uint8_t
volatile saved_sreg = SREG;
1763 while ((cca & 0x80) == 0 ) {
1773 ENERGEST_OFF(ENERGEST_TYPE_LED_YELLOW);
1789 rf230_receiving_packet(
void)
1791 uint8_t radio_state;
1805 rf230_pending_packet(
void)
1808 if(ack_pending == 1)
return 1;
1810 return rf230_pending;
1813 #if RF230_CONF_SNEEZER && JACKDAW
1819 void rf230_start_sneeze(
void) {
void hal_init(void)
This function initializes the Hardware Abstraction Layer.
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
radio_trx_timing_t
This enumeration defines the necessary timing information for the AT86RF230 radio transceiver...
#define RG_IEEE_ADDR_5
Offset for register IEEE_ADDR_5.
#define SR_PLL_DCU_START
Access parameters for sub-register PLL_DCU_START in register RG_PLL_DCU.
Transition time from P_ON to TRX_OFF.
void process_poll(struct process *p)
Request a process to be polled.
void hal_register_write(uint8_t address, uint8_t value)
This function writes a new value to one of the radio transceiver's registers.
Time it takes to do a ED measurement.
#define RG_IRQ_MASK
Offset for register IRQ_MASK.
The end-user tried to do an invalid state transition.
#define SR_AACK_SET_PD
Access parameters for AACK_SET_PD bit in register RG_CSMA_SEED_1.
#define SR_TRX_CMD
Access parameters for sub-register TRX_CMD in register RG_TRX_STATE.
Transition time from SLEEP to TRX_OFF.
#define RG_PHY_RSSI
Offset for register PHY_RSSI.
radio_status_t radio_set_trx_state(uint8_t new_state)
This function will change the current state of the radio transceiver's internal state machine...
static uip_ds6_addr_t * addr
Pointer to a router list entry.
#define SR_MAX_FRAME_RETRIES
Access parameters for sub-register MAX_FRAME_RETRIES in register RG_XAH_CTRL_0.
uint8_t hal_subregister_read(uint8_t address, uint8_t mask, uint8_t position)
This function reads the value of a specific subregister.
#define RG_IEEE_ADDR_0
Offset for register IEEE_ADDR_0.
#define hal_set_rst_high()
This macro pulls the RST pin high.
void packetbuf_clear(void)
Clear and reset the packetbuf.
rtimer_clock_t timesynch_time(void)
Get the current time-synchronized time.
The requested service timed out.
#define SR_TRAC_STATUS
Access parameters for sub-register TRAC_STATUS in register RG_TRX_STATE.
#define SR_RSSI
Access parameters for sub-register RSSI in register RG_PHY_RSSI.
#define HAL_LEAVE_CRITICAL_REGION()
This macro must always be used in conjunction with HAL_ENTER_CRITICAL_REGION so that interrupts are e...
#define BUSY_RX
Constant BUSY_RX for sub-register SR_TRX_STATUS.
The requested service was performed successfully.
#define PROCESS_END()
Define the end of a process.
#define PROCESS(name, strname)
Declare a process.
uint8_t length
Length of frame.
#define PROCESS_THREAD(name, ev, data)
Define the body of a process.
#define SR_TX_PWR
Access parameters for sub-register TX_PWR in register RG_PHY_TX_PWR.
#define RG_PAN_ID_1
Offset for register PAN_ID_1.
#define PACKETBUF_SIZE
The size of the packetbuf, in bytes.
This file contains radio driver code.
#define RG_SHORT_ADDR_0
Offset for register SHORT_ADDR_0.
#define AVR_LEAVE_CRITICAL_REGION()
This macro must always be used in conjunction with AVR_ENTER_CRITICAL_REGION so that interrupts are e...
#define SR_CCA_MODE
Access parameters for sub-register CCA_MODE in register RG_PHY_CC_CCA.
The structure of a device driver for a radio in Contiki.
#define RG_IEEE_ADDR_1
Offset for register IEEE_ADDR_1.
bool radio_is_sleeping(void)
This function checks if the radio transceiver is sleeping.
#define STATE_TRANSITION
Constant STATE_TRANSITION for sub-register SR_TRX_STATUS.
void hal_subregister_write(uint8_t address, uint8_t mask, uint8_t position, uint8_t value)
This function writes a new value to one of the radio transceiver's subregisters.
Header file for the Rime buffer (packetbuf) management
#define PORTE
Peripheral PORTE base pointer.
#define hal_get_slptr()
Read current state of the SLP_TR pin (High/Low).
radio_result_t(* set_value)(radio_param_t param, radio_value_t value)
Set a radio parameter value.
#define RF230_MAX_TX_FRAME_LENGTH
127 Byte PSDU.
#define SR_MAX_CSMA_RETRIES
Access parameters for sub-register MAX_CSMA_RETRIES in register RG_XAH_CTRL_0.
#define SR_TRX_STATUS
Access parameters for sub-register TRX_STATUS in register RG_TRX_STATUS.
#define SR_CHANNEL
Access parameters for sub-register CHANNEL in register RG_PHY_CC_CCA.
uint8_t hal_register_read(uint8_t address)
This function reads data from one of the radio transceiver's registers.
#define AVR_ENTER_CRITICAL_REGION()
This macro will protect the following code from interrupts.
#define RG_IEEE_ADDR_3
Offset for register IEEE_ADDR_3.
#define SR_CCA_ED_THRES
Access parameters for sub-register CCA_ED_THRES in register RG_CCA_THRES.
Time it takes to do a CCA.
#define PLL_ON
Constant PLL_ON for sub-register SR_TRX_STATUS.
#define RG_SHORT_ADDR_1
Offset for register SHORT_ADDR_1.
#define SR_TX_AUTO_CRC_ON
Access parameters for sub-register TX_AUTO_CRC_ON in register RG_PHY_TX_PWR.
#define NULL
The null pointer.
#define hal_set_slptr_high()
This macro pulls the SLP_TR pin high.
#define RG_PAN_ID_0
Offset for register PAN_ID_0.
int radio_value_t
Each radio has a set of parameters that designate the current configuration and state of the radio...
#define CMD_FORCE_TRX_OFF
Constant CMD_FORCE_TRX_OFF for sub-register SR_TRX_CMD.
uint8_t radio_get_trx_state(void)
This function return the Radio Transceivers current state.
#define RG_CSMA_BE
Offset for register CSMA_BE.
#define RG_IEEE_ADDR_7
Offset for register IEEE_ADDR_7.
radio_result_t(* get_object)(radio_param_t param, void *dest, size_t size)
Get a radio parameter object.
#define hal_set_rst_low()
This macro pulls the RST pin low.
void calibrate_rc_osc_32k(void)
Calibrate the internal RC oscillator.
#define RG_TRX_STATUS
Offset for register TRX_STATUS.
Transition time from TRX_OFF to: RX_ON, PLL_ON, TX_ARET_ON and RX_AACK_ON.
#define hal_set_slptr_low()
This macro pulls the SLP_TR pin low.
#define BUSY_TX_ARET
Constant BUSY_TX_ARET for sub-register SR_TRX_STATUS.
void radio_reset_state_machine(void)
This function will reset the state machine (to TRX_OFF) from any of its states, except for the SLEEP ...
Time to hold the RST pin low during reset.
#define TX_ARET_ON
Constant TX_ARET_ON for sub-register SR_TRX_STATUS.
#define SR_PLL_CF_START
Access parameters for sub-register PLL_CF_START in register RG_PLL_CF.
#define BUSY_RX_AACK
Constant BUSY_RX_AACK for sub-register SR_TRX_STATUS.
void packetbuf_set_datalen(uint16_t len)
Set the length of the data in the packetbuf.
Transition time from *_NOCLK to being awake.
#define RG_VERSION_NUM
Offset for register VERSION_NUM.
void process_start(struct process *p, process_data_t data)
Start a process.
#define PROCESS_YIELD_UNTIL(c)
Yield the currently running process until a condition occurs.
radio_result_t(* get_value)(radio_param_t param, radio_value_t *value)
Get a radio parameter value.
#define RG_IEEE_ADDR_2
Offset for register IEEE_ADDR_2.
uint8_t lqi
LQI value for received frame.
#define RG_RX_SYN
Offset for register RX_SYN.
#define RG_IEEE_ADDR_4
Offset for register IEEE_ADDR_4.
One or more of the supplied function arguments are invalid.
#define HAL_ENTER_CRITICAL_REGION()
This macro will protect the following code from interrupts.
Transition time from VCC is applied to P_ON - most favorable case!
Header file for Rime statistics
radio_status_t
This enumeration defines the possible return values for the TAT API functions.
#define RG_MAN_ID_0
Offset for register MAN_ID_0.
#define RX_AACK_ON
Constant RX_AACK_ON for sub-register SR_TRX_STATUS.
#define RX_ON
Constant RX_ON for sub-register SR_TRX_STATUS.
Transition time from PLL active state to another.
#define TRX_OFF
Constant TRX_OFF for sub-register SR_TRX_STATUS.
Maximum time it should take for the PLL to lock.
void hal_frame_write(uint8_t *write_buffer, uint8_t length)
This function will download a frame to the radio transceiver's frame buffer.
Header file for a simple time synchronization mechanism
Maximum time it should take to do the filter tuning.
unsigned short crc16_data(const unsigned char *data, int len, unsigned short acc)
Calculate the CRC16 over a data area.
#define BUSY_TX
Constant BUSY_TX for sub-register SR_TRX_STATUS.
#define RG_CSMA_SEED_0
Offset for register CSMA_SEED_0.
Include file for the Contiki low-layer network stack (NETSTACK)
Time it takes to execute the FORCE_TRX_OFF command.
#define RG_IEEE_ADDR_6
Offset for register IEEE_ADDR_6.
uint8_t data[HAL_MAX_FRAME_LENGTH]
Actual frame data.
#define RG_PHY_ED_LEVEL
Offset for register PHY_ED_LEVEL.
radio_result_t(* set_object)(radio_param_t param, const void *src, size_t size)
Set a radio parameter object.
int timesynch_authority_level(void)
Get the current authority level of the time-synchronized time.
Header file for the CRC16 calculcation
#define PROCESS_BEGIN()
Define the beginning of a process.
#define SR_CCA_REQUEST
Access parameters for sub-register CCA_REQUEST in register RG_PHY_CC_CCA.
#define PORTB
Peripheral PORTB base pointer.
This struct defines the rx data container.