netprogm.nc

来自「tinyos最新版」· NC 代码 · 共 176 行

NC
176
字号
// $Id: NetProgM.nc,v 1.29 2004/08/18 18:53:17 jwhui Exp $/*									tab:4 * * * "Copyright (c) 2000-2004 The Regents of the University  of California.   * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. *  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * *//** * Simple component to reboot into a specified image. * * @author Jonathan Hui <jwhui@cs.berkeley.edu> */module NetProgM {  provides {    interface NetProg;    interface StdControl;  }  uses {    interface InternalFlash as IFlash;    interface DelugeMetadata as Metadata;    interface DelugeImgStableStore as StableStore;  }}implementation {  uint8_t imgNum;  uint8_t checkSum(uint16_t _addr, uint8_t _group) {    return ~(_addr + _group);  }  void writeTOSinfo() {#ifndef PLATFORM_PC    uint8_t checksum = checkSum(TOS_LOCAL_ADDRESS, TOS_AM_GROUP);    call IFlash.write((uint8_t*)IFLASH_GROUPID_ADDR, &TOS_AM_GROUP, sizeof(TOS_AM_GROUP));    call IFlash.write((uint16_t*)IFLASH_LOCALID_ADDR, &TOS_LOCAL_ADDRESS, sizeof(TOS_LOCAL_ADDRESS));    call IFlash.write((uint8_t*)IFLASH_CHECKSUM_ADDR, &checksum, sizeof(checkSum));#endif  }  command result_t StdControl.init() {#ifndef PLATFORM_PC    // grab addr, pid, and gid from internal flash    uint16_t addr, startPage;    uint8_t group, sum;    call IFlash.read((uint16_t*)BL_CUR_IMG_START_PAGE_ADDR, &startPage, sizeof(startPage));    call IFlash.read((uint16_t*)IFLASH_LOCALID_ADDR, &addr, sizeof(addr));    call IFlash.read((uint8_t*)IFLASH_GROUPID_ADDR, &group, sizeof(group));    call IFlash.read((uint8_t*)IFLASH_CHECKSUM_ADDR, &sum, sizeof(sum));    if (sum == checkSum(addr, group)) {      TOS_AM_GROUP = group;      atomic TOS_LOCAL_ADDRESS = addr;    }    else {      writeTOSinfo();    }    if (startPage == 0xffff) {      imgNum = DELUGE_INVALID_IMGNUM;    }    else {      imgNum = call StableStore.flashPage2ImgNum(startPage);    }#else    imgNum = DELUGE_INVALID_IMGNUM;#endif    return SUCCESS;  }    command result_t StdControl.start() { return SUCCESS; }  command result_t StdControl.stop() { return SUCCESS; }    void markExplicitRebootFlag() {#ifndef PLATFORM_PC    uint8_t tmp;    call IFlash.read((uint8_t*)BL_FLAGS_ADDR, &tmp, sizeof(tmp));    tmp |= BL_EXPLICIT_REBOOT;    call IFlash.write((uint8_t*)BL_FLAGS_ADDR, &tmp, sizeof(tmp));#endif  }    command result_t NetProg.reboot() {#ifndef PLATFORM_PC    atomic {      NETPROG_DISABLE_WDT();      writeTOSinfo();      markExplicitRebootFlag();      NETPROG_ACTUAL_REBOOT();    }#endif    return FAIL;  }  command result_t NetProg.programImgAndReboot(uint8_t newImgNum) {    if (call Metadata.isValidTOSApp(newImgNum)) {#ifndef PLATFORM_PC      uint16_t startPage;      uint8_t  tmp = 0;            atomic {	NETPROG_DISABLE_WDT();	writeTOSinfo();	markExplicitRebootFlag();		startPage = call StableStore.imgNum2FlashPage(newImgNum);	call IFlash.write((uint16_t*)BL_NEW_IMG_START_PAGE_ADDR, &startPage, sizeof(startPage));	call IFlash.write((uint8_t*)BL_LOAD_IMG_ADDR, &tmp, sizeof(tmp));		// reboot	NETPROG_ACTUAL_REBOOT();      }#endif    }    // image is not complete or invalid, or metadata is not ready    return FAIL;  }  command result_t NetProg.programBuf(void* buf, uint32_t addr, uint32_t len) {#ifndef PLATFORM_PC    uint16_t programBufPtr = 0;    result_t result = SUCCESS;        call IFlash.read((uint8_t*)BL_PROGRAM_BUF_ADDR, &programBufPtr, sizeof(programBufPtr));    atomic {      while (len > 0) {	uint16_t bytesToWrite = (len > BL_INTERNAL_PAGE_SIZE) ? BL_INTERNAL_PAGE_SIZE : len;	result = rcombine(result, ((programBufPtr_t)programBufPtr)(buf, addr, len));	addr += bytesToWrite;	len -= bytesToWrite;      }    }    return result;#else    return FAIL;#endif  }  command uint8_t NetProg.getExecutingImgNum() { return imgNum; }  event result_t Metadata.ready(result_t result) { return SUCCESS; }    event result_t Metadata.applyPageDiffDone(result_t result) { return SUCCESS; }  event result_t StableStore.getImgDataDone(result_t result) { return SUCCESS; }  event result_t StableStore.writeImgDataDone(result_t result) { return SUCCESS; }  event result_t StableStore.checkCrcDone(result_t result) { return SUCCESS; }  event result_t StableStore.syncImgDataDone(result_t result) { return SUCCESS; }}

⌨️ 快捷键说明

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