From: liang_mike Date: Thu, 24 Jul 2008 19:52:46 +0000 (+0000) Subject: Add tosthreads active message support to tinynode X-Git-Tag: release_tinyos_2_1_0_0~33 X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=tinyos-2.x.git;a=commitdiff_plain;h=71e44d2c74f52030aa3dcdb3e70f6363e00e0f13 Add tosthreads active message support to tinynode --- diff --git a/tos/lib/tosthreads/chips/xe1205/XE1205ActiveMessageC.nc b/tos/lib/tosthreads/chips/xe1205/XE1205ActiveMessageC.nc new file mode 100644 index 00000000..e0173159 --- /dev/null +++ b/tos/lib/tosthreads/chips/xe1205/XE1205ActiveMessageC.nc @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), + * Switzerland. + * 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 Ecole Polytechnique Federale de Lausanne (EPFL) + * 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 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. + * + * ======================================================================== + */ + +/* + * @author Henri Dubois-Ferriere + * + */ +configuration XE1205ActiveMessageC { + provides { + interface SplitControl; + interface AMSend[am_id_t id]; + interface Receive[am_id_t id]; + interface Receive as ReceiveDefault[am_id_t id]; + interface Receive as SnoopDefault[am_id_t id]; + interface Receive as Snoop[am_id_t id]; + interface AMPacket; + interface Packet; + interface PacketAcknowledgements; + #ifdef LOW_POWER_LISTENING + interface LowPowerListening; + #endif + } +} +implementation { + components XE1205SendReceiveC; + Packet = XE1205SendReceiveC; + PacketAcknowledgements = XE1205SendReceiveC; + components XE1205ActiveMessageP; + +#ifdef LOW_POWER_LISTENING + components XE1205LowPowerListeningC as Lpl; + LowPowerListening = Lpl; + XE1205ActiveMessageP.SubSend -> Lpl.Send; + XE1205ActiveMessageP.SubReceive -> Lpl.Receive; + SplitControl = Lpl; +#else + + XE1205ActiveMessageP.Packet -> XE1205SendReceiveC; + XE1205ActiveMessageP.SubSend -> XE1205SendReceiveC.Send; + XE1205ActiveMessageP.SubReceive -> XE1205SendReceiveC.Receive; + SplitControl = XE1205SendReceiveC; +#endif + AMPacket = XE1205ActiveMessageP; + AMSend = XE1205ActiveMessageP; + Receive = XE1205ActiveMessageP.Receive; + ReceiveDefault = XE1205ActiveMessageP.ReceiveDefault; + Snoop = XE1205ActiveMessageP.Snoop; + SnoopDefault = XE1205ActiveMessageP.SnoopDefault; + + + components ActiveMessageAddressC; + XE1205ActiveMessageP.amAddress -> ActiveMessageAddressC; + + + components XE1205IrqConfC, XE1205PatternConfC, XE1205PhyRssiConfC; + +} diff --git a/tos/lib/tosthreads/chips/xe1205/XE1205ActiveMessageP.nc b/tos/lib/tosthreads/chips/xe1205/XE1205ActiveMessageP.nc new file mode 100644 index 00000000..31cd6dce --- /dev/null +++ b/tos/lib/tosthreads/chips/xe1205/XE1205ActiveMessageP.nc @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), + * Switzerland. + * 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 Ecole Polytechnique Federale de Lausanne (EPFL) + * 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 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. + * + * ======================================================================== + */ + +/* + * @author Henri Dubois-Ferriere + * + */ +module XE1205ActiveMessageP { + uses interface Packet; + uses interface Send as SubSend; + uses interface Receive as SubReceive; + uses command am_addr_t amAddress(); + + provides interface AMSend[am_id_t id]; + provides interface AMPacket; + provides interface Receive[am_id_t id]; + provides interface Receive as ReceiveDefault[am_id_t id]; + provides interface Receive as Snoop[am_id_t id]; + provides interface Receive as SnoopDefault[am_id_t id]; +} +implementation { + // xxx - this is replicated in ActiveMessageP. + // put in XE1205.h? + xe1205_header_t* getHeader( message_t* msg ) { + return (xe1205_header_t*)( msg->data - sizeof(xe1205_header_t) ); + } + + command am_addr_t AMPacket.address() { + return call amAddress(); + } + + command am_addr_t AMPacket.destination(message_t* msg) { + xe1205_header_t* header = getHeader(msg); + return header->dest; + } + + command void AMPacket.setDestination(message_t* msg, am_addr_t addr) { + xe1205_header_t* header = getHeader(msg); + header->dest = addr; + } + + command am_addr_t AMPacket.source(message_t* msg) { + xe1205_header_t* header = getHeader(msg); + return header->source; + } + + command void AMPacket.setSource(message_t* msg, am_addr_t addr) { + xe1205_header_t* header = getHeader(msg); + header->source = addr; + } + + command bool AMPacket.isForMe(message_t* msg) { + return (call AMPacket.destination(msg) == call AMPacket.address() || + call AMPacket.destination(msg) == AM_BROADCAST_ADDR); + } + + command am_id_t AMPacket.type(message_t* msg) { + xe1205_header_t* header = getHeader(msg); + return header->type; + } + + command void AMPacket.setType(message_t* msg, am_id_t type) { + xe1205_header_t* header = getHeader(msg); + header->type = type; + } + + command void AMPacket.setGroup(message_t* msg, am_group_t group) { + xe1205_header_t* header = getHeader(msg); + header->group = group; + } + + command am_group_t AMPacket.group(message_t* msg) { + xe1205_header_t* header = getHeader(msg); + return header->group; + } + + command am_group_t AMPacket.localGroup() { + return TOS_AM_GROUP; + } + + command uint8_t AMSend.maxPayloadLength[am_id_t id]() { + return call Packet.maxPayloadLength(); + } + + command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { + return call Packet.getPayload(m, len); + } + + command error_t AMSend.send[am_id_t id](am_addr_t addr, + message_t* msg, + uint8_t len) { + xe1205_header_t* header = getHeader(msg); + header->type = id; + header->dest = addr; + header->source = call AMPacket.address(); + header->group = TOS_AM_GROUP; + return call SubSend.send(msg, len); + } + + command error_t AMSend.cancel[am_id_t id](message_t* msg) { + return call SubSend.cancel(msg); + } + + event void SubSend.sendDone(message_t* msg, error_t result) { + signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); + } + + default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { + return; + } + + event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) __attribute__ ((noinline)) { + if (call AMPacket.isForMe(msg)) { + return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len); + } + else { + return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len); + } + } + + default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { + return signal ReceiveDefault.receive[id](msg, payload, len); + } + + default event message_t* ReceiveDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { + return msg; + } + + default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { + return signal SnoopDefault.receive[id](msg, payload, len); + } + + default event message_t* SnoopDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { + return msg; + } + + +} + diff --git a/tos/lib/tosthreads/platforms/tinynode/ActiveMessageC.nc b/tos/lib/tosthreads/platforms/tinynode/ActiveMessageC.nc new file mode 100644 index 00000000..9288814a --- /dev/null +++ b/tos/lib/tosthreads/platforms/tinynode/ActiveMessageC.nc @@ -0,0 +1,74 @@ +// $Id$ + +/* + * "Copyright (c) 2004-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2004-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ +/* + * + * Authors: Philip Levis + * Date last modified: $Id$ + * + */ + +/** + * + * The Active Message layer on the TinyNode platform. This is a naming wrapper + * around the XE1205 Active Message layer. + * + * @author Philip Levis, Henri Dubois-Ferriere + */ + +configuration ActiveMessageC { + provides { + interface SplitControl @atleastonce(); + + interface AMSend[uint8_t id]; + interface Receive[am_id_t id]; + interface Receive as ReceiveDefault[am_id_t id]; + interface Receive as Snoop[am_id_t id]; + interface Receive as SnoopDefault[am_id_t id]; + + interface Packet; + interface AMPacket; + interface PacketAcknowledgements; + } +} +implementation { + components XE1205ActiveMessageC as AM; + + SplitControl = AM; + + AMSend = AM; + Receive = AM.Receive; + ReceiveDefault = AM.ReceiveDefault; + Snoop = AM.Snoop; + SnoopDefault = AM.SnoopDefault; + Packet = AM; + AMPacket = AM; + PacketAcknowledgements = AM; +}