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__)
216 volatile uint8_t rf230_wakewait, rf230_txendwait, rf230_ccawait;
219 uint8_t
volatile rf230_pending;
237 PROCESS(rf230_process,
"RF230 driver");
240 static int rf230_on(
void);
241 static int rf230_off(
void);
243 static int rf230_read(
void *buf,
unsigned short bufsize);
245 static int rf230_prepare(
const void *data,
unsigned short len);
246 static int rf230_transmit(
unsigned short len);
247 static int rf230_send(
const void *data,
unsigned short len);
249 static int rf230_receiving_packet(
void);
250 static int rf230_pending_packet(
void);
251 static int rf230_cca(
void);
253 uint8_t rf230_last_correlation,rf230_last_rssi,rf230_smallest_rssi;
256 static radio_result_t
259 return RADIO_RESULT_NOT_SUPPORTED;
262 static radio_result_t
265 return RADIO_RESULT_NOT_SUPPORTED;
268 static radio_result_t
269 get_object(radio_param_t param,
void *dest,
size_t size)
271 return RADIO_RESULT_NOT_SUPPORTED;
274 static radio_result_t
275 set_object(radio_param_t param,
const void *src,
size_t size)
277 return RADIO_RESULT_NOT_SUPPORTED;
288 rf230_receiving_packet,
289 rf230_pending_packet,
298 uint8_t RF230_receive_on;
299 static uint8_t channel;
302 uint8_t rxframe_head,rxframe_tail;
365 bool sleeping =
false;
406 if (RF230_receive_on) DEBUGFLOW(
'-');
430 if (rf230_isidle())
break;
456 uint8_t current_state;
459 if (!((new_state ==
TRX_OFF) ||
460 (new_state ==
RX_ON) ||
476 if (new_state == current_state){
518 if (current_state != new_state) {
519 if (((new_state ==
RX_ON) && (current_state ==
BUSY_RX)) ||
523 DEBUGFLOW(
'N');DEBUGFLOW(
'A'+new_state);DEBUGFLOW(
'A'+
radio_get_trx_state());DEBUGFLOW(
'N');
532 rf230_set_promiscuous_mode(
bool isPromiscuous) {
533 #if RF230_CONF_AUTOACK
534 is_promiscuous = isPromiscuous;
541 rf230_is_ready_to_send() {
555 rxframe[rxframe_head].
length=0;
562 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
563 RF230_receive_on = 1;
564 #ifdef RF230BB_HOOK_RADIO_ON
565 RF230BB_HOOK_RADIO_ON();
570 ENERGEST_ON(ENERGEST_TYPE_LED_RED);
571 #if RF230BB_CONF_LEDONPORTE1
574 #if defined(__AVR_ATmega128RFA1__)
584 for (i=0;i<10000;i++) {
585 if (!rf230_wakewait)
break;
603 #if RF230_CONF_AUTOACK
614 RF230_receive_on = 0;
620 #if RF230BB_CONF_LEDONPORTE1
623 #ifdef RF230BB_HOOK_RADIO_OFF
624 RF230BB_HOOK_RADIO_OFF();
641 #if RADIOSLEEPSWHENOFF
644 ENERGEST_OFF(ENERGEST_TYPE_LED_RED);
648 ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
652 set_txpower(uint8_t power)
654 if (power > TX_PWR_17_2DBM){
655 power=TX_PWR_17_2DBM;
659 PRINTF(
"rf230_set_txpower:Sleeping");
665 void rf230_setpendingbit(uint8_t value)
679 #define AVR_ENTER_CRITICAL_REGION( ) {uint8_t volatile saved_sreg = SREG; cli( )
680 #define AVR_LEAVE_CRITICAL_REGION( ) SREG = saved_sreg;}
681 uint8_t osccal_original,osccal_calibrated;
693 uint8_t osccal_original = OSCCAL;
694 volatile uint16_t temp;
713 uint8_t counter = 128;
719 while (ASSR & ((1 << TCN2UB)|(1 << OCR2AUB)|(1 << TCR2AUB)|(1 << TCR2BUB))) { ; }
730 while (!(TIFR2 & (1 << TOV2))){
738 #define cal_upper 32812 //(31250*1.05) // 32812 = 0x802c
739 #define cal_lower 29687 //(31250*0.95) // 29687 = 0x73f7
741 if (temp < cal_lower) {
743 if (OSCCAL==0x7e)
break;
744 if (OSCCAL==0xff)
break;
746 }
else if (temp > cal_upper) {
748 if (OSCCAL==0x81)
break;
749 if (OSCCAL==0x00)
break;
757 }
while ((counter != 0) && (
false == cal_ok));
759 osccal_calibrated=OSCCAL;
760 if (
true != cal_ok) {
762 OSCCAL = osccal_original;
765 OSCCAL = osccal_original;
793 for (i=0;i<RF230_CONF_RX_BUFFERS;i++) {
796 rxframe_head=0;rxframe_tail=0;
822 if ((tvers != RF230_REVA) && (tvers != RF230_REVB))
823 PRINTF(
"rf230: Unsupported version %u\n",tvers);
824 if (tmanu != SUPPORTED_MANUFACTURER_ID)
825 PRINTF(
"rf230: Unsupported manufacturer ID %u\n",tmanu);
827 PRINTF(
"rf230: Version %u, ID %u\n",tvers,tmanu);
841 void rf230_warm_reset(
void) {
842 #if RF230_CONF_SNEEZER && JACKDAW
844 #warning Manipulating PORTB pins for RF230 Sneezer mode!
854 (RF230_CONF_FRAME_RETRIES > 0) ? (RF230_CONF_FRAME_RETRIES - 1) : 0 );
870 #ifdef RF230_MIN_RX_POWER
871 #if RF230_MIN_RX_POWER > 84
872 #warning rf231 power threshold clipped to -48dBm by hardware register
874 #elif RF230_MIN_RX_POWER < 0
875 #error RF230_MIN_RX_POWER can not be negative!
882 #ifdef RF230_CONF_CCA_THRES
883 #if RF230_CONF_CCA_THRES < -91
885 #warning RF230_CONF_CCA_THRES below hardware limit, setting to -91dBm
888 #elif RF230_CONF_CCA_THRES > -61
890 #warning RF230_CONF_CCA_THRES above hardware limit, setting to -61dBm
899 #if RF230_CONF_CHECKSUM
906 #ifdef RF230_MAX_TX_POWER
907 set_txpower(RF230_MAX_TX_POWER);
914 rf230_transmit(
unsigned short payload_len)
919 #if RF230_CONF_TIMESTAMPS
920 struct timestamp timestamp;
926 #if defined(__AVR_ATmega128RFA1__)
927 ENERGEST_ON(ENERGEST_TYPE_LED_RED);
928 #if RF230BB_CONF_LEDONPORTE1
935 for (i=0;i<10000;i++) {
936 if (!rf230_wakewait)
break;
947 #if RADIO_CONF_CALIBRATE_INTERVAL
949 if (rf230_calibrate) {
962 if(RF230_receive_on) {
963 ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
966 #if RF230_CONF_FRAME_RETRIES
976 if(packetbuf_attr(PACKETBUF_ATTR_RADIO_TXPOWER) > 0) {
978 txpower = rf230_get_txpower();
980 set_txpower(packetbuf_attr(PACKETBUF_ATTR_RADIO_TXPOWER) - 1);
983 total_len = payload_len + AUX_LEN;
985 #if RF230_CONF_TIMESTAMPS
989 ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
1002 PRINTF(
"rf230_transmit: %d\n", (
int)total_len);
1011 for (i=0;i<total_len;i++) PRINTF(
" %02x",buffer[i]);
1017 RF230_sendpackets++;
1025 #if RF230_CONF_FRAME_RETRIES
1028 tx_result=RADIO_TX_OK;
1031 #ifdef ENERGEST_CONF_LEVELDEVICE_LEVELS
1032 ENERGEST_OFF_LEVEL(ENERGEST_TYPE_TRANSMIT,rf230_get_txpower());
1036 if(packetbuf_attr(PACKETBUF_ATTR_RADIO_TXPOWER) > 0) {
1037 set_txpower(txpower & 0xff);
1040 #if RF230_CONF_TIMESTAMPS
1041 setup_time_for_transmission = txtime - timestamp.time;
1043 if(num_transmissions < 10000) {
1045 total_transmission_len += total_len;
1046 num_transmissions++;
1051 ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT);
1052 if(RF230_receive_on) {
1054 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
1062 PRINTF(
"rf230_transmit: turning radio off\n");
1071 tx_result=RADIO_TX_OK;
1074 if (tx_result==RADIO_TX_OK) {
1075 RIMESTATS_ADD(lltx);
1076 if(packetbuf_attr(PACKETBUF_ATTR_RELIABLE))
1077 RIMESTATS_ADD(ackrx);
1080 if (!((buffer[5]==0xff) && (buffer[6]==0xff)) && (buffer[0]&(1<<6)))
1084 }
else if (tx_result==3) {
1086 RIMESTATS_ADD(contentiondrop);
1087 PRINTF(
"rf230_transmit: Transmission never started\n");
1088 tx_result = RADIO_TX_COLLISION;
1089 }
else if (tx_result==5) {
1091 tx_result = RADIO_TX_NOACK;
1092 PRINTF(
"rf230_transmit: ACK not received\n");
1093 RIMESTATS_ADD(badackrx);
1094 }
else if (tx_result==7) {
1096 tx_result = RADIO_TX_ERR;
1103 rf230_prepare(
const void *payload,
unsigned short payload_len)
1106 uint8_t total_len,*pbuf;
1107 #if RF230_CONF_TIMESTAMPS
1108 struct timestamp timestamp;
1110 #if RF230_CONF_CHECKSUM
1115 ack_seqnum=*(((uint8_t *)payload)+2);
1125 #if RF230_CONF_CHECKSUM
1126 checksum =
crc16_data(payload, payload_len, 0);
1130 total_len = payload_len + AUX_LEN;
1140 memcpy(pbuf,payload,payload_len);
1143 #if RF230_CONF_CHECKSUM
1144 memcpy(pbuf,&checksum,CHECKSUM_LEN);
1148 #if RF230_CONF_TIMESTAMPS
1151 memcpy(pbuf,×tamp,TIMESTAMP_LEN);
1152 pbuf+=TIMESTAMP_LEN;
1156 #ifdef RF230BB_HOOK_TX_PACKET
1157 #if !RF230_CONF_CHECKSUM
1160 checksum =
crc16_data(payload, payload_len, 0);
1161 memcpy(buffer+total_len-CHECKSUM_LEN,&checksum,CHECKSUM_LEN);
1164 RF230BB_HOOK_TX_PACKET(buffer,total_len);
1173 rf230_send(
const void *payload,
unsigned short payload_len)
1177 #ifdef RF230BB_HOOK_IS_SEND_ENABLED
1178 if(!RF230BB_HOOK_IS_SEND_ENABLED()) {
1183 if((ret=rf230_prepare(payload, payload_len))) {
1184 PRINTF(
"rf230_send: Unable to send, prep failed (%d)\n",ret);
1188 ret = rf230_transmit(payload_len);
1192 if (ret) RF230_sendfail++;
1201 if(RF230_receive_on == 0) {
1211 if (!rf230_isidle()) {
1213 PRINTF(
"rf230_off: busy receiving\r\n");
1224 if(RF230_receive_on) {
1234 rf230_get_channel(
void)
1242 rf230_set_channel(uint8_t c)
1245 PRINTF(
"rf230: Set Channel %u\n",c);
1252 rf230_listen_channel(uint8_t c)
1256 rf230_set_channel(c);
1261 rf230_set_pan_addr(
unsigned pan,
1263 const uint8_t ieee_addr[8])
1266 PRINTF(
"rf230: PAN=%x Short Addr=%x\n",pan,addr);
1271 abyte = (pan >> 8*1) & 0xFF;
1274 abyte = addr & 0xFF;
1276 abyte = (addr >> 8*1) & 0xFF;
1279 if (ieee_addr !=
NULL) {
1280 PRINTF(
"MAC=%x",*ieee_addr);
1282 PRINTF(
":%x",*ieee_addr);
1284 PRINTF(
":%x",*ieee_addr);
1286 PRINTF(
":%x",*ieee_addr);
1288 PRINTF(
":%x",*ieee_addr);
1290 PRINTF(
":%x",*ieee_addr);
1292 PRINTF(
":%x",*ieee_addr);
1294 PRINTF(
":%x",*ieee_addr);
1303 #if RF230_CONF_TIMESTAMPS
1304 static volatile rtimer_clock_t interrupt_time;
1305 static volatile int interrupt_time_set;
1308 rf230_interrupt(
void)
1312 if (RF230_receive_on) {
1315 #if RF230_CONF_TIMESTAMPS
1317 interrupt_time_set = 1;
1324 #if RADIOSTATS //TODO:This will double count buffered packets
1325 RF230_receivepackets++;
1327 RIMESTATS_ADD(llrx);
1332 rxframe[rxframe_head].
length=0;
1344 uint8_t rf230processflag;
1345 #define RF230PROCESSFLAG(arg) rf230processflag=arg
1347 #define RF230PROCESSFLAG(arg)
1354 RF230PROCESSFLAG(99);
1358 RF230PROCESSFLAG(42);
1369 PRINTF(
"rf230_read: %u bytes lqi %u\n",len,rf230_last_correlation);
1375 for (i=0;i<len+AUX_LEN;i++) PRINTF(
" %02x",rxdata[i]);
1381 RF230PROCESSFLAG(1);
1384 RF230PROCESSFLAG(2);
1385 NETSTACK_RDC.input();
1388 RF230_receivefail++;
1405 rf230_read(
void *buf,
unsigned short bufsize)
1407 uint8_t len,*framep;
1409 uint8_t footer[FOOTER_LEN];
1411 #if RF230_CONF_CHECKSUM
1414 #if RF230_CONF_TIMESTAMPS
1419 if(ack_pending && bufsize == 3){
1421 uint8_t *buff=(uint8_t *)buf;
1430 len=rxframe[rxframe_head].
length;
1432 #if RADIOALWAYSON && DEBUGFLOWSIZE
1433 if (RF230_receive_on==0) {
if (debugflow[debugflowsize-1]!=
'z') DEBUGFLOW(
'z');}
1438 #if RF230_CONF_TIMESTAMPS
1439 if(interrupt_time_set) {
1440 rf230_time_of_arrival = interrupt_time;
1441 interrupt_time_set = 0;
1443 rf230_time_of_arrival = 0;
1445 rf230_time_of_departure = 0;
1452 RIMESTATS_ADD(badsynch);
1456 if(len <= AUX_LEN) {
1460 RIMESTATS_ADD(tooshort);
1464 if(len - AUX_LEN > bufsize) {
1468 RIMESTATS_ADD(toolong);
1473 framep=&(rxframe[rxframe_head].
data[0]);
1474 memcpy(buf,framep,len-AUX_LEN+CHECKSUM_LEN);
1475 rf230_last_correlation = rxframe[rxframe_head].
lqi;
1478 rxframe[rxframe_head].
length=0;
1480 if (rxframe_head >= RF230_CONF_RX_BUFFERS) {
1484 if (rxframe[rxframe_head].length) {
1492 framep+=len-AUX_LEN;
1493 #if RF230_CONF_CHECKSUM
1494 memcpy(&checksum,framep,CHECKSUM_LEN);
1496 framep+=CHECKSUM_LEN;
1497 #if RF230_CONF_TIMESTAMPS
1498 memcpy(&t,framep,TIMESTAMP_LEN);
1500 framep+=TIMESTAMP_LEN;
1502 memcpy(footer,framep,FOOTER_LEN);
1504 #if RF230_CONF_CHECKSUM
1505 if(checksum !=
crc16_data(buf, len - AUX_LEN, 0)) {
1511 if(footer[1] & FOOTER1_CRC_OK &&
1512 checksum ==
crc16_data(buf, len - AUX_LEN, 0)) {
1517 #if 0 //more general
1518 rf230_last_rssi = rf230_get_raw_rssi();
1520 #if RF230_CONF_AUTOACK
1530 if ((rf230_smallest_rssi==0) || (rf230_last_rssi<rf230_smallest_rssi))
1531 rf230_smallest_rssi=rf230_last_rssi;
1534 packetbuf_set_attr(PACKETBUF_ATTR_RSSI, rf230_last_rssi);
1535 packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, rf230_last_correlation);
1539 #if RF230_CONF_TIMESTAMPS
1540 rf230_time_of_departure =
1542 setup_time_for_transmission +
1543 (total_time_for_transmission * (len - 2)) / total_transmission_len;
1545 rf230_authority_level_of_sender = t.authority_level;
1547 packetbuf_set_attr(PACKETBUF_ATTR_TIMESTAMP, t.time);
1550 #if RF230_CONF_CHECKSUM
1555 RIMESTATS_ADD(badcrc);
1561 #ifdef RF230BB_HOOK_RX_PACKET
1562 RF230BB_HOOK_RX_PACKET(buf,len);
1566 return len - AUX_LEN;
1570 rf230_set_txpower(uint8_t power)
1576 rf230_get_txpower(
void)
1578 uint8_t power = TX_PWR_UNDEFINED;
1580 PRINTF(
"rf230_get_txpower:Sleeping");
1589 rf230_get_raw_rssi(
void)
1592 bool radio_was_off = 0;
1595 if(!RF230_receive_on) {
1607 #if 0 // 3-clock shift and add is faster on machines with no hardware multiply
1610 rssi = (rssi << 1) + rssi;
1611 #else // 1 or 2 clock multiply, or compiler with correct optimization
1628 uint8_t radio_was_off = 0;
1633 if(RF230_receive_on) {
1638 if (!rf230_isidle()) {
1648 ENERGEST_ON(ENERGEST_TYPE_LED_YELLOW);
1655 #if defined(__AVR_ATmega128RFA1__)
1656 #if 1 //interrupt method
1659 #ifdef RF230_MIN_RX_POWER
1673 uint8_t
volatile saved_sreg = SREG;
1676 while (rf230_ccawait) {}
1681 #ifdef RF230_CONF_CCA_THRES
1688 #if RF230_CONF_AUTOACK
1693 #ifdef RF230_MIN_RX_POWER
1703 #ifdef RF230_CONF_CCA_THRES
1715 { uint8_t
volatile saved_sreg = SREG;
1720 while ((cca & 0x80) == 0 ) {
1730 ENERGEST_OFF(ENERGEST_TYPE_LED_YELLOW);
1746 rf230_receiving_packet(
void)
1748 uint8_t radio_state;
1762 rf230_pending_packet(
void)
1765 if(ack_pending == 1)
return 1;
1767 return rf230_pending;
1770 #if RF230_CONF_SNEEZER && JACKDAW
1776 void rf230_start_sneeze(
void) {
#define hal_set_slptr_low()
This macro pulls the SLP_TR pin low.
The requested service timed out.
#define RX_ON
Constant RX_ON for sub-register SR_TRX_STATUS.
#define SR_TRX_STATUS
Access parameters for sub-register TRX_STATUS in register RG_TRX_STATUS.
Time it takes to execute the FORCE_TRX_OFF command.
#define SR_PLL_DCU_START
Access parameters for sub-register PLL_DCU_START in register RG_PLL_DCU.
#define hal_get_slptr()
Read current state of the SLP_TR pin (High/Low).
uint8_t lqi
LQI value for received frame.
Transition time from P_ON to TRX_OFF.
#define RG_IEEE_ADDR_3
Offset for register IEEE_ADDR_3.
#define RG_IRQ_MASK
Offset for register IRQ_MASK.
uint8_t hal_register_read(uint8_t address)
This function reads data from one of the radio transceiver's registers.
void process_poll(struct process *p)
Request a process to be polled.
#define RG_CSMA_SEED_0
Offset for register CSMA_SEED_0.
bool radio_is_sleeping(void)
This function checks if the radio transceiver is sleeping.
#define RX_AACK_ON
Constant RX_AACK_ON for sub-register SR_TRX_STATUS.
#define PORTE
Peripheral PORTE base pointer.
#define PROCESS_BEGIN()
Define the beginning of a process.
#define RG_IEEE_ADDR_5
Offset for register IEEE_ADDR_5.
#define RG_IEEE_ADDR_4
Offset for register IEEE_ADDR_4.
#define SR_TRAC_STATUS
Access parameters for sub-register TRAC_STATUS in register RG_TRX_STATE.
int timesynch_authority_level(void)
Get the current authority level of the time-synchronized time.
#define AVR_ENTER_CRITICAL_REGION()
This macro will protect the following code from interrupts.
Transition time from *_NOCLK to being awake.
#define RG_SHORT_ADDR_1
Offset for register SHORT_ADDR_1.
#define RG_PHY_ED_LEVEL
Offset for register PHY_ED_LEVEL.
void calibrate_rc_osc_32k(void)
Calibrate the internal RC oscillator.
#define AVR_LEAVE_CRITICAL_REGION()
This macro must always be used in conjunction with AVR_ENTER_CRITICAL_REGION so that interrupts are e...
Header file for the Rime buffer (packetbuf) management
Transition time from SLEEP to TRX_OFF.
#define RG_PAN_ID_0
Offset for register PAN_ID_0.
#define PORTB
Peripheral PORTB base pointer.
Transition time from PLL active state to another.
#define TRX_OFF
Constant TRX_OFF for sub-register SR_TRX_STATUS.
uint8_t length
Length of frame.
uint8_t hal_subregister_read(uint8_t address, uint8_t mask, uint8_t position)
This function reads the value of a specific subregister.
#define NULL
The null pointer.
The structure of a device driver for a radio in Contiki.
#define hal_set_rst_low()
This macro pulls the RST pin low.
#define SR_CHANNEL
Access parameters for sub-register CHANNEL in register RG_PHY_CC_CCA.
#define SR_CCA_MODE
Access parameters for sub-register CCA_MODE in register RG_PHY_CC_CCA.
void hal_init(void)
This function initializes the Hardware Abstraction Layer.
This struct defines the rx data container.
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.
#define hal_set_rst_high()
This macro pulls the RST pin high.
uint8_t data[HAL_MAX_FRAME_LENGTH]
Actual frame data.
int radio_value_t
Each radio has a set of parameters that designate the current configuration and state of the radio...
#define BUSY_RX
Constant BUSY_RX for sub-register SR_TRX_STATUS.
#define SR_TRX_CMD
Access parameters for sub-register TRX_CMD in register RG_TRX_STATE.
Header file for a simple time synchronization mechanism
void packetbuf_set_datalen(uint16_t len)
Set the length of the data in the packetbuf.
#define RG_MAN_ID_0
Offset for register MAN_ID_0.
uint8_t radio_get_trx_state(void)
This function return the Radio Transceivers current state.
#define HAL_LEAVE_CRITICAL_REGION()
This macro must always be used in conjunction with HAL_ENTER_CRITICAL_REGION so that interrupts are e...
Transition time from TRX_OFF to: RX_ON, PLL_ON, TX_ARET_ON and RX_AACK_ON.
rtimer_clock_t timesynch_time(void)
Get the current time-synchronized time.
Maximum time it should take for the PLL to lock.
#define SR_AACK_SET_PD
Access parameters for AACK_SET_PD bit in register RG_CSMA_SEED_1.
#define RG_SHORT_ADDR_0
Offset for register SHORT_ADDR_0.
#define RG_RX_SYN
Offset for register RX_SYN.
Transition time from VCC is applied to P_ON.
#define SR_RSSI
Access parameters for sub-register RSSI in register RG_PHY_RSSI.
void hal_frame_write(uint8_t *write_buffer, uint8_t length)
This function will download a frame to the radio transceiver's frame buffer.
The end-user tried to do an invalid state transition.
#define PROCESS_THREAD(name, ev, data)
Define the body of a process.
#define PROCESS_END()
Define the end of a process.
#define STATE_TRANSITION
Constant STATE_TRANSITION for sub-register SR_TRX_STATUS.
#define hal_set_slptr_high()
This macro pulls the SLP_TR pin high.
#define SR_MAX_FRAME_RETRIES
Access parameters for sub-register MAX_FRAME_RETRIES in register RG_XAH_CTRL_0.
radio_trx_timing_t
This enumeration defines the necessary timing information for the AT86RF230 radio transceiver...
#define RG_IEEE_ADDR_0
Offset for register IEEE_ADDR_0.
radio_status_t
This enumeration defines the possible return values for the TAT API functions.
#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.
#define CMD_FORCE_TRX_OFF
Constant CMD_FORCE_TRX_OFF for sub-register SR_TRX_CMD.
#define RG_IEEE_ADDR_1
Offset for register IEEE_ADDR_1.
Time it takes to do a ED measurement.
#define RF230_MAX_TX_FRAME_LENGTH
127 Byte PSDU.
#define RG_CSMA_BE
Offset for register CSMA_BE.
The requested service was performed successfully.
#define RG_IEEE_ADDR_7
Offset for register IEEE_ADDR_7.
#define HAL_ENTER_CRITICAL_REGION()
This macro will protect the following code from interrupts.
radio_result_t(* get_value)(radio_param_t param, radio_value_t *value)
Get a radio parameter value.
#define RG_IEEE_ADDR_6
Offset for register IEEE_ADDR_6.
Time it takes to do a CCA.
Time to hold the RST pin low during reset.
#define RG_TRX_STATUS
Offset for register TRX_STATUS.
#define SR_TX_PWR
Access parameters for sub-register TX_PWR in register RG_PHY_TX_PWR.
#define BUSY_TX_ARET
Constant BUSY_TX_ARET for sub-register SR_TRX_STATUS.
radio_result_t(* get_object)(radio_param_t param, void *dest, size_t size)
Get a radio parameter object.
#define PROCESS(name, strname)
Declare a process.
#define TX_ARET_ON
Constant TX_ARET_ON for sub-register SR_TRX_STATUS.
#define RG_VERSION_NUM
Offset for register VERSION_NUM.
#define RG_IEEE_ADDR_2
Offset for register IEEE_ADDR_2.
void packetbuf_clear(void)
Clear and reset the packetbuf.
void process_start(struct process *p, process_data_t data)
Start a process.
#define PLL_ON
Constant PLL_ON for sub-register SR_TRX_STATUS.
void hal_register_write(uint8_t address, uint8_t value)
This function writes a new value to one of the radio transceiver's registers.
#define SR_TX_AUTO_CRC_ON
Access parameters for sub-register TX_AUTO_CRC_ON in register RG_PHY_TX_PWR.
Maximum time it should take to do the filter tuning.
#define PACKETBUF_SIZE
The size of the packetbuf, in bytes.
#define SR_MAX_CSMA_RETRIES
Access parameters for sub-register MAX_CSMA_RETRIES in register RG_XAH_CTRL_0.
#define RG_PAN_ID_1
Offset for register PAN_ID_1.
Header file for Rime statistics
This file contains radio driver code.
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
One or more of the supplied function arguments are invalid.
radio_result_t(* set_object)(radio_param_t param, const void *src, size_t size)
Set a radio parameter object.
#define SR_CCA_ED_THRES
Access parameters for sub-register CCA_ED_THRES in register RG_CCA_THRES.
Header file for the CRC16 calculcation
#define PROCESS_YIELD_UNTIL(c)
Yield the currently running process until a condition occurs.
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...
radio_result_t(* set_value)(radio_param_t param, radio_value_t value)
Set a radio parameter value.
#define BUSY_TX
Constant BUSY_TX for sub-register SR_TRX_STATUS.
unsigned short crc16_data(const unsigned char *data, int len, unsigned short acc)
Calculate the CRC16 over a data area.
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 ...
#define RG_PHY_RSSI
Offset for register PHY_RSSI.
Include file for the Contiki low-layer network stack (NETSTACK)
#define SR_CCA_REQUEST
Access parameters for sub-register CCA_REQUEST in register RG_PHY_CC_CCA.