⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hplp30p.nc

📁 tinyos-2.x.rar
💻 NC
字号:
/* $Id: HplP30P.nc,v 1.4 2006/12/12 18:23:12 vlahan Exp $ */
/*
 * Copyright (c) 2005 Arch Rock Corporation 
 * All rights reserved. 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *	Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *	Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 *  
 *   Neither the name of the Arch Rock Corporation nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE ARCHED
 * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */
/**
 * @author Phil Buonadonna
 *
 */
#include <P30.h>
module HplP30P {
  provides interface HplP30;
}

implementation {

  volatile uint16_t * devBaseAddress = (uint16_t *)(0x0);

  async command error_t HplP30.progWord(uint32_t addr, uint16_t word) {
    volatile uint16_t *blkAddress = (uint16_t *)addr;
    uint32_t result;

    *devBaseAddress = P30_READ_CLRSTATUS;
    *blkAddress = P30_WRITE_WORDPRGSETUP;
    *blkAddress = word;

    do {
      result = *blkAddress;
    } while ((result & P30_SR_DWS) == 0);

    *blkAddress = P30_READ_READARRAY;

    if (result & (P30_SR_PS | P30_SR_VPPS | P30_SR_BLS)) {
      return FAIL;
    }

    return SUCCESS;

  }

  async command error_t HplP30.progBuffer(uint32_t addr, uint16_t *data, uint8_t len) {
    volatile uint16_t *blkAddress = (uint16_t *)addr;
    uint32_t i,result;
    error_t error = SUCCESS;

    if (len <= 0) {
      error = EINVAL;
      goto done;
    }

    *devBaseAddress = P30_READ_CLRSTATUS;
    *blkAddress = P30_WRITE_BUFPRG;

    result = *blkAddress;
    if ((result & P30_SR_DWS) == 0) {
      error = FAIL;
      goto cleanup;
    }

    *blkAddress = len-1;
    
    for (i=0;i<len;i++) {
      blkAddress[i] = data[i];
    }
    
    *blkAddress = P30_WRITE_BUFPRGCONFIRM;

    do {
      result = *blkAddress;
    } while ((result & P30_SR_DWS) == 0);

    if (result & (P30_SR_PS | P30_SR_VPPS)) {
      error = FAIL;
      goto done;
    }
  cleanup:
    *blkAddress = P30_READ_READARRAY;
  done:
    return error;

  }

  async command error_t HplP30.blkErase(uint32_t blkaddr) {
    volatile uint16_t *blkAddress = (uint16_t *)blkaddr;
    uint32_t result;

    *devBaseAddress = P30_READ_CLRSTATUS;
    *blkAddress = P30_ERASE_BLKSETUP;
    *blkAddress = P30_ERASE_BLKCONFIRM;

    do {
      result = *blkAddress;
    } while ((result & P30_SR_DWS) == 0);

    *blkAddress = P30_READ_READARRAY;

    if (result & (P30_SR_ES | P30_SR_VPPS | P30_SR_BLS)) {
      return FAIL;
    }

    return SUCCESS;

  }

  async command error_t HplP30.blkLock(uint32_t blkaddr) {
    volatile uint16_t *blkAddress = (uint16_t*) blkaddr;

    asm volatile (
		  ".align 5\n\t"
		  "strh %0,[%3]\n\t"
		  "strh %1,[%3]\n\t"
		  "strh %2,[%3]\n\t"
		  : 
		  :"r" (P30_LOCK_SETUP), 
		  "r" (P30_LOCK_LOCK), 
		  "r" (P30_READ_READARRAY),
		  "r" (blkaddr)
		  );

    return SUCCESS;
  }

  async command error_t HplP30.blkUnlock(uint32_t blkaddr) {

    asm volatile (
		  ".align 5\n\t"
		  "strh %0,[%3]\n\t"
		  "strh %1,[%3]\n\t"
		  "strh %2,[%3]\n\t"
		  : 
		  : "r" (P30_LOCK_SETUP), 
		  "r" (P30_LOCK_UNLOCK), 
		  "r" (P30_READ_READARRAY),
		  "r" (blkaddr)
		  );

    return SUCCESS;

  }

  /* THIS FUNCTION IS UNTESTED, USE READBYTEBURST FOR NOW */
  async command error_t HplP30.readWordBurst(uint32_t addr, uint16_t* word) {
    volatile uint16_t *blkAddress = (uint16_t *)addr;
    *word = *blkAddress;
    return SUCCESS;
  }

  async command error_t HplP30.readByteBurst(uint32_t addr, uint8_t* bytex) {
    volatile uint8_t *blkAddress = (uint8_t *)addr;
    *bytex = *blkAddress;
    return SUCCESS;
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -