41 #include <aducrf101-contiki.h>
44 #include "contiki-net.h"
48 #define MAX_PACKET_LEN 240
50 static uint8_t tx_buf[MAX_PACKET_LEN];
52 #ifndef ADUCRF101_RADIO_BASE_CONFIG
53 #define ADUCRF101_RADIO_BASE_CONFIG DR_38_4kbps_Dev20kHz
57 static int current_channel = 915000000;
58 static int current_power = 31;
59 static int radio_is_on = 0;
64 #ifndef ADUCRF101_RF_CONF_SNIFFER
65 #if CC2538_RF_CONF_SNIFFER
66 #define ADUCRF101_RF_CONF_SNIFFER 1
70 #if ADUCRF101_RF_CONF_SNIFFER
72 static const uint8_t magic[] = { 0x53, 0x6E, 0x69, 0x66 };
79 #define MIN_CHANNEL 431000000
80 #define MAX_CHANNEL 928000000
82 _set_channel(
int freq)
84 if(freq < 431000000) {
86 }
else if(freq > 464000000 && freq < 663000000) {
88 }
else if(freq >= 663000000 && freq < 862000000) {
90 }
else if(freq > 928000000) {
93 current_channel = freq;
95 return RADIO_RESULT_ERROR;
97 return RADIO_RESULT_OK;
106 _set_power(
int power)
120 current_power = power;
122 return RADIO_RESULT_ERROR;
124 return RADIO_RESULT_OK;
127 PROCESS(aducrf101_rf_process,
"ADuCRF101 RF driver");
143 if(_set_channel(current_channel) != RADIO_RESULT_OK) {
146 if(_set_power(current_power) != RADIO_RESULT_OK) {
182 prepare(
const void *payload,
unsigned short payload_len)
185 if(payload_len > MAX_PACKET_LEN) {
186 payload_len = MAX_PACKET_LEN;
188 memcpy(tx_buf, payload, payload_len);
194 transmit(
unsigned short transmit_len)
200 if(transmit_len > MAX_PACKET_LEN) {
201 transmit_len = MAX_PACKET_LEN;
217 send(
const void *payload,
unsigned short payload_len)
219 prepare(payload, payload_len);
220 return transmit(payload_len);
225 read(
void *buf,
unsigned short buf_len)
233 if(buf_len > MAX_PACKET_LEN) {
234 buf_len = MAX_PACKET_LEN;
242 if(packet_len > buf_len) {
243 packet_len = buf_len;
249 #if ADUCRF101_RF_CONF_SNIFFER
254 uart_put(packet_len + 2);
255 for(
int i = 0; i < packet_len; i++) {
256 uart_put(((uint8_t *)buf)[i]);
277 receiving_packet(
void)
294 static radio_result_t
298 return RADIO_RESULT_INVALID_VALUE;
302 case RADIO_PARAM_RSSI:
306 return RADIO_RESULT_ERROR;
309 return RADIO_RESULT_OK;
312 case RADIO_PARAM_CHANNEL:
313 *value = current_channel;
314 return RADIO_RESULT_OK;
315 case RADIO_CONST_CHANNEL_MIN:
316 *value = MIN_CHANNEL;
317 return RADIO_RESULT_OK;
318 case RADIO_CONST_CHANNEL_MAX:
319 *value = MAX_CHANNEL;
320 return RADIO_RESULT_OK;
322 case RADIO_PARAM_TXPOWER:
323 *value = current_power;
324 return RADIO_RESULT_OK;
325 case RADIO_CONST_TXPOWER_MIN:
327 return RADIO_RESULT_OK;
328 case RADIO_CONST_TXPOWER_MAX:
330 return RADIO_RESULT_OK;
333 return RADIO_RESULT_NOT_SUPPORTED;
338 static radio_result_t
342 case RADIO_PARAM_CHANNEL:
343 return _set_channel(value);
345 case RADIO_PARAM_TXPOWER:
346 return _set_power(value);
349 return RADIO_RESULT_NOT_SUPPORTED;
358 static radio_result_t
359 get_object(radio_param_t param,
void *dest,
size_t size)
361 return RADIO_RESULT_NOT_SUPPORTED;
368 static radio_result_t
369 set_object(radio_param_t param,
const void *src,
size_t size)
371 return RADIO_RESULT_NOT_SUPPORTED;
394 NETSTACK_RDC.input();
RIE_BOOL RadioTxPacketComplete(void)
Checks if a packet has finished transmitting.
void process_poll(struct process *p)
Request a process to be polled.
#define PROCESS_BEGIN()
Define the beginning of a process.
#define NULL
The null pointer.
The structure of a device driver for a radio in Contiki.
RIE_Responses RadioRxPacketRead(RIE_U8 BufferLen, RIE_U8 *pPktLen, RIE_U8 *pData, RIE_S8 *pRSSIdBm)
Read the packet that was received by the radio.
int(* pending_packet)(void)
Check if the radio driver has just received a packet.
int radio_value_t
Each radio has a set of parameters that designate the current configuration and state of the radio...
int(* prepare)(const void *payload, unsigned short payload_len)
Prepare the radio with a packet to be sent.
void packetbuf_set_datalen(uint16_t len)
Set the length of the data in the packetbuf.
void aducrf101_rx_packet_hook(void)
Trigger function called by ADI radio engine upon packet RX.
int(* send)(const void *payload, unsigned short payload_len)
Prepare & transmit a packet.
RIE_BOOL RadioRxPacketAvailable(void)
Checks if a packet has been received.
int(* receiving_packet)(void)
Check if the radio driver is currently receiving a packet.
#define PROCESS_THREAD(name, ev, data)
Define the body of a process.
#define PROCESS_END()
Define the end of a process.
int(* channel_clear)(void)
Perform a Clear-Channel Assessment (CCA) to find out if there is a packet in the air or not...
RIE_Responses RadioPowerOff(void)
Shutdown the radio and place it in its lowest power sleep mode.
RIE_Responses RadioRadioGetRSSI(RIE_S8 *pRSSIdBm)
Return a Received Signal Strength Indicator value.
int(* on)(void)
Turn the radio on.
radio_result_t(* get_value)(radio_param_t param, radio_value_t *value)
Get a radio parameter value.
RIE_Responses RadioSetFrequency(RIE_U32 Frequency)
Set frequency for radio communications.
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.
int(* transmit)(unsigned short transmit_len)
Send the packet that has previously been prepared.
void packetbuf_clear(void)
Clear and reset the packetbuf.
void process_start(struct process *p, process_data_t data)
Start a process.
RIE_Responses RadioRxPacketVariableLen(void)
Enter receive mode and wait for a packet to be received.
#define PACKETBUF_SIZE
The size of the packetbuf, in bytes.
RIE_Responses RadioTxSetPA(RIE_PATypes PAType, RIE_PAPowerLevel Power)
Set PA Type and the Transmit Power Level for Radio Transmission.
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
radio_result_t(* set_object)(radio_param_t param, const void *src, size_t size)
Set a radio parameter object.
RIE_Responses RadioTxPacketVariableLen(RIE_U8 Len, RIE_U8 *pData)
Transmit a Variable length packet.
#define PROCESS_YIELD_UNTIL(c)
Yield the currently running process until a condition occurs.
RIE_Responses RadioInit(RIE_BaseConfigs BaseConfig)
Initialise the Radio, using specified configuration.
radio_result_t(* set_value)(radio_param_t param, radio_value_t value)
Set a radio parameter value.
int(* read)(void *buf, unsigned short buf_len)
Read a received packet into a buffer.
int(* off)(void)
Turn the radio off.
Include file for the Contiki low-layer network stack (NETSTACK)