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

📄 hplp30p.nc

📁 tinyos2.0版本驱动
💻 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 + -