HPLPowerManagementM.nc
上传用户:joranyuan
上传日期:2022-06-23
资源大小:3306k
文件大小:4k
源码类别:

网络

开发平台:

Others

  1. // $Id: HPLPowerManagementM.nc,v 1.2 2005/05/31 21:44:28 acwarrie Exp $
  2. /* tab:4
  3.  * "Copyright (c) 2000-2003 The Regents of the University  of California.  
  4.  * All rights reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software and its
  7.  * documentation for any purpose, without fee, and without written agreement is
  8.  * hereby granted, provided that the above copyright notice, the following
  9.  * two paragraphs and the author appear in all copies of this software.
  10.  * 
  11.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  12.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  13.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  14.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  15.  * 
  16.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  17.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  18.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  19.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  20.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
  21.  *
  22.  * Copyright (c) 2002-2003 Intel Corporation
  23.  * All rights reserved.
  24.  *
  25.  * This file is distributed under the terms in the attached INTEL-LICENSE     
  26.  * file. If you do not find these files, copies can be found by writing to
  27.  * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, 
  28.  * 94704.  Attention:  Intel License Inquiry.
  29.  */
  30. /* Author:  Robert Szewczyk
  31.  *
  32.  * $Id: HPLPowerManagementM.nc,v 1.2 2005/05/31 21:44:28 acwarrie Exp $
  33.  */
  34. /**
  35.  * @author Robert Szewczyk
  36.  */
  37. module HPLPowerManagementM {
  38.     provides {
  39.       interface PowerManagement;
  40.       command result_t Enable();
  41.       command result_t Disable();
  42.     }
  43. }
  44. implementation{  
  45.   norace int8_t disableCount = 1;
  46.   uint8_t powerLevel;
  47.     enum {
  48. IDLE = 0,
  49. ADC_NR = (1 << SM0),
  50. POWER_DOWN = (1 << SM1),
  51. POWER_SAVE = (1 << SM0) + (1 << SM1),
  52. STANDBY = (1 << SM2) + (1 << SM1),
  53. EXT_STANDBY =  (1 << SM0) + (1 << SM1) + (1 << SM2)
  54.     };
  55.     uint8_t getPowerLevel() {
  56. uint8_t diff;
  57. if (inp(TIMSK) & (~((1<<OCIE0) | (1<<TOIE0)))) { // Are external timers
  58.        // running?  
  59.     return IDLE;
  60. } else if (bit_is_set(SPCR, SPIE)) { // SPI (Radio stack on mica)
  61.     return IDLE;
  62.     // } else if (bit_is_set(ACSR, ACIE)) { //Analog comparator
  63.     //     return IDLE;
  64. } else if (bit_is_set(ADCSR, ADEN)) { // ADC is enabled
  65.   return ADC_NR;
  66. } else if (inp(TIMSK) & ((1<<OCIE0) | (1<<TOIE0))) {
  67.     diff = inp(OCR0) - inp(TCNT0);
  68.     if (diff < 16) 
  69. return EXT_STANDBY;
  70.     return POWER_SAVE;
  71. } else {
  72.   return POWER_DOWN;
  73. }
  74.     }
  75.     
  76.     task void doAdjustment() {
  77. uint8_t foo, mcu;
  78. powerLevel = foo = getPowerLevel();
  79. mcu = inp(MCUCR);
  80. mcu &= 0xe3;
  81. if ((foo == EXT_STANDBY) || (foo == POWER_SAVE)) {
  82.     mcu |= IDLE;
  83.     while ((inp(ASSR) & 0x7) != 0) {
  84. asm volatile("nop");
  85.     }
  86.     mcu &= 0xe3;
  87. }
  88. mcu |= foo;
  89. outp(mcu, MCUCR);
  90. sbi(MCUCR, SE);
  91.     }    
  92.     async command uint8_t PowerManagement.adjustPower() {
  93.         uint8_t mcu;
  94.         if (disableCount <= 0)
  95.           post doAdjustment();
  96.         else {
  97.   mcu = inp(MCUCR);
  98.   mcu &= 0xe3;
  99.   mcu |= IDLE;
  100.   outp(mcu, MCUCR);
  101.       sbi(MCUCR, SE);
  102.         }
  103. return 0;
  104.     }
  105.     async command result_t PowerManagement.enable() {
  106.       atomic disableCount--;
  107.       return SUCCESS;
  108.     }
  109.     async command result_t PowerManagement.disable() {
  110.       atomic disableCount++;
  111.       return SUCCESS;
  112.     }
  113.     command result_t Enable() {
  114.       return call PowerManagement.enable();
  115.     }
  116.     command result_t Disable() {
  117.       return call PowerManagement.disable();
  118.     }
  119. }