From 15ba03fea545b3cf6574bf812838984aca3d9a99 Mon Sep 17 00:00:00 2001 From: c_oflynn Date: Tue, 14 Oct 2008 18:36:07 +0000 Subject: [PATCH] Adding updated files --- cpu/avr/radio/mac/Makefile.mac | 4 + cpu/avr/radio/mac/mac.c | 191 ++++++++++++ cpu/avr/radio/mac/sicslowmac.c | 529 +++++++++++++++++++++++++++++++++ cpu/avr/radio/mac/sicslowmac.h | 95 ++++++ cpu/avr/radio/mac/zmac.h | 239 +++++++++++++++ 5 files changed, 1058 insertions(+) create mode 100644 cpu/avr/radio/mac/Makefile.mac create mode 100644 cpu/avr/radio/mac/mac.c create mode 100644 cpu/avr/radio/mac/sicslowmac.c create mode 100644 cpu/avr/radio/mac/sicslowmac.h create mode 100644 cpu/avr/radio/mac/zmac.h diff --git a/cpu/avr/radio/mac/Makefile.mac b/cpu/avr/radio/mac/Makefile.mac new file mode 100644 index 000000000..d58a008dc --- /dev/null +++ b/cpu/avr/radio/mac/Makefile.mac @@ -0,0 +1,4 @@ +CONTIKI_TARGET_SOURCEFILES += mac.c sicslowmac.c + +APPDIRS += $(CONTIKI)/cpu/avr/radio/mac + diff --git a/cpu/avr/radio/mac/mac.c b/cpu/avr/radio/mac/mac.c new file mode 100644 index 000000000..2a07b8a99 --- /dev/null +++ b/cpu/avr/radio/mac/mac.c @@ -0,0 +1,191 @@ +/* Copyright (c) 2008, Swedish Institute of Computer Science + * All rights reserved. + * + * Additional fixes for AVR contributed by: + * + * Colin O'Flynn coflynn@newae.com + * Eric Gnoske egnoske@gmail.com + * Blake Leverett bleverett@gmail.com + * Mike Vidales mavida404@gmail.com + * Kevin Brown kbrown3@uccs.edu + * Nate Bohlmann nate@elfwerks.com + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + **/ +/** + * \addtogroup wireless + * @{ + */ +/** + * \defgroup rf230mac RF230 MAC + * @{ + */ +/** + * \file + * \brief The IEEE 802.15.4 (2003/2006) MAC utility functions. + * + */ + +/** + * \author + * Eric Gnoske + * Blake Leverett + * Mike Vidales + * Colin O'Flynn + * + */ + +/* Includes */ + +#include +#include +#include "zmac.h" +#include "radio.h" +#include "hal.h" +#include "tcpip.h" +#include "uip.h" +#include "sicslowpan.h" +#include "sicslowmac.h" + +/* Globals */ +/** \brief Interface structure for this module */ +ieee_15_4_manager_t ieee15_4ManagerAddress; + +//dataRequest_t dataRequestStructAddress; + +/* Macros & Defines */ + +uint8_t msduHandle; +bool iAmCoord; +bool autoModes; + + +/** \brief The RF channel to use for all following transmissions and + * receptions (see 6.1.2). Allowable values are 0-26 + */ +uint8_t phyCurrentChannel; + +/** \brief The 64-bit address of the coordinator/router through which + * the network layer wishes to communicate. + */ +uint64_t macCoordExtendedAddress; + +/** \brief The 16-bit short address assigned to the coordinator + * through which the network layer wishes to communicate. A value + * of 0xfffe indicates th the coordinator is only using it's 64-bit + * extended address. A value of 0xffff indicates that this value is + * unknown. The default value is 0xfff. + */ +uint16_t macCoordShortAddress; + +/** \brief This address is the 64-bit address that will be used as + * the mechanism to provide a destination to the upper layers. The + * default value is 0xfff. + */ +uint64_t macDestAddress; + +/** \brief The sequence number (0x00 - 0xff) added to the transmitted + * data or MAC command frame. The default is a random value within + * the range. + */ +uint8_t macDSN; + +/** \brief The 16-bit identifier of the PAN on which the device is + * sending to. If this value is 0xffff, the device is not + * associated. The default value is 0xffff. + */ +uint16_t macDstPANId; + +/** \brief The 16-bit identifier of the PAN on which the device is + * operating. If this value is 0xffff, the device is not + * associated. The default value is 0xffff. + */ +uint16_t macSrcPANId; + +/** \brief The 16-bit address that the device uses to communicate in + * the PAN. If the device is the PAN coordinator, this value shall + * be chosen before a PAN is started. Otherwise, the address is + * allocated by a coordinator during association. A value of 0xfffe + * indicates that the device has associated but has not been + * allocated an address. A value of 0xffff indicates that the + * device does not have a short address. The default value is + * 0xffff. + */ +uint16_t macShortAddress; + + +/** \brief Our own long address. This needs to be read from EEPROM or + * other secure memory storage. + */ +uint64_t macLongAddr; + +/* Implementation */ + +/** \brief Initializes the (quasi) 802.15.4 MAC. This function should + * be called only once on startup. + */ +void +mac_init(void) +{ + volatile uint8_t buf[8]; + + sicslowmac_resetRequest(true); + + /* Set up the radio for auto mode operation. */ + hal_subregister_write( SR_MAX_FRAME_RETRIES, 2 ); + + /* Need to laod PANID for auto modes */ + radio_set_pan_id(DEST_PAN_ID); + + /* Buffer the uint64_t address for easy loading and debug. */ + /** \todo Find a better location to load the IEEE address. */ + buf[0] = macLongAddr & 0xFF; + buf[1] = (macLongAddr >> 8) & 0xFF; + buf[2] = (macLongAddr >> 16) & 0xFF; + buf[3] = (macLongAddr >> 24) & 0xFF; + buf[4] = (macLongAddr >> 32) & 0xFF; + buf[5] = (macLongAddr >> 40) & 0xFF; + buf[6] = (macLongAddr >> 48) & 0xFF; + buf[7] = (macLongAddr >> 56) & 0xFF; + /* Load the long address into the radio. This is required for auto mode */ + /* operation. */ + radio_set_extended_address((uint8_t *)&macLongAddr); + + srand(1234 ); + msduHandle = rand(); + + /* Ping6 debug */ + memcpy(uip_lladdr.addr, &macLongAddr, 8); + + /* Convert expected byte order */ + byte_reverse((uint8_t *)uip_lladdr.addr, 8); +} + + +/** @} */ +/** @} */ diff --git a/cpu/avr/radio/mac/sicslowmac.c b/cpu/avr/radio/mac/sicslowmac.c new file mode 100644 index 000000000..4153ba77b --- /dev/null +++ b/cpu/avr/radio/mac/sicslowmac.c @@ -0,0 +1,529 @@ +/* + * Copyright (c) 2008, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * $Id: sicslowmac.c,v 1.3 2008/10/14 18:36:07 c_oflynn Exp $ + */ + + +/** + * \file + * Example glue code between the existing MAC code and the + * Contiki mac interface + * + * \author + * Adam Dunkels + * Eric Gnoske + * Blake Leverett + * + * \addtogroup rf230mac + */ + +#include +#include +#include +#include +#include +#include +#include "net/rime/rimebuf.h" +#include "zmac.h" +#include "mac.h" +#include "frame.h" +#include "radio.h" +#include "tcpip.h" +#include "sicslowmac.h" +#include "sicslowpan.h" +#include "ieee-15-4-manager.h" + +/* Macros */ +#define DEBUG 0 +#define MAX_EVENTS 10 + +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#define SICSLOW_CORRECTION_DELAY 70 +#else +#define PRINTF(...) +#define SICSLOW_CORRECTION_DELAY 7 +#endif + +#ifdef JACKDAW +#include "sicslow_ethernet.h" +#define LOG_FRAME(x,y) mac_logTXtoEthernet(x,y) +#else +#define LOG_FRAME(x,y) +#endif + +/* Globals */ +static struct mac_driver mac_driver_struct; +static struct mac_driver *pmac_driver = &mac_driver_struct; +extern ieee_15_4_manager_t ieee15_4ManagerAddress; +static parsed_frame_t *parsed_frame; + + +const struct mac_driver sicslowmac_driver = { + sicslowmac_dataRequest, + /* read_packet, */ + /* set_receive_function, */ + /* on, */ + /* off, */ +}; + +static struct { + uint8_t head; + uint8_t tail; + event_object_t event_object[MAX_EVENTS]; +} event_queue; + +/* Prototypes */ +static void setinput(void (*r)(const struct mac_driver *d)); +void (*pinput)(const struct mac_driver *r); + +/*---------------------------------------------------------------------------*/ +/** + * \brief Checks for any pending events in the queue. + * + * \return True if there is a pending event, else false. + */ +uint8_t +mac_event_pending(void) +{ + return (event_queue.head != event_queue.tail); +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Puts an event into the queue of events. + * + * \param object is a pointer to the event to add to queue. + */ +void +mac_put_event(event_object_t *object) +{ + uint8_t newhead; + + if ((event_queue.head + 1) % MAX_EVENTS == event_queue.tail){ + /* queue full, get outta here */ + return; + } + + newhead = event_queue.head; + + /* store in queue */ + event_queue.event_object[newhead] = *object; + + /* calculate new head index */ + newhead++; + if (newhead >= MAX_EVENTS){ + newhead = 0; + } + event_queue.head = newhead; +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Pulls an event from the event queue. + * Assumes that there is an event in the queue. See mac_event_pending(). + * + * \return Pointer to the event object, or NULL in the event of empty queue. + */ +event_object_t +*mac_get_event(void) +{ + event_object_t *object = NULL; + volatile uint8_t newtail; + + newtail = event_queue.tail; + + object = &(event_queue.event_object[newtail]); + + /* calculate new tail */ + newtail++; + if (newtail >= MAX_EVENTS){ + newtail = 0; + } + + event_queue.tail = newtail; + + return(object); +} + +void mac_pollhandler(void) +{ + mac_task(0, NULL); +} + +/*---------------------------------------------------------------------------*/ +/** + * \brief This is the main loop task for the MAC. Called by the + * main application loop. + */ +void +mac_task(process_event_t ev, process_data_t data) +{ + /* check for event in queue */ + event_object_t *event; + + if(mac_event_pending()){ + + event = mac_get_event(); + + /* Handle events from radio */ + if (event){ + if (event->event == MAC_EVENT_RX){ + /* got a frame, find out with kind of frame */ + parsed_frame = (parsed_frame_t *)event->data; + if (parsed_frame->fcf->frameType == DATAFRAME){ + sicslowmac_dataIndication(); + } + + /* Frame no longer in use */ + parsed_frame->in_use = false; + } + + if (event->event == MAC_EVENT_DROPPED){ + /* Frame was dropped */ + printf("sicslowmac: Frame Dropped!\n"); + } + } + } +} +/*---------------------------------------------------------------------------*/ +void +setinput(void (*r)(const struct mac_driver *d)) +{ + pinput = r; +} +/*---------------------------------------------------------------------------*/ +static uint8_t dest_reversed[8]; +static uint8_t src_reversed[8]; + +void +sicslowmac_dataIndication(void) +{ + rimebuf_clear(); + + /* Finally, get the stuff into the rime buffer.... */ + rimebuf_copyfrom(parsed_frame->payload, parsed_frame->payload_length); + rimebuf_set_datalen(parsed_frame->payload_length); + + memcpy(dest_reversed, (uint8_t *)parsed_frame->dest_addr, 8); + memcpy(src_reversed, (uint8_t *)parsed_frame->src_addr, 8); + + /* Change addresses to expected byte order */ + byte_reverse((uint8_t *)dest_reversed, 8); + byte_reverse((uint8_t *)src_reversed, 8); + + rimebuf_set_addr(RIMEBUF_ADDR_RECEIVER, (const rimeaddr_t *)dest_reversed); + rimebuf_set_addr(RIMEBUF_ADDR_SENDER, (const rimeaddr_t *)src_reversed); + + PRINTF("sicslowmac: hand off frame to sicslowpan \n"); + pinput(pmac_driver); +} +/*---------------------------------------------------------------------------*/ +/** + * \brief This is the implementation of the 15.4 MAC Data Request + * primitive. + * + * \return Integer denoting success or failure. + * \retval 0 Failure. + * \retval 1 Success. + * + * The data request primitive creates the frame header based + * on static and dynamic data. The static data will be refined + * in phase II of the project. The frame payload and length are + * retrieved from the rime buffer and rime length respectively. + * + * When the header and payload are assembled into the + * frame_create_params structure, the frame is created + * by a call to frame_tx_create and then transmited via + * radio_send_data. + */ +/*---------------------------------------------------------------------------*/ +int +sicslowmac_dataRequest(void) +{ + + _delay_ms(SICSLOW_CORRECTION_DELAY); + + /* create structure to store result. */ + frame_create_params_t params; + frame_result_t result; + + /* Save the msduHandle in a global variable. */ + msduHandle = rimebuf_attr(RIMEBUF_ATTR_PACKET_ID); + + /* Build the FCF. */ + params.fcf.frameType = DATAFRAME; + params.fcf.securityEnabled = false; + params.fcf.framePending = false; + params.fcf.ackRequired = rimebuf_attr(RIMEBUF_ATTR_RELIABLE); + params.fcf.panIdCompression = false; + + /* Insert IEEE 802.15.4 (2003) version bit. */ + params.fcf.frameVersion = IEEE802154_2003; + + /* Increment and set the data sequence number. */ + params.seq = macDSN++; + + /* Complete the addressing fields. */ + /** + \todo For phase 1 the addresses are all long. We'll need a mechanism + in the rime attributes to tell the mac to use long or short for phase 2. + */ + params.fcf.srcAddrMode = LONGADDRMODE; + params.dest_pid = ieee15_4ManagerAddress.get_dst_panid(); + + /* + * If the output address is NULL in the Rime buf, then it is broadcast + * on the 802.15.4 network. + */ + if(rimeaddr_cmp(rimebuf_addr(RIMEBUF_ADDR_RECEIVER), &rimeaddr_null) ) { + /* Broadcast requires short address mode. */ + params.fcf.destAddrMode = SHORTADDRMODE; + params.dest_pid = BROADCASTPANDID; + params.dest_addr.addr16 = BROADCASTADDR; + + } else { + + /* Phase 1.5 - end nodes send to anyone? */ + memcpy(¶ms.dest_addr, (uint8_t *)rimebuf_addr(RIMEBUF_ADDR_RECEIVER), LONG_ADDR_LEN); + + /* Change from sicslowpan byte arrangement to sicslowmac */ + byte_reverse((uint8_t*)¶ms.dest_addr.addr64, LONG_ADDR_LEN); + + /* Phase 1 - end nodes only sends to pan coordinator node. */ + /* params.dest_addr.addr64 = ieee15_4ManagerAddress.get_coord_long_addr(); */ + params.fcf.destAddrMode = LONGADDRMODE; + } + + /* Set the source PAN ID to the global variable. */ + params.src_pid = ieee15_4ManagerAddress.get_src_panid(); + + /* + * Set up the source address using only the long address mode for + * phase 1. + */ + params.src_addr.addr64 = ieee15_4ManagerAddress.get_long_addr(); + + /* Copy the payload data. */ + params.payload_len = rimebuf_datalen(); + params.payload = rimebuf_dataptr(); + + /* Create transmission frame. */ + frame_tx_create(¶ms, &result); + + /* Log if needed */ + LOG_FRAME(¶ms, &result); + + /* Retry up to this many times to send the packet if radio is busy */ + uint8_t retry_count = 3; + + while(retry_count) { + + PRINTF("sicslowmac: sending packet of length %d to radio, result:", result.length); + + + + /* Send data to radio. */ + radio_status_t rv = radio_send_data(result.length, result.frame); + + if (rv == RADIO_SUCCESS) { + PRINTF(" Success\n"); + + return 1; /* True says that the packet could be sent */ + } + + + if (rv != RADIO_WRONG_STATE) { + PRINTF(" Failed\n"); + return 0; + } + + PRINTF(" Radio busy, retrying\n"); + + /** \todo: Fix delay in sicslowmac so they do not block receiving */ + + //We have blocking delay here, it is safest this way. BUT doesn't solve the + //problem of TX when you are RXing.. as the RX code can't execute! + if (retry_count == 3) { + _delay_ms(10); + } else if (retry_count == 2) { + _delay_ms(50); + } else if (retry_count == 1) { + _delay_ms(200); + } + + retry_count--; + } + + PRINTF("sicslowmac: Unable to send packet, dropped\n"); + return 0; + +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Stub function that will be implemented in phase 2 to cause + * end nodes to sleep. + */ +int +mac_wake(void) +{ + return 1; +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Stub function that will be implemented in phase 2 to cause + * end nodes to sleep. + */ +int +mac_sleep(void) +{ + return 1; +} +/*---------------------------------------------------------------------------*/ +const struct mac_driver * +sicslowmac_init(const struct radio_driver *d) +{ + /* AD: commented out the radio_driver code for now.*/ + /* radio = d; + radio->set_receive_function(input_packet); + radio->on();*/ + + return &sicslowmac_driver; +} +/*---------------------------------------------------------------------------*/ +/** + * \brief This is the implementation of the 15.4 MAC Reset Request + * primitive. + * \param setDefaultPIB True if the default PIB values should be set. + * \return Integer denoting success or failure. + * \retval 0 Failure. + * \retval 1 Success. + * + * Sets all PIB values to default. + */ +void +sicslowmac_resetRequest (bool setDefaultPIB) +{ + if(setDefaultPIB){ + /* initialize all of the MAC PIB variables to their default values */ + macCoordShortAddress = 0xffff; + macDSN = rand() % 256; + macSrcPANId = SOURCE_PAN_ID; + macDstPANId = DEST_PAN_ID; + macShortAddress = 0xffff; + /* Setup the address of this device by reading a stored address from eeprom. */ + /** \todo This might be read from the serial eeprom onboard Raven. */ + AVR_ENTER_CRITICAL_REGION(); + eeprom_read_block ((void *)&macLongAddr, EEPROMMACADDRESS, 8); + + byte_reverse((uint8_t *) &macLongAddr, 8); + + + AVR_LEAVE_CRITICAL_REGION(); + } +} + +parsed_frame_t * sicslowmac_get_frame(void) +{ + return parsed_frame; +} + +/*---------------------------------------------------------------------------*/ +struct mac_driver * sicslowmac_get_driver(void) +{ + return pmac_driver; +} +/*---------------------------------------------------------------------------*/ +PROCESS(mac_process, "802.15.4 MAC process"); +PROCESS_THREAD(mac_process, ev, data) +{ + + PROCESS_POLLHANDLER(mac_pollhandler()); + + + PROCESS_BEGIN(); + + radio_status_t return_value; + + /* init radio */ + /** \todo: this screws up if calosc is set to TRUE, find out why? */ + return_value = radio_init(false, NULL, NULL, NULL); + +#if DEBUG + if (return_value == RADIO_SUCCESS) { + printf("Radio init successful.\n"); + } else { + printf("Radio init failed with return: %d\n", return_value); + } +#endif + + radio_set_operating_channel(24); + radio_use_auto_tx_crc(true); + radio_set_trx_state(TRX_OFF); + + mac_init(); + + /* Set up MAC function pointers and sicslowpan callback. */ + pmac_driver->set_receive_function = setinput; + pmac_driver->send = sicslowmac_dataRequest; + sicslowpan_init(pmac_driver); + + ieee_15_4_init(&ieee15_4ManagerAddress); + + radio_set_trx_state(RX_AACK_ON); + + while(1) { + PROCESS_YIELD(); + mac_task(ev, data); + + } + + PROCESS_END(); +} + +void byte_reverse(uint8_t * bytes, uint8_t num) +{ + uint8_t tempbyte; + + uint8_t i, j; + + i = 0; + j = num - 1; + + while(i < j) { + tempbyte = bytes[i]; + bytes[i] = bytes[j]; + bytes[j] = tempbyte; + + j--; + i++; + } + + return; +} diff --git a/cpu/avr/radio/mac/sicslowmac.h b/cpu/avr/radio/mac/sicslowmac.h new file mode 100644 index 000000000..d8f3a6b0a --- /dev/null +++ b/cpu/avr/radio/mac/sicslowmac.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2008, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * $Id: sicslowmac.h,v 1.3 2008/10/14 18:36:07 c_oflynn Exp $ + */ + +/** + * \file + * Example glue code between the existing MAC code and the + * Contiki mac interface + * \author + * Adam Dunkels + * Eric Gnoske + * Blake Leverett + */ + +/** + \addtogroup rf230mac +*/ + +#ifndef __SICSLOWMAC_H__ +#define __SICSLOWMAC_H__ + +#include +#include +#include "contiki.h" +#include "dev/radio.h" +#include "frame.h" + +/* Macros & Defines */ + +typedef enum { + MAC_EVENT_RX=0x10, + MAC_EVENT_ACK, + MAC_EVENT_NACK, + MAC_EVENT_SCAN, + MAC_EVENT_BEACON_REQ, + MAC_EVENT_DROPPED, + MAC_EVENT_TX + /* MAC_EVENT_TIMER */ +} event_t; + +typedef struct { + event_t event; /**< Event type, see event_t for details. */ + uint8_t *data; /**< Associated data that goes with the event. Depends on event type. */ +} event_object_t; + +extern const struct mac_driver sicslowmac_driver; + +/* Prototypes */ +PROCESS_NAME(mac_process); + +uint8_t mac_event_pending(void); +void mac_put_event(event_object_t *object); +event_object_t *mac_get_event(void); +void mac_task(process_event_t ev, process_data_t data); +uint8_t nwk_dataIndication(void); +const struct mac_driver *sicslowmac_init(const struct radio_driver *r); +/* void sicslowmac_input_packet(const struct radio_driver *d); */ +int sicslowmac_dataRequest(void); +void sicslowmac_dataIndication(void); +void sicslowmac_resetRequest (bool setDefaultPIB); +int sicsloread(void); +void byte_reverse(uint8_t * bytes, uint8_t num); +struct mac_driver * sicslowmac_get_driver(void); +parsed_frame_t * sicslowmac_get_frame(void); + +#endif /* __SICSLOWMAC_H__ */ diff --git a/cpu/avr/radio/mac/zmac.h b/cpu/avr/radio/mac/zmac.h new file mode 100644 index 000000000..bc926db12 --- /dev/null +++ b/cpu/avr/radio/mac/zmac.h @@ -0,0 +1,239 @@ +/* Copyright (c) 2008, Swedish Institute of Computer Science + * All rights reserved. + * + * Additional fixes for AVR contributed by: + * + * Colin O'Flynn coflynn@newae.com + * Eric Gnoske egnoske@gmail.com + * Blake Leverett bleverett@gmail.com + * Mike Vidales mavida404@gmail.com + * Kevin Brown kbrown3@uccs.edu + * Nate Bohlmann nate@elfwerks.com + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +/** + * \brief The equivalent IEEE 802.15.4 (2003/2006) header file for + * the mac primitives. + * + */ +/** + * \addtogroup rf230mac + * @{ +*/ +/** + * \file + * \brief The IEEE 802.15.4 (2003/2006) MAC utility functions. + */ + +#ifndef MAC_H +#define MAC_H + +/* Includes */ +#include +#include +#include "frame.h" +#include "ieee-15-4-manager.h" + +#define EEPROMMACADDRESS ((void*)0) +#define EEPROMDSTADDRESS ((void*)8) +#define EEPROMCHANADDRESS ((void*)16) +#define EEPROMPANIDADDRESS ((void*)17) +#define EEPROMROLEADDRESS ((void*)19) +#define SUCCESS (0) +#define CHANNEL_PAGE_0 (0) + + + + +/* MAC command frames codes */ + +/* MAC enumerations */ +/** \brief Pre-defined data frame control field (FCF) values. + * \name FCF Values + * @{ +*/ +#define FCF_NO_ACK (0x8841) +#define FCF_ACK_REQ (0x8861) +/** @} */ + +/** \brief Hardcoded various "network" addresses, for use when testing. + * \name Pre-defined network addresses + * @{ + */ +#define DEST_PAN_ID (0xABCD) +#define SOURCE_PAN_ID (0xABCD) +#define LONG_ADDR_1 (0xFFEEDDCCBBAA1100LL) +#define LONG_ADDR_2 (0x1122334455667788LL) +#define LONG_ADDR_3 (0xDDEEAADDBBEEEEFFLL) +#define LONG_ADDR_4 (0x0123456789ABCDEFLL) +#define SOURCE_ADDR (0x1234) +#define FCF_ACK (0x0002) +#define TX_OPTION_NOACK (0) +#define TX_OPTION_ACK (1) +#define LONG_ADDR_LEN (8) +/** @} */ + +#define MPDU_OVERHEAD (11) /**< This overhead includes FCF, DSN, DEST_PAN_ID, DEST_ADDR, SOURCE_ADDR, & FCS */ + + +/** \brief These are some definitions of values used in the FCF. See the 802.15.4 spec for details. + * \name FCF element values definitions + * @{ + */ +#define BEACONFRAME (0x00) +#define DATAFRAME (0x01) +#define ACKFRAME (0x02) +#define CMDFRAME (0x03) + +#define BEACONREQ (0x07) + +#define IEEERESERVED (0x00) +#define NOADDR (0x00) /**< Only valid for ACK or Beacon frames. */ +#define SHORTADDRMODE (0x02) +#define LONGADDRMODE (0x03) + +#define NOBEACONS (0x0F) + +#define BROADCASTADDR (0xFFFF) +#define BROADCASTPANDID (0xFFFF) + +#define IEEE802154_2003 (0x00) +#define IEEE802154_2006 (0x01) + +#define SECURITY_LEVEL_NONE (0) +#define SECURITY_LEVEL_128 (3) + +#define PSDULEN (127) +/** @} */ + + +/* typedef enum {TRUE, FALSE} bool; */ + +typedef struct dataRequest { + uint8_t srcAddrMode; + uint8_t dstAddrMode; + uint16_t dstPANId; + addr_t dstAddr; + uint8_t msduLength; + uint8_t *msdu; + uint8_t msduHandle; + uint8_t txOptions; + uint8_t securityLevel; + uint8_t keyIdMode; + uint8_t *keySource; + uint8_t keyIndex; +} dataRequest_t; + + +/* Macros & Defines */ +extern ieee_15_4_manager_t ieee15_4ManagerAddress; +extern dataRequest_t dataRequestStructAddress; +#define ieee15_4Struct (&ieee15_4ManagerAddress) +#define dataRequestStruct (&dataRequestStructAddress) + + +/** + * \name Scan variables + * \brief Global variables and defines for scan. + * \{ +*/ +extern uint8_t msduHandle; +extern bool iAmCoord; +extern bool autoModes; +extern uint16_t macShortAddr; +extern uint64_t macLongAddr; +/** @} */ + +/* PHY PIB Attributes */ + +/* uint8_t phyCurrentChannel Integer 0-26 + * The RF channel to use for all following transmissions and receptions (see6.1.2). + */ +extern uint8_t phyCurrentChannel; + +/* uint64_t macCoordExtendedAddress -- no default + * + * The 64-bit address of the coordinator/router through which the network layer wishes to communicate + */ +extern uint64_t macCoordExtendedAddress; + +/* uint16_t macCoordShortAddress -- default 0xffff + * + * The 16-bit short address assigned to the coordinator through which the network layer wishes + * to communicate. A value of 0xfffe indicates th the coordinator is only using it's 64-bit + * extended address. A value of 0xffff indicates that this value is unknown. + */ +extern uint16_t macCoordShortAddress; + +/* uint64_t macDestAddress -- default 0xffff + * + * This address is the 64-bit address that will be used as the mechanism to + * provide a destination to the upper layers. + */ +extern uint64_t macDestAddress; + +/* uint8_t macDSN -- default is random value within the range + * + * The sequence number (0x00 - 0xff) added to the transmitted data or MAC command frame. + */ +extern uint8_t macDSN; + +/* uint16_t macDstPANId -- default 0xffff + * + * The 16-bit identifier of the PAN on which the device is sending to. If this value + * is 0xffff, the device is not associated. + */ +extern uint16_t macDstPANId; + +/* uint16_t macSrcPANId -- default 0xffff + * + * The 16-bit identifier of the PAN on which the device is operating. If this value + * is 0xffff, the device is not associated. + */ +extern uint16_t macSrcPANId; + +/* uint16_t macShortAddress -- default 0xffff + * + * The 16-bit address that the device uses to communicate in the PAN. If the device is the + * PAN coordinator, this value shall be chosen before a PAN is started. Otherwise, the + * address is allocated by a coordinator during association. A value of 0xfffe indicates + * that the device has associated but has not been allocated an address. A value of 0xffff + * indicates that the device does not have a short address. + */ +extern uint16_t macShortAddress; + +/* Scan defines */ + + +/* Protoypes */ +void mac_init(void); + +#endif + +/** @} */