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

网络

开发平台:

Others

  1. // $Id: HPLFlash.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.  * Date last modified:  6/25/02
  34.  *
  35.  */
  36. /**
  37.  * Low level hardware access to the onboard EEPROM (well, Flash actually)
  38.  * @author Jason Hill
  39.  * @author David Gay
  40.  * @author Philip Levis
  41.  */
  42. module HPLFlash {
  43.   provides {
  44.     interface StdControl as FlashControl;
  45.     interface FastSPI as FlashSPI;
  46.     interface SlavePin as FlashSelect;
  47.     interface Resource as FlashIdle;
  48.     command bool getCompareStatus();
  49.   }
  50. }
  51. implementation
  52. {
  53.   // We use SPI mode 0 (clock low at select time)
  54.   command result_t FlashControl.init() {
  55.     TOSH_MAKE_FLASH_SELECT_OUTPUT();
  56.     TOSH_SET_FLASH_SELECT_PIN();
  57.     TOSH_CLR_FLASH_CLK_PIN();
  58.     TOSH_MAKE_FLASH_CLK_OUTPUT();
  59.     TOSH_SET_FLASH_OUT_PIN();
  60.     TOSH_MAKE_FLASH_OUT_OUTPUT();
  61.     TOSH_CLR_FLASH_IN_PIN();
  62.     TOSH_MAKE_FLASH_IN_INPUT();
  63.     cbi(EIMSK, 2); // disable flash in interrupt
  64.     EICRA |= 0x30; // make flash in a rising-edge interrupt
  65.     return SUCCESS;
  66.   }
  67.   command result_t FlashControl.start() {
  68.     return SUCCESS;
  69.   }
  70.   command result_t FlashControl.stop() {
  71.     return SUCCESS;
  72.   }
  73.   // The flash select is not shared on mica2, mica2dot
  74.   async command result_t FlashSelect.low() {
  75.     TOSH_CLR_FLASH_CLK_PIN(); // ensure SPI mode 0
  76.     TOSH_CLR_FLASH_SELECT_PIN();
  77.     return SUCCESS;
  78.   }
  79.   task void sigHigh() {
  80.     signal FlashSelect.notifyHigh();
  81.   }
  82.   async command result_t FlashSelect.high(bool needEvent) {
  83.     TOSH_SET_FLASH_SELECT_PIN();
  84.     if (needEvent)
  85.       post sigHigh();
  86.     return SUCCESS;
  87.   }
  88.   
  89. #define BITINIT 
  90.   uint8_t clrClkAndData = inp(PORTD) & ~0x28
  91. #define BIT(n) 
  92. outp(clrClkAndData, PORTD); 
  93. asm __volatile__ 
  94.         (  "sbrc %2," #n "n" 
  95.  "tsbi 18,3n" 
  96.  "tsbi 18,5n" 
  97.  "tsbic 16,2n" 
  98.  "tori %0,1<<" #n "n" 
  99.  : "=d" (spiIn) : "0" (spiIn), "r" (spiOut))
  100.   async command uint8_t FlashSPI.txByte(uint8_t spiOut) {
  101.     uint8_t spiIn = 0;
  102.     // This atomic ensures integrity at the hardware level...
  103.     atomic
  104.       {
  105. BITINIT;
  106. BIT(7);
  107. BIT(6);
  108. BIT(5);
  109. BIT(4);
  110. BIT(3);
  111. BIT(2);
  112. BIT(1);
  113. BIT(0);
  114.       }
  115.     return spiIn;
  116.   }
  117.   /**
  118.    * Check FLASH status byte.
  119.    * @return TRUE if the flash is ready, FALSE if not.
  120.    *   In the TRUE case, the full status byte may not have been
  121.    *   read out of the flash, in the FALSE case it is fully read out.
  122.    */
  123.   task void avail() {
  124.     signal FlashIdle.available();
  125.   }
  126.   command result_t FlashIdle.wait() {
  127.     result_t waits;
  128.     // Setup interrupt on rising edge of flash in
  129.     atomic
  130.       {
  131. EIFR = 1 << 2; // clear any pending interrupt
  132. sbi(EIMSK, 2); // enable interrupt
  133. TOSH_CLR_FLASH_CLK_PIN();
  134. // We need to wait at least 2 cycles here (because of the signal
  135. // acquisition delay). It's also good to wait a few microseconds
  136. // to get the fast ("FAIL") exit from wait (reads are twice as fast
  137. // with a 2us delay...)
  138. TOSH_uwait(2);
  139. if (TOSH_READ_FLASH_IN_PIN())
  140.   {
  141.     // already high
  142.     cbi(EIMSK, 2);
  143.     waits = FAIL;
  144.   }
  145. else
  146.   waits = SUCCESS;
  147.       }
  148.     return waits;
  149.   }
  150.   TOSH_SIGNAL(SIG_INTERRUPT2) {
  151.     cbi(EIMSK, 2); // disable interrupt
  152.     post avail();
  153.   }
  154.   command bool getCompareStatus() {
  155.     TOSH_SET_FLASH_CLK_PIN();
  156.     TOSH_CLR_FLASH_CLK_PIN();
  157.     // Wait for compare value to propagate
  158.     asm volatile("nop");
  159.     asm volatile("nop");
  160.     return !TOSH_READ_FLASH_IN_PIN();
  161.   }
  162.   default event result_t FlashIdle.available() {
  163.     return SUCCESS;
  164.   }
  165. }