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

网络

开发平台:

Others

  1. /* tab:4
  2.  * "Copyright (c) 2000-2003 The Regents of the University  of California.  
  3.  * All rights reserved.
  4.  *
  5.  * Permission to use, copy, modify, and distribute this software and its
  6.  * documentation for any purpose, without fee, and without written agreement is
  7.  * hereby granted, provided that the above copyright notice, the following
  8.  * two paragraphs and the author appear in all copies of this software.
  9.  * 
  10.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  11.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  12.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  13.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14.  * 
  15.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  16.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  17.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  18.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  19.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
  20.  *
  21.  * Copyright (c) 2002-2003 Intel Corporation
  22.  * All rights reserved.
  23.  *
  24.  * This file is distributed under the terms in the attached INTEL-LICENSE     
  25.  * file. If you do not find these files, copies can be found by writing to
  26.  * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, 
  27.  * 94704.  Attention:  Intel License Inquiry.
  28.  */
  29. /**
  30.  *
  31.  * Revision: $Id: SerialId.nc,v 1.1.1.1 2005/04/22 04:26:45 acwarrie Exp $
  32.  *
  33.  * Read the micas's hardware id from the DS2401.
  34.  */
  35. module SerialId {
  36.   provides interface StdControl;
  37.   provides interface HardwareId;
  38. }
  39. implementation {
  40.   bool gfReadBusy;
  41.   uint8_t *serialId;
  42.   command result_t StdControl.init() {
  43.     gfReadBusy = FALSE;
  44.     TOSH_MAKE_SERIAL_ID_INPUT();
  45.     return SUCCESS;
  46.   }
  47.   command result_t StdControl.start() {
  48.     TOSH_SET_SERIAL_ID_PIN();  // Enable pullup resistor to source current
  49.     return SUCCESS;
  50.   }
  51.   command result_t StdControl.stop() {
  52.     TOSH_CLR_SERIAL_ID_PIN();  // Tri-state pin
  53.     return SUCCESS;
  54.   }
  55. #define SERIAL_ID_LOW() 
  56. TOSH_MAKE_SERIAL_ID_OUTPUT(); 
  57. TOSH_CLR_SERIAL_ID_PIN(); 
  58. #define SERIAL_ID_OPEN() 
  59. TOSH_SET_SERIAL_ID_PIN();
  60. TOSH_MAKE_SERIAL_ID_INPUT();
  61. #define SERIAL_ID_READ TOSH_READ_SERIAL_ID_PIN
  62.   uint8_t serialIdByteRead() {
  63.     uint8_t i, data = 0;
  64.     for(i = 0; i < 8; i ++)  {
  65.       data >>= 1;
  66.       SERIAL_ID_LOW();
  67.       TOSH_uwait(1);
  68.       SERIAL_ID_OPEN();
  69.       TOSH_uwait(10);
  70.       if (SERIAL_ID_READ()) {
  71. data |= 0x80;
  72.       }
  73.       TOSH_uwait(50);
  74.     }
  75.     return data;
  76.   }
  77.   void serialIdByteWrite(uint8_t data) {
  78.     uint8_t i;
  79.     for(i = 0; i < 8; i ++){
  80.       SERIAL_ID_LOW();
  81.       TOSH_uwait(1);
  82.       if (data & 0x1) {
  83. SERIAL_ID_OPEN();
  84.       }
  85.       TOSH_uwait(70);
  86.       SERIAL_ID_OPEN();
  87.       TOSH_uwait(2);
  88.       data >>= 1;
  89.     }
  90.   }
  91.   task void serialIdRead() {
  92.     uint8_t cnt = 0;
  93.     result_t success = FAIL;
  94.     atomic {
  95.       /* We're doing pull-lows only */
  96.       TOSH_CLR_SERIAL_ID_PIN();
  97.       SERIAL_ID_LOW();
  98.       TOSH_uwait(500);
  99.       cnt = 0;
  100.       SERIAL_ID_OPEN();
  101.       /* Wait for presence pulse */
  102.       while (SERIAL_ID_READ() && cnt < 30) {
  103. cnt++;
  104. TOSH_uwait(30);
  105.       }
  106.       /* Wait for end of presence pulse */
  107.       while (0 == SERIAL_ID_READ() && cnt < 30) {
  108. cnt++;
  109. TOSH_uwait(30);
  110.       }
  111.       if (cnt < 30) {
  112. TOSH_uwait(500);
  113. serialIdByteWrite(0x33);
  114. for(cnt = 0; cnt < HARDWARE_ID_LEN; cnt ++)
  115.   serialId[cnt] = serialIdByteRead();
  116. success = SUCCESS;
  117.       }
  118.     }
  119.     gfReadBusy = FALSE;
  120.     signal HardwareId.readDone(serialId, success);
  121.   }
  122.   command result_t HardwareId.read(uint8_t *id) {
  123.     if (!gfReadBusy) {
  124.       gfReadBusy = TRUE;
  125.       serialId = id;
  126.       post serialIdRead();
  127.       return SUCCESS;
  128.     }
  129.     return FAIL;
  130.   }
  131.   
  132. }