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 + -
显示快捷键?