X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Flib%2Fnet%2FDeluge%2Fextra%2FNetProgM.nc;h=fc054cff8fc0f13e00d657a1ca6da95241129eff;hb=e9bfab607e051bae6afb47b44892ce37541d1b44;hp=413abc00b9e24801ac6e87350d54825ca3806691;hpb=2d422c11d7a829ca46b5440a7ba123ae2a5b94d9;p=tinyos-2.x.git diff --git a/tos/lib/net/Deluge/extra/NetProgM.nc b/tos/lib/net/Deluge/extra/NetProgM.nc index 413abc00..fc054cff 100644 --- a/tos/lib/net/Deluge/extra/NetProgM.nc +++ b/tos/lib/net/Deluge/extra/NetProgM.nc @@ -25,8 +25,8 @@ /** * @author Jonathan Hui - * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. + * @author Chieh-Jan Mike Liang */ #include "AM.h" @@ -37,104 +37,86 @@ module NetProgM { interface Init; } uses { - interface DelugeStorage[uint8_t img_num]; interface InternalFlash as IFlash; interface Crc; - interface DelugeMetadata; interface Leds; +#if !defined(PLATFORM_TINYNODE) interface CC2420Config; +#endif async command void setAmAddress(am_addr_t a); + interface ReprogramGuard; } } implementation { - uint16_t computeTosInfoCrc(NetProg_TOSInfo* tosInfo) - { - return call Crc.crc16(tosInfo, sizeof(NetProg_TOSInfo)-2); - } - - void writeTOSinfo() - { - NetProg_TOSInfo tosInfo; - uint16_t crc; - call IFlash.read((uint8_t*)IFLASH_TOS_INFO_ADDR, &tosInfo, sizeof(tosInfo)); - tosInfo.addr = TOS_NODE_ID; - tosInfo.groupId = TOS_AM_GROUP; - crc = computeTosInfoCrc(&tosInfo); - // don't write if data is already correct - if (tosInfo.crc == crc) - return; - tosInfo.crc = crc; - call IFlash.write((uint8_t*)IFLASH_TOS_INFO_ADDR, &tosInfo, sizeof(tosInfo)); - } + uint32_t reprogramImgAddr; command error_t Init.init() { + BootArgs bootArgs; + call IFlash.read(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs)); - NetProg_TOSInfo tosInfo; - - call IFlash.read((uint8_t*)IFLASH_TOS_INFO_ADDR, &tosInfo, sizeof(tosInfo)); - - if (tosInfo.crc == computeTosInfoCrc(&tosInfo)) { - // TOS_AM_GROUP is not a variable in T2 - // TOS_AM_GROUP = tosInfo.groupId; - - // Updates local node ID - atomic { - TOS_NODE_ID = tosInfo.addr; - call setAmAddress(tosInfo.addr); - } - call CC2420Config.setShortAddr(tosInfo.addr); - call CC2420Config.sync(); + // Update the local node ID + if (bootArgs.address != 0xFFFF) { + TOS_NODE_ID = bootArgs.address; + call setAmAddress(bootArgs.address); } - else { - writeTOSinfo(); - } - +#if !defined(PLATFORM_TINYNODE) + call CC2420Config.setShortAddr(bootArgs.address); + call CC2420Config.sync(); +#endif return SUCCESS; } command error_t NetProg.reboot() { + BootArgs bootArgs; + atomic { - writeTOSinfo(); + call IFlash.read(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs)); + + if (bootArgs.address != TOS_NODE_ID) { + bootArgs.address = TOS_NODE_ID; + call IFlash.write(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs)); + } netprog_reboot(); } + return FAIL; } - command error_t NetProg.programImgAndReboot(uint8_t img_num) + command error_t NetProg.programImageAndReboot(uint32_t imgAddr) + { + reprogramImgAddr = imgAddr; + return call ReprogramGuard.okToProgram(); + } + + event void ReprogramGuard.okToProgramDone(bool ok) { - tosboot_args_t args; - DelugeNodeDesc nodeDesc; - DelugeImgDesc *imgDesc; - + BootArgs bootArgs; + + if (!ok) { + // The voltage is too low. Nothing to do. + return; + } + atomic { - writeTOSinfo(); - - args.imageAddr = call DelugeStorage.getPhysicalAddress[img_num](0); - args.gestureCount = 0xff; - args.noReprogram = FALSE; - call IFlash.write((uint8_t*)TOSBOOT_ARGS_ADDR, &args, sizeof(args)); - - // Write info about what img to disseminate after reboot - imgDesc = call DelugeMetadata.getImgDesc(img_num); - nodeDesc.uid = imgDesc->uid; - nodeDesc.imgNum = img_num; - nodeDesc.vNum = imgDesc->vNum; - call IFlash.write((uint8_t*)IFLASH_NODE_DESC_ADDR, &nodeDesc, sizeof(nodeDesc)); + call IFlash.read(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs)); + bootArgs.imageAddr = reprogramImgAddr; + bootArgs.gestureCount = 0xff; + bootArgs.noReprogram = FALSE; + bootArgs.address = TOS_NODE_ID; + + call IFlash.write(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs)); + // reboot netprog_reboot(); } - - // couldn't reboot - return FAIL; } +#if !defined(PLATFORM_TINYNODE) event void CC2420Config.syncDone(error_t error) {} - - default command storage_addr_t DelugeStorage.getPhysicalAddress[uint8_t img_num](storage_addr_t addr) { return 0xFFFFFFFF; } - +#endif }