]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
use async power manager for adc
authoridgay <idgay>
Wed, 9 Aug 2006 22:42:20 +0000 (22:42 +0000)
committeridgay <idgay>
Wed, 9 Aug 2006 22:42:20 +0000 (22:42 +0000)
add some calls to power management update

tos/chips/atm128/adc/Atm128AdcC.nc
tos/chips/atm128/adc/Atm128AdcP.nc
tos/chips/atm128/adc/HplAtm128AdcC.nc
tos/chips/atm128/adc/HplAtm128AdcP.nc [new file with mode: 0644]

index 585375de710ca477cd418399f3520b74109a9298..ad1d17b4c0953e9c0bdd4af1878670070d15a00e 100644 (file)
@@ -52,7 +52,7 @@ implementation
 {
   components Atm128AdcP, HplAtm128AdcC, PlatformC, MainC,
     new RoundRobinArbiterC(UQ_ATM128ADC_RESOURCE) as AdcArbiter,
-    new StdControlPowerManagerC() as PM;
+    new AsyncStdControlPowerManagerC() as PM;
 
   Resource = AdcArbiter;
   ResourceConfigure = AdcArbiter;
@@ -65,7 +65,7 @@ implementation
   Atm128AdcP.Atm128Calibrate -> PlatformC;
 
   PM.Init <- MainC;
-  PM.StdControl -> Atm128AdcP;
+  PM.AsyncStdControl -> Atm128AdcP;
   PM.ArbiterInit -> AdcArbiter;
   PM.ResourceController -> AdcArbiter;
 }
