From 6f238a6eff8c98f2edcef995ca6bb9069a1a4f63 Mon Sep 17 00:00:00 2001 From: andreaskoepke Date: Sat, 10 Mar 2007 22:01:58 +0000 Subject: [PATCH] expose clock divider of tda5250, add a component that uses this as an input to SMCLK -- use with caution. --- tos/chips/tda5250/ClkDiv.nc | 62 ++++++++++++++++++++++++++++++ tos/chips/tda5250/Tda5250RadioC.nc | 2 + tos/chips/tda5250/Tda5250RadioP.nc | 12 ++++++ 3 files changed, 76 insertions(+) create mode 100644 tos/chips/tda5250/ClkDiv.nc diff --git a/tos/chips/tda5250/ClkDiv.nc b/tos/chips/tda5250/ClkDiv.nc new file mode 100644 index 00000000..7209c8ce --- /dev/null +++ b/tos/chips/tda5250/ClkDiv.nc @@ -0,0 +1,62 @@ +/* -*- mode:c++; indent-tabs-mode: nil -*- + * Copyright (c) 2007, Technische Universitaet Berlin + * 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 Technische Universitaet Berlin 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. + * + * $Revision$ + * $Date$ + */ + +/** + * This radio provides a clock divider output that can be used to drive + * a high frequency clock of an micro processor. + * @author: Andreas Koepke + */ + +interface ClkDiv { + /** + * this event signals that the clkdiv delivers a stable signal + */ + async event void startDone(); + + /** + * this event signals that the clkdiv will stop to deliver a stable signal + */ + async event void stopping(); + + /** + * From now on, never switch the clkdiv off -- consumes more energy! + * This command may take a while until it takes effect. + */ + // command void alwaysOnMode(); + + /** + * Return to default mode: clkdiv is switched on when the radio demands + * it, other components will get the start/stop events and hence know what + * is going on now. + */ + // command void sporadicMode(); +} diff --git a/tos/chips/tda5250/Tda5250RadioC.nc b/tos/chips/tda5250/Tda5250RadioC.nc index 4e2b46e4..0989c774 100644 --- a/tos/chips/tda5250/Tda5250RadioC.nc +++ b/tos/chips/tda5250/Tda5250RadioC.nc @@ -46,6 +46,7 @@ configuration Tda5250RadioC { interface Tda5250Control; interface ResourceRequested; interface RadioByteComm; + interface ClkDiv; } } implementation { @@ -63,6 +64,7 @@ implementation { ResourceRequested = Tda5250RadioP; RadioByteComm = Tda5250RadioP; SplitControl = Tda5250RadioP; + ClkDiv = Tda5250RadioP; Tda5250RadioP.DelayTimer -> DelayTimer; diff --git a/tos/chips/tda5250/Tda5250RadioP.nc b/tos/chips/tda5250/Tda5250RadioP.nc index 20d39dcf..9b82771c 100644 --- a/tos/chips/tda5250/Tda5250RadioP.nc +++ b/tos/chips/tda5250/Tda5250RadioP.nc @@ -54,6 +54,7 @@ module Tda5250RadioP { interface Tda5250Control; interface RadioByteComm; interface ResourceRequested; + interface ClkDiv; } uses { interface HplTda5250Config; @@ -86,6 +87,7 @@ implementation { /**************** Radio Start *****************/ task void startDoneTask() { + signal ClkDiv.startDone(); signal SplitControl.startDone(SUCCESS); } @@ -135,18 +137,22 @@ implementation { switch(mode) { case RADIO_MODE_ON_TRANSITION: call HplTda5250Config.reset(); + // call HplTda5250Config.SetRFPower(240); + // call HplTda5250Config.SetClockOnDuringPowerDown(); call HplTda5250Config.SetRFPower(255); call ConfigResource.release(); atomic radioMode = RADIO_MODE_ON; post startDoneTask(); break; case RADIO_MODE_OFF_TRANSITION: + signal ClkDiv.stopping(); call HplTda5250Config.SetSleepMode(); call ConfigResource.release(); atomic radioMode = RADIO_MODE_OFF; post stopDoneTask(); break; case RADIO_MODE_SLEEP_TRANSITION: + signal ClkDiv.stopping(); call HplTda5250Config.SetSlaveMode(); call HplTda5250Config.SetSleepMode(); atomic radioMode = RADIO_MODE_SLEEP; @@ -405,6 +411,7 @@ implementation { signal Tda5250Control.RssiStable(); break; case RECEIVER_DELAY : + signal ClkDiv.startDone(); delayTimer = RSSISTABLE_DELAY; call DelayTimer.start(TDA5250_RSSI_STABLE_TIME-TDA5250_RECEIVER_SETUP_TIME); if (call DataResource.immediateRequest() == SUCCESS) { @@ -414,6 +421,7 @@ implementation { } break; case TRANSMITTER_DELAY : + signal ClkDiv.startDone(); if (call DataResource.immediateRequest() == SUCCESS) { switchDataResource(); } else { @@ -443,4 +451,8 @@ implementation { } default async event void RadioByteComm.txByteReady(error_t error) { } + default async event void ClkDiv.startDone() { + } + default async event void ClkDiv.stopping() { + } } -- 2.39.2