41 #define DEBUG DEBUG_ANNOTATE
50 #include "contiki-conf.h"
56 #ifndef CONTIKI_MACA_PREPEND_BYTE
57 #define CONTIKI_MACA_PREPEND_BYTE 0xff
64 unsigned short node_id = 0;
66 static volatile uint8_t tx_complete;
67 static volatile uint8_t tx_status;
71 int contiki_maca_init(
void);
72 int contiki_maca_on_request(
void);
73 int contiki_maca_off_request(
void);
74 int contiki_maca_read(
void *buf,
unsigned short bufsize);
75 int contiki_maca_prepare(
const void *payload,
unsigned short payload_len);
76 int contiki_maca_transmit(
unsigned short transmit_len);
77 int contiki_maca_send(
const void *payload,
unsigned short payload_len);
78 int contiki_maca_channel_clear(
void);
79 int contiki_maca_receiving_packet(
void);
80 int contiki_maca_pending_packet(
void);
86 return RADIO_RESULT_NOT_SUPPORTED;
92 return RADIO_RESULT_NOT_SUPPORTED;
96 get_object(radio_param_t param,
void *dest,
size_t size)
98 return RADIO_RESULT_NOT_SUPPORTED;
101 static radio_result_t
102 set_object(radio_param_t param,
const void *src,
size_t size)
104 return RADIO_RESULT_NOT_SUPPORTED;
109 .init = contiki_maca_init,
110 .prepare = contiki_maca_prepare,
111 .transmit = contiki_maca_transmit,
112 .send = contiki_maca_send,
113 .read = contiki_maca_read,
114 .receiving_packet = contiki_maca_receiving_packet,
115 .pending_packet = contiki_maca_pending_packet,
116 .channel_clear = contiki_maca_channel_clear,
117 .on = contiki_maca_on_request,
118 .off = contiki_maca_off_request,
125 static volatile uint8_t contiki_maca_request_on = 0;
126 static volatile uint8_t contiki_maca_request_off = 0;
128 static process_event_t event_data_ready;
130 static volatile packet_t prepped_p;
132 void contiki_maca_set_mac_address(uint64_t eui) {
137 *MACA_MACPANID = 0xcdab;
138 *MACA_MAC16ADDR = 0xffff;
140 *MACA_MAC64HI = (uint32_t) (eui >> 32);
141 *MACA_MAC64LO = (uint32_t) eui;
143 ANNOTATE(
"setting panid 0x%04x\n\r", *MACA_MACPANID);
144 ANNOTATE(
"setting short mac 0x%04x\n\r", *MACA_MAC16ADDR);
145 ANNOTATE(
"setting long mac 0x%08x_%08x\n\r", *MACA_MAC64HI, *MACA_MAC64LO);
150 for(i=0; i < LINKADDR_CONF_SIZE; i++) {
151 addr.u8[LINKADDR_CONF_SIZE - 1 - i] = (mc1322x_config.eui >> (i * 8)) & 0xff;
154 node_id = (addr.u8[6] << 8 | addr.u8[7]);
158 ANNOTATE(
"Rime configured with address ");
159 for(i = 0; i <
sizeof(addr.u8) - 1; i++) {
160 ANNOTATE(
"%02X:", addr.u8[i]);
162 ANNOTATE(
"%02X\n", addr.u8[i]);
166 int contiki_maca_init(
void) {
176 int contiki_maca_channel_clear(
void) {
181 int contiki_maca_receiving_packet(
void) {
185 int contiki_maca_pending_packet(
void) {
186 if (rx_head !=
NULL) {
193 int contiki_maca_on_request(
void) {
194 contiki_maca_request_on = 1;
195 contiki_maca_request_off = 0;
199 int contiki_maca_off_request(
void) {
200 contiki_maca_request_on = 0;
201 contiki_maca_request_off = 1;
208 int contiki_maca_read(
void *buf,
unsigned short bufsize) {
210 volatile packet_t *p;
212 if((p = rx_packet())) {
214 #if CONTIKI_MACA_RAW_MODE
221 PRINTF(
": p->length 0x%0x bufsize 0x%0x \n\r", p->length, bufsize);
222 if((p->length) < bufsize) bufsize = (p->length);
223 memcpy(buf, (uint8_t *)(p->data + p->offset), bufsize);
224 packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY,p->lqi);
225 packetbuf_set_attr(PACKETBUF_ATTR_TIMESTAMP,p->rx_time);
226 #if CONTIKI_MACA_DEBUG
227 for( i = p->offset ; i < (bufsize + p->offset) ; i++) {
228 PRINTF(
" %02x",p->data[i]);
243 int contiki_maca_prepare(
const void *payload,
unsigned short payload_len) {
246 PRINTF(
"contiki maca prepare");
247 #if CONTIKI_MACA_RAW_MODE
248 prepped_p.offset = 1;
249 prepped_p.length = payload_len + 1;
251 prepped_p.offset = 0;
252 prepped_p.length = payload_len;
254 if(payload_len > MAX_PACKET_SIZE)
return RADIO_TX_ERR;
255 memcpy((uint8_t *)(prepped_p.data + prepped_p.offset), payload, payload_len);
256 #if CONTIKI_MACA_RAW_MODE
257 prepped_p.offset = 0;
258 prepped_p.data[0] = CONTIKI_MACA_PREPEND_BYTE;
261 #if CONTIKI_MACA_DEBUG
262 PRINTF(
": sending %d bytes\n\r", payload_len);
263 for(i = prepped_p.offset ; i < (prepped_p.length + prepped_p.offset); i++) {
264 PRINTF(
" %02x",prepped_p.data[i]);
276 int contiki_maca_transmit(
unsigned short transmit_len) {
277 volatile packet_t *p;
279 PRINTF(
"contiki maca transmit\n\r");
283 if(p = get_free_packet()) {
284 p->offset = prepped_p.offset;
285 p->length = prepped_p.length;
286 memcpy((uint8_t *)(p->data + p->offset),
287 (
const uint8_t *)(prepped_p.data + prepped_p.offset),
291 PRINTF(
"couldn't get free packet for transmit\n\r");
297 while((maca_pwr == 1) && !tx_complete && (tx_head != 0)) {
continue; }
301 int contiki_maca_send(
const void *payload,
unsigned short payload_len) {
302 contiki_maca_prepare(payload, payload_len);
303 contiki_maca_transmit(payload_len);
311 return RADIO_TX_NOACK;
318 PROCESS(contiki_maca_process,
"maca process");
330 if(contiki_maca_request_on == 1) {
331 contiki_maca_request_on = 0;
335 if(contiki_maca_request_off == 1) {
336 contiki_maca_request_off = 0;
340 if (rx_head !=
NULL) {
345 NETSTACK_RDC.input();
349 if (rx_head !=
NULL) {
358 void maca_rx_callback(
volatile packet_t *p __attribute((unused))) {
364 void maca_tx_callback(
volatile packet_t *p __attribute((unused))) {
366 tx_status = p->status;
void process_poll(struct process *p)
Request a process to be polled.
#define PROCESS_BEGIN()
Define the beginning of a process.
const linkaddr_t linkaddr_null
The null Rime address.
Header file for the Rime buffer (packetbuf) management
#define NULL
The null pointer.
The structure of a device driver for a radio in Contiki.
int radio_value_t
Each radio has a set of parameters that designate the current configuration and state of the radio...
void packetbuf_set_datalen(uint16_t len)
Set the length of the data in the packetbuf.
void linkaddr_copy(linkaddr_t *dest, const linkaddr_t *src)
Copy a Rime address.
#define PROCESS_THREAD(name, ev, data)
Define the body of a process.
#define PROCESS_END()
Define the end of a process.
radio_result_t(* get_value)(radio_param_t param, radio_value_t *value)
Get a radio parameter value.
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.
void packetbuf_clear(void)
Clear and reset the packetbuf.
#define PACKETBUF_SIZE
The size of the packetbuf, in bytes.
void linkaddr_set_node_addr(linkaddr_t *t)
Set the address of the current node.
A set of debugging macros.
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.
Header file for the Contiki process interface.
#define PROCESS_YIELD_UNTIL(c)
Yield the currently running process until a condition occurs.
radio_result_t(* set_value)(radio_param_t param, radio_value_t value)
Set a radio parameter value.
Include file for the Contiki low-layer network stack (NETSTACK)