index 2510301aeaad0d31f5363bf94df99ccb43411fc1..2d6f2b587c220bebbd2b09c97f9506c386b37c0f 100644 (file)
@@ -63,7 +63,7 @@ module Atm128AdcP
 {\r
   provides {\r
     interface Init;\r
-    interface StdControl;\r
+    interface AsyncStdControl;\r
     interface Atm128AdcSingle;\r
     interface Atm128AdcMultiple;\r
   }\r
@@ -101,12 +101,12 @@ implementation
      called. This drops A/D conversion latency by a factor of two (but\r
      increases idle mode power consumption a little). \r
   */\r
-  command error_t StdControl.start() {\r
+  async command error_t AsyncStdControl.start() {\r
     atomic call HplAtm128Adc.enableAdc();\r
     return SUCCESS;\r
   }\r
 \r
-  command error_t StdControl.stop() {\r
+  async command error_t AsyncStdControl.stop() {\r
     atomic call HplAtm128Adc.disableAdc();\r
 \r
     return SUCCESS;\r
index 08a3e916434a4f32d0997d699e365da0d0da14ce..7f0987f9118dfe1a5a255a696fc69e26bd7d9f65 100644 (file)
  * @author David Gay
  */
 
-module HplAtm128AdcC {
+configuration HplAtm128AdcC {
   provides interface HplAtm128Adc;
 }
 implementation {
-  //=== Direct read of HW registers. =================================
-  async command Atm128Admux_t HplAtm128Adc.getAdmux() { 
-    return *(Atm128Admux_t*)&ADMUX; 
-  }
-  async command Atm128Adcsra_t HplAtm128Adc.getAdcsra() { 
-    return *(Atm128Adcsra_t*)&ADCSRA; 
-  }
-  async command uint16_t HplAtm128Adc.getValue() { 
-    return ADC; 
-  }
+  components HplAtm128AdcP, McuSleepC;
 
-  DEFINE_UNION_CAST(Admux2int, Atm128Admux_t, uint8_t);
-  DEFINE_UNION_CAST(Adcsra2int, Atm128Adcsra_t, uint8_t);
-
-  //=== Direct write of HW registers. ================================
-  async command void HplAtm128Adc.setAdmux( Atm128Admux_t x ) { 
-    ADMUX = Admux2int(x); 
-  }
-  async command void HplAtm128Adc.setAdcsra( Atm128Adcsra_t x ) { 
-    ADCSRA = Adcsra2int(x); 
-  }
-
-  async command void HplAtm128Adc.setPrescaler(uint8_t scale){
-    Atm128Adcsra_t  current_val = call HplAtm128Adc.getAdcsra(); 
-    current_val.adif = FALSE;
-    current_val.adps = scale;
-    call HplAtm128Adc.setAdcsra(current_val);
-  }
-
-  // Individual bit manipulation. These all clear any pending A/D interrupt.
-  // It's not clear these are that useful...
-  async command void HplAtm128Adc.enableAdc() { SET_BIT(ADCSRA, ADEN); }
-  async command void HplAtm128Adc.disableAdc() { CLR_BIT(ADCSRA, ADEN); }
-  async command void HplAtm128Adc.enableInterruption() { SET_BIT(ADCSRA, ADIE); }
-  async command void HplAtm128Adc.disableInterruption() { CLR_BIT(ADCSRA, ADIE); }
-  async command void HplAtm128Adc.setContinuous() { SET_BIT(ADCSRA, ADFR); }
-  async command void HplAtm128Adc.setSingle() { CLR_BIT(ADCSRA, ADFR); }
-  async command void HplAtm128Adc.resetInterrupt() { SET_BIT(ADCSRA, ADIF); }
-  async command void HplAtm128Adc.startConversion() { SET_BIT(ADCSRA, ADSC); }
-
-
-  /* A/D status checks */
-  async command bool HplAtm128Adc.isEnabled()     {       
-    return (call HplAtm128Adc.getAdcsra()).aden; 
-  }
-
-  async command bool HplAtm128Adc.isStarted()     {
-    return (call HplAtm128Adc.getAdcsra()).adsc; 
-  }
-  
-  async command bool HplAtm128Adc.isComplete()    {
-    return (call HplAtm128Adc.getAdcsra()).adif; 
-  }
-
-  /* A/D interrupt handlers. Signals dataReady event with interrupts enabled */
-  AVR_ATOMIC_HANDLER(SIG_ADC) {
-    uint16_t data = call HplAtm128Adc.getValue();
-    
-    __nesc_enable_interrupt();
-    signal HplAtm128Adc.dataReady(data);
-  }
-
-  default async event void HplAtm128Adc.dataReady(uint16_t done) { }
-
-  async command bool HplAtm128Adc.cancel() { 
-    /* This is tricky */
-    atomic
-      {
-       Atm128Adcsra_t oldSr = call HplAtm128Adc.getAdcsra(), newSr;
-
-       /* To cancel a conversion, first turn off ADEN, then turn off
-          ADSC. We also cancel any pending interrupt.
-          Finally we reenable the ADC.
-       */
-       newSr = oldSr;
-       newSr.aden = FALSE;
-       newSr.adif = TRUE; /* This clears a pending interrupt... */
-       newSr.adie = FALSE; /* We don't want to start sampling again at the
-                              next sleep */
-       call HplAtm128Adc.setAdcsra(newSr);
-       newSr.adsc = FALSE;
-       call HplAtm128Adc.setAdcsra(newSr);
-       newSr.aden = TRUE;
-       call HplAtm128Adc.setAdcsra(newSr);
-
-       return oldSr.adif || oldSr.adsc;
-      }
-  }
+  HplAtm128Adc = HplAtm128AdcP;
+  HplAtm128AdcP.McuPowerState -> McuSleepC;
 }
diff --git a/tos/chips/atm128/adc/HplAtm128AdcP.nc b/tos/chips/atm128/adc/HplAtm128AdcP.nc
new file mode 100644 (file)
index 0000000..0090e90
--- /dev/null
@@ -0,0 +1,134 @@
+/// $Id$\r
+
+/*
+ * Copyright (c) 2004-2005 Crossbow Technology, Inc.  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 CROSSBOW TECHNOLOGY OR ANY OF ITS LICENSORS 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 CROSSBOW OR ITS LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 
+ * DAMAGE. 
+ *
+ * CROSSBOW TECHNOLOGY AND ITS LICENSORS SPECIFICALLY DISCLAIM ALL 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 NEITHER CROSSBOW NOR ANY LICENSOR HAS ANY 
+ * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR 
+ * MODIFICATIONS.
+ */
+
+#include "Atm128Adc.h"
+
+/**
+ * HPL for the Atmega128 A/D conversion susbsystem.
+ *
+ * @author Martin Turon <mturon@xbow.com>
+ * @author Hu Siquan <husq@xbow.com>
+ * @author David Gay
+ */
+
+module HplAtm128AdcP {
+  provides interface HplAtm128Adc;
+  uses interface McuPowerState;
+}
+implementation {
+  //=== Direct read of HW registers. =================================
+  async command Atm128Admux_t HplAtm128Adc.getAdmux() { 
+    return *(Atm128Admux_t*)&ADMUX; 
+  }
+  async command Atm128Adcsra_t HplAtm128Adc.getAdcsra() { 
+    return *(Atm128Adcsra_t*)&ADCSRA; 
+  }
+  async command uint16_t HplAtm128Adc.getValue() { 
+    return ADC; 
+  }
+
+  DEFINE_UNION_CAST(Admux2int, Atm128Admux_t, uint8_t);
+  DEFINE_UNION_CAST(Adcsra2int, Atm128Adcsra_t, uint8_t);
+
+  //=== Direct write of HW registers. ================================
+  async command void HplAtm128Adc.setAdmux( Atm128Admux_t x ) { 
+    ADMUX = Admux2int(x); 
+  }
+  async command void HplAtm128Adc.setAdcsra( Atm128Adcsra_t x ) { 
+    ADCSRA = Adcsra2int(x); 
+  }
+
+  async command void HplAtm128Adc.setPrescaler(uint8_t scale){
+    Atm128Adcsra_t  current_val = call HplAtm128Adc.getAdcsra(); 
+    current_val.adif = FALSE;
+    current_val.adps = scale;
+    call HplAtm128Adc.setAdcsra(current_val);
+  }
+
+  // Individual bit manipulation. These all clear any pending A/D interrupt.
+  // It's not clear these are that useful...
+  async command void HplAtm128Adc.enableAdc() {
+    SET_BIT(ADCSRA, ADEN); 
+    call McuPowerState.update();
+  }
+  async command void HplAtm128Adc.disableAdc() {
+    CLR_BIT(ADCSRA, ADEN); 
+    call McuPowerState.update();
+  }
+  async command void HplAtm128Adc.enableInterruption() { SET_BIT(ADCSRA, ADIE); }
+  async command void HplAtm128Adc.disableInterruption() { CLR_BIT(ADCSRA, ADIE); }
+  async command void HplAtm128Adc.setContinuous() { SET_BIT(ADCSRA, ADFR); }
+  async command void HplAtm128Adc.setSingle() { CLR_BIT(ADCSRA, ADFR); }
+  async command void HplAtm128Adc.resetInterrupt() { SET_BIT(ADCSRA, ADIF); }
+  async command void HplAtm128Adc.startConversion() { SET_BIT(ADCSRA, ADSC); }
+
+
+  /* A/D status checks */
+  async command bool HplAtm128Adc.isEnabled()     {       
+    return (call HplAtm128Adc.getAdcsra()).aden; 
+  }
+
+  async command bool HplAtm128Adc.isStarted()     {
+    return (call HplAtm128Adc.getAdcsra()).adsc; 
+  }
+  
+  async command bool HplAtm128Adc.isComplete()    {
+    return (call HplAtm128Adc.getAdcsra()).adif; 
+  }
+
+  /* A/D interrupt handlers. Signals dataReady event with interrupts enabled */
+  AVR_ATOMIC_HANDLER(SIG_ADC) {
+    uint16_t data = call HplAtm128Adc.getValue();
+    
+    __nesc_enable_interrupt();
+    signal HplAtm128Adc.dataReady(data);
+  }
+
+  default async event void HplAtm128Adc.dataReady(uint16_t done) { }
+
+  async command bool HplAtm128Adc.cancel() { 
+    /* This is tricky */
+    atomic
+      {
+       Atm128Adcsra_t oldSr = call HplAtm128Adc.getAdcsra(), newSr;
+
+       /* To cancel a conversion, first turn off ADEN, then turn off
+          ADSC. We also cancel any pending interrupt.
+          Finally we reenable the ADC.
+       */
+       newSr = oldSr;
+       newSr.aden = FALSE;
+       newSr.adif = TRUE; /* This clears a pending interrupt... */
+       newSr.adie = FALSE; /* We don't want to start sampling again at the
+                              next sleep */
+       call HplAtm128Adc.setAdcsra(newSr);
+       newSr.adsc = FALSE;
+       call HplAtm128Adc.setAdcsra(newSr);
+       newSr.aden = TRUE;
+       call HplAtm128Adc.setAdcsra(newSr);
+
+       return oldSr.adif || oldSr.adsc;
+      }
+  }
+}