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

网络

开发平台:

Others

  1. // $Id: HPLADCM.nc,v 1.1.1.1 2005/04/22 04:26:45 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. /*
  31.  *
  32.  * Authors: Jason Hill, David Gay, Philip Levis
  33.  * Version: $Id: HPLADCM.nc,v 1.1.1.1 2005/04/22 04:26:45 acwarrie Exp $
  34.  *
  35.  */
  36. // The hardware presentation layer. See hpl.h for the C side.
  37. // Note: there's a separate C side (hpl.h) to get access to the avr macros
  38. // The model is that HPL is stateless. If the desired interface is as stateless
  39. // it can be implemented here (Clock, FlashBitSPI). Otherwise you should
  40. // create a separate component
  41. /**
  42.  * @author Jason Hill
  43.  * @author David Gay
  44.  * @author Philip Levis
  45.  */
  46. module HPLADCM {
  47.   provides {
  48.     interface StdControl;
  49.     interface HPLADC as ADC;
  50.   }
  51. }
  52. implementation
  53. {
  54.   /* The port mapping table */
  55.   bool init_portmap_done;
  56.   uint8_t TOSH_adc_portmap[TOSH_ADC_PORTMAPSIZE];
  57.   
  58.   void init_portmap() {
  59.     /* The default ADC port mapping */
  60.     atomic {
  61.       if( init_portmap_done == FALSE ) {
  62. int i;
  63. for (i = 0; i < TOSH_ADC_PORTMAPSIZE; i++)
  64.   TOSH_adc_portmap[i] = i;
  65. // Setup fixed bindings associated with ATmega128 ADC 
  66. TOSH_adc_portmap[TOS_ADC_BANDGAP_PORT] = TOSH_ACTUAL_BANDGAP_PORT;
  67. TOSH_adc_portmap[TOS_ADC_GND_PORT] = TOSH_ACTUAL_GND_PORT;
  68. init_portmap_done = TRUE;
  69.       }
  70.     }
  71.   }
  72.   command result_t StdControl.init() {
  73.     call ADC.init();
  74.   }
  75.   command result_t StdControl.start() {
  76.   }
  77.   command result_t StdControl.stop() {
  78.     cbi(ADCSR,ADEN);
  79.   }
  80.   async command result_t ADC.init() {
  81.     init_portmap();
  82.     // Enable ADC Interupts, 
  83.     // Set Prescaler division factor to 64 
  84.     atomic {
  85.       outp(((1 << ADIE) | (6 << ADPS0)),ADCSR); 
  86.       
  87.       outp(0,ADMUX);
  88.     }
  89.     return SUCCESS;
  90.   }
  91.   async command result_t ADC.setSamplingRate(uint8_t rate) {
  92.     uint8_t current_val = inp(ADCSR);
  93.     current_val = (current_val & 0xF8) | (rate & 0x07);
  94.     outp(current_val, ADCSR);
  95.     return SUCCESS;
  96.   }
  97.   async command result_t ADC.bindPort(uint8_t port, uint8_t adcPort) {
  98.     if (port < TOSH_ADC_PORTMAPSIZE &&
  99. port != TOS_ADC_BANDGAP_PORT &&
  100. port != TOS_ADC_GND_PORT) {
  101.       init_portmap();
  102.       atomic TOSH_adc_portmap[port] = adcPort;
  103.       return SUCCESS;
  104.     }
  105.     else
  106.       return FAIL;
  107.   }
  108.   async command result_t ADC.samplePort(uint8_t port) {
  109.     atomic {
  110.       outp((TOSH_adc_portmap[port] & 0x1F), ADMUX);
  111.     }
  112.     sbi(ADCSR, ADEN);
  113.     sbi(ADCSR, ADSC);
  114.     
  115.     return SUCCESS;
  116.   }
  117.   async command result_t ADC.sampleAgain() {
  118.     sbi(ADCSR, ADSC);
  119.     return SUCCESS;
  120.   }
  121.   async command result_t ADC.sampleStop() {
  122.     // SIG_ADC does the stop
  123.     return SUCCESS;
  124.   }
  125.   default async event result_t ADC.dataReady(uint16_t done) { return SUCCESS; }
  126.   TOSH_SIGNAL(SIG_ADC) {
  127.     uint16_t data = inw(ADCL);
  128.     data &= 0x3ff;
  129.     sbi(ADCSR, ADIF);
  130.     cbi(ADCSR, ADEN);
  131.     __nesc_enable_interrupt();
  132.     signal ADC.dataReady(data);
  133.   }
  134. }