Adding updated files

This commit is contained in:
c_oflynn 2008-10-14 18:36:07 +00:00
parent 9cc14d43ef
commit 15ba03fea5
5 changed files with 1058 additions and 0 deletions

View file

@ -0,0 +1,4 @@
CONTIKI_TARGET_SOURCEFILES += mac.c sicslowmac.c
APPDIRS += $(CONTIKI)/cpu/avr/radio/mac

191
cpu/avr/radio/mac/mac.c Normal file
View file

@ -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 <egnoske@gmail.com>
* Blake Leverett <bleverett@gmail.com>
* Mike Vidales <mavida404@gmail.com>
* Colin O'Flynn <coflynn@newae.com>
*
*/
/* Includes */
#include <stdlib.h>
#include <string.h>
#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);
}
/** @} */
/** @} */

View file

@ -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 <adam@sics.se>
* Eric Gnoske <egnoske@gmail.com>
* Blake Leverett <bleverett@gmail.com>
*
* \addtogroup rf230mac
*/
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#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(&params.dest_addr, (uint8_t *)rimebuf_addr(RIMEBUF_ADDR_RECEIVER), LONG_ADDR_LEN);
/* Change from sicslowpan byte arrangement to sicslowmac */
byte_reverse((uint8_t*)&params.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(&params, &result);
/* Log if needed */
LOG_FRAME(&params, &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;
}

View file

@ -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 <adam@sics.se>
* Eric Gnoske <egnoske@gmail.com>
* Blake Leverett <bleverett@gmail.com>
*/
/**
\addtogroup rf230mac
*/
#ifndef __SICSLOWMAC_H__
#define __SICSLOWMAC_H__
#include <stdbool.h>
#include <stdint.h>
#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__ */

239
cpu/avr/radio/mac/zmac.h Normal file
View file

@ -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 <stdint.h>
#include <stdbool.h>
#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
/** @} */