]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/tosboot/TOSBootM.nc
Proper MSP_BSL_FLAGS for telosa and telosb based platforms using TMI modular tos...
[tinyos-2.x.git] / tos / lib / tosboot / TOSBootM.nc
index 8b4eba708f0080c0111486375f9f545e785e393c..fa1893c72c93f176fc4ee26fc672524e410d6871 100644 (file)
@@ -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();