📄 hplp30p.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 + -