X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Flib%2Ftosboot%2FTOSBootM.nc;h=fa1893c72c93f176fc4ee26fc672524e410d6871;hb=adf1de6c009d13b7b52e68535c63b28f59c97400;hp=8b4eba708f0080c0111486375f9f545e785e393c;hpb=ff6f444a38d8901cbf9fd5f844639f3a5c5be597;p=tinyos-2.x.git diff --git a/tos/lib/tosboot/TOSBootM.nc b/tos/lib/tosboot/TOSBootM.nc index 8b4eba70..fa1893c7 100644 --- a/tos/lib/tosboot/TOSBootM.nc +++ b/tos/lib/tosboot/TOSBootM.nc @@ -1,17 +1,17 @@ /* - * "Copyright (c) 2000-2005 The Regents of the University of California. + * "Copyright (c) 2000-2005 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 @@ -70,55 +70,66 @@ implementation { in_flash_addr_t extFlashReadAddr() { in_flash_addr_t result = 0; - uint8_t i; - for ( i = 0; i < 4; i++ ) - result |= ((in_flash_addr_t)call ExtFlash.readByte() & 0xff) << (i*8); + int8_t i; + for ( i = 3; i >= 0; i-- ) + result |= ((in_flash_addr_t)call ExtFlash.readByte() & 0xff) << (i*8); return result; } - bool verifyImage(ex_flash_addr_t startAddr) { + bool verifyBlock(ex_flash_addr_t crcAddr, ex_flash_addr_t startAddr, uint16_t len) + { + uint16_t crcTarget, crcTmp; + + // read crc + call ExtFlash.startRead(crcAddr); + crcTarget = (uint16_t)(call ExtFlash.readByte() & 0xff) << 8; + crcTarget |= (uint16_t)(call ExtFlash.readByte() & 0xff); + call ExtFlash.stopRead(); + + // compute crc + call ExtFlash.startRead(startAddr); + for ( crcTmp = 0; len; len-- ) + crcTmp = crcByte(crcTmp, call ExtFlash.readByte()); + call ExtFlash.stopRead(); - uint16_t crcTarget = 0, crcTmp = 0; - uint16_t addr, len; - pgnum_t numPgs; + return crcTarget == crcTmp; + } + + bool verifyImage(ex_flash_addr_t startAddr) { + uint16_t addr; + uint8_t numPgs; uint8_t i; + if (!verifyBlock(startAddr + offsetof(DelugeIdent,crc), + startAddr, offsetof(DelugeIdent,crc))) + return FALSE; + // read size of image - call ExtFlash.startRead(startAddr + offsetof(DelugeImgDesc,numPgs)); + call ExtFlash.startRead(startAddr + offsetof(DelugeIdent,numPgs)); numPgs = call ExtFlash.readByte(); call ExtFlash.stopRead(); if (numPgs == 0 || numPgs == 0xff) return FALSE; - startAddr += DELUGE_METADATA_SIZE; - + startAddr += DELUGE_IDENT_SIZE; addr = DELUGE_CRC_BLOCK_SIZE; - len = DELUGE_BYTES_PER_PAGE-DELUGE_CRC_BLOCK_SIZE; - - for ( i = 0; i < numPgs && crcTarget == crcTmp; i++ ) { - // read crc - call ExtFlash.startRead(startAddr + i*sizeof(uint16_t)); - crcTarget = (uint16_t)(call ExtFlash.readByte() & 0xff); - crcTarget |= (uint16_t)(call ExtFlash.readByte() & 0xff) << 8; - call ExtFlash.stopRead(); - - // compute crc - call ExtFlash.startRead(startAddr + addr); - for ( crcTmp = 0; len; len-- ) - crcTmp = crcByte(crcTmp, call ExtFlash.readByte()); - call ExtFlash.stopRead(); - - addr = (uint16_t)(i+1)*DELUGE_BYTES_PER_PAGE; - len = DELUGE_BYTES_PER_PAGE; + for ( i = 0; i < numPgs; i++ ) { + if (!verifyBlock(startAddr + i*sizeof(uint16_t), + startAddr + addr, DELUGE_BYTES_PER_PAGE)) { + if (i == 0) + while (1) + call Leds.flash(1); + return FALSE; + } + addr += DELUGE_BYTES_PER_PAGE; } - return (i == numPgs) && (crcTarget == crcTmp); + return TRUE; } error_t programImage(ex_flash_addr_t startAddr) { - uint8_t buf[TOSBOOT_INT_PAGE_SIZE]; uint16_t pageAddr, newPageAddr; in_flash_addr_t intAddr; @@ -128,7 +139,7 @@ implementation { if (!verifyImage(startAddr)) return R_INVALID_IMAGE_ERROR; - curAddr = startAddr + DELUGE_METADATA_SIZE + DELUGE_CRC_BLOCK_SIZE + DELUGE_IDENT_SIZE; + curAddr = startAddr + DELUGE_IDENT_SIZE + DELUGE_CRC_BLOCK_SIZE; call ExtFlash.startRead(curAddr); @@ -138,7 +149,7 @@ implementation { #if defined(PLATFORM_TELOSB) if (intAddr != TOSBOOT_END) { -#elif defined(PLATFORM_MICAZ) +#elif defined(PLATFORM_MICAZ) || defined(PLATFORM_IRIS) if (intAddr != 0) { #else #error "Target platform is not currently supported by Deluge T2" @@ -146,11 +157,11 @@ implementation { call ExtFlash.stopRead(); return R_INVALID_IMAGE_ERROR; } - - call ExtFlash.stopRead(); // MIKE_LIANG - + + call ExtFlash.stopRead(); + while ( secLength ) { - + pageAddr = newPageAddr = intAddr / TOSBOOT_INT_PAGE_SIZE; call ExtFlash.startRead(curAddr); @@ -159,13 +170,13 @@ implementation { // check if secLength is all ones if ( secLength == 0xffffffff ) { - call ExtFlash.stopRead(); // MIKE_LIANG + call ExtFlash.stopRead(); return FAIL; } buf[(uint16_t)intAddr % TOSBOOT_INT_PAGE_SIZE] = call ExtFlash.readByte(); intAddr++; curAddr++; - + if ( --secLength == 0 ) { intAddr = extFlashReadAddr(); secLength = extFlashReadAddr(); @@ -179,7 +190,6 @@ implementation { call Leds.set(pageAddr); - // write out page if (call ProgFlash.write(pageAddr*TOSBOOT_INT_PAGE_SIZE, buf, TOSBOOT_INT_PAGE_SIZE) == FAIL) { @@ -198,7 +208,7 @@ implementation { void startupSequence() { - tosboot_args_t args; + BootArgs args; // check voltage and make sure flash can be programmed // if not, just run the app, can't check for gestures @@ -209,7 +219,7 @@ implementation { startupLeds(); runApp(); } - + // get current value of counter call IntFlash.read((uint8_t*)TOSBOOT_ARGS_ADDR, &args, sizeof(args)); @@ -245,12 +255,12 @@ implementation { args.gestureCount = 0xff; args.noReprogram = TRUE; call IntFlash.write((uint8_t*)TOSBOOT_ARGS_ADDR, &args, sizeof(args)); - + runApp(); } - int main() __attribute__ ((C, spontaneous)) { + int main() @C() @spontaneous() { __nesc_disable_interrupt();