Adding updated files
This commit is contained in:
parent
9cc14d43ef
commit
15ba03fea5
5 changed files with 1058 additions and 0 deletions
4
cpu/avr/radio/mac/Makefile.mac
Normal file
4
cpu/avr/radio/mac/Makefile.mac
Normal 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
191
cpu/avr/radio/mac/mac.c
Normal 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
/** @} */
|
529
cpu/avr/radio/mac/sicslowmac.c
Normal file
529
cpu/avr/radio/mac/sicslowmac.c
Normal 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(¶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;
|
||||||
|
}
|
95
cpu/avr/radio/mac/sicslowmac.h
Normal file
95
cpu/avr/radio/mac/sicslowmac.h
Normal 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
239
cpu/avr/radio/mac/zmac.h
Normal 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
|
||||||
|
|
||||||
|
/** @} */
|
Loading…
Reference in a new issue