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);
84 .init = contiki_maca_init,
85 .prepare = contiki_maca_prepare,
86 .transmit = contiki_maca_transmit,
87 .send = contiki_maca_send,
88 .read = contiki_maca_read,
89 .receiving_packet = contiki_maca_receiving_packet,
90 .pending_packet = contiki_maca_pending_packet,
91 .channel_clear = contiki_maca_channel_clear,
92 .on = contiki_maca_on_request,
93 .off = contiki_maca_off_request,
96 static volatile uint8_t contiki_maca_request_on = 0;
97 static volatile uint8_t contiki_maca_request_off = 0;
99 static process_event_t event_data_ready;
101 static volatile packet_t prepped_p;
103 void contiki_maca_set_mac_address(uint64_t eui) {
108 *MACA_MACPANID = 0xcdab;
109 *MACA_MAC16ADDR = 0xffff;
111 *MACA_MAC64HI = (uint32_t) (eui >> 32);
112 *MACA_MAC64LO = (uint32_t) eui;
114 ANNOTATE(
"setting panid 0x%04x\n\r", *MACA_MACPANID);
115 ANNOTATE(
"setting short mac 0x%04x\n\r", *MACA_MAC16ADDR);
116 ANNOTATE(
"setting long mac 0x%08x_%08x\n\r", *MACA_MAC64HI, *MACA_MAC64LO);
121 for(i=0; i < LINKADDR_CONF_SIZE; i++) {
122 addr.u8[LINKADDR_CONF_SIZE - 1 - i] = (mc1322x_config.eui >> (i * 8)) & 0xff;
125 node_id = (addr.u8[6] << 8 | addr.u8[7]);
129 ANNOTATE(
"Rime configured with address ");
130 for(i = 0; i <
sizeof(addr.u8) - 1; i++) {
131 ANNOTATE(
"%02X:", addr.u8[i]);
133 ANNOTATE(
"%02X\n", addr.u8[i]);
137 int contiki_maca_init(
void) {
147 int contiki_maca_channel_clear(
void) {
152 int contiki_maca_receiving_packet(
void) {
156 int contiki_maca_pending_packet(
void) {
157 if (rx_head !=
NULL) {
164 int contiki_maca_on_request(
void) {
165 contiki_maca_request_on = 1;
166 contiki_maca_request_off = 0;
170 int contiki_maca_off_request(
void) {
171 contiki_maca_request_on = 0;
172 contiki_maca_request_off = 1;
179 int contiki_maca_read(
void *buf,
unsigned short bufsize) {
181 volatile packet_t *p;
183 if((p = rx_packet())) {
185 #if CONTIKI_MACA_RAW_MODE
192 PRINTF(
": p->length 0x%0x bufsize 0x%0x \n\r", p->length, bufsize);
193 if((p->length) < bufsize) bufsize = (p->length);
194 memcpy(buf, (uint8_t *)(p->data + p->offset), bufsize);
195 packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY,p->lqi);
196 packetbuf_set_attr(PACKETBUF_ATTR_TIMESTAMP,p->rx_time);
197 #if CONTIKI_MACA_DEBUG
198 for( i = p->offset ; i < (bufsize + p->offset) ; i++) {
199 PRINTF(
" %02x",p->data[i]);
214 int contiki_maca_prepare(
const void *payload,
unsigned short payload_len) {
217 PRINTF(
"contiki maca prepare");
218 #if CONTIKI_MACA_RAW_MODE
219 prepped_p.offset = 1;
220 prepped_p.length = payload_len + 1;
222 prepped_p.offset = 0;
223 prepped_p.length = payload_len;
225 if(payload_len > MAX_PACKET_SIZE)
return RADIO_TX_ERR;
226 memcpy((uint8_t *)(prepped_p.data + prepped_p.offset), payload, payload_len);
227 #if CONTIKI_MACA_RAW_MODE
228 prepped_p.offset = 0;
229 prepped_p.data[0] = CONTIKI_MACA_PREPEND_BYTE;
232 #if CONTIKI_MACA_DEBUG
233 PRINTF(
": sending %d bytes\n\r", payload_len);
234 for(i = prepped_p.offset ; i < (prepped_p.length + prepped_p.offset); i++) {
235 PRINTF(
" %02x",prepped_p.data[i]);
247 int contiki_maca_transmit(
unsigned short transmit_len) {
248 volatile packet_t *p;
250 PRINTF(
"contiki maca transmit\n\r");
254 if(p = get_free_packet()) {
255 p->offset = prepped_p.offset;
256 p->length = prepped_p.length;
257 memcpy((uint8_t *)(p->data + p->offset),
258 (
const uint8_t *)(prepped_p.data + prepped_p.offset),
262 PRINTF(
"couldn't get free packet for transmit\n\r");
268 while((maca_pwr == 1) && !tx_complete && (tx_head != 0)) {
continue; }
272 int contiki_maca_send(
const void *payload,
unsigned short payload_len) {
273 contiki_maca_prepare(payload, payload_len);
274 contiki_maca_transmit(payload_len);
282 return RADIO_TX_NOACK;
289 PROCESS(contiki_maca_process,
"maca process");
301 if(contiki_maca_request_on == 1) {
302 contiki_maca_request_on = 0;
306 if(contiki_maca_request_off == 1) {
307 contiki_maca_request_off = 0;
311 if (rx_head !=
NULL) {
316 NETSTACK_RDC.input();
320 if (rx_head !=
NULL) {
329 void maca_rx_callback(
volatile packet_t *p __attribute((unused))) {
335 void maca_tx_callback(
volatile packet_t *p __attribute((unused))) {
337 tx_status = p->status;