]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/net/Deluge/FlashVolumeManager/FlashVolumeManagerP.nc
Workaround the erase problems with AT45DB
[tinyos-2.x.git] / tos / lib / net / Deluge / FlashVolumeManager / FlashVolumeManagerP.nc
index 56558c4214a17c8b14bf11c143a016a5e005de59..b91f194bee9f4ded4544df14a5b030819dd0ba19 100644 (file)
@@ -24,6 +24,8 @@
  * @author Razvan Musaloiu-E. <razvanm@cs.jhu.edu>
  */
 
+#include "imgNum2volumeId.h"
+
 generic module FlashVolumeManagerP()
 {
   uses {
@@ -43,7 +45,7 @@ implementation
   typedef nx_struct SerialReqPacket {
     nx_uint8_t cmd;
     nx_uint8_t imgNum;
-    nx_uint16_t offset;
+    nx_uint32_t offset;
     nx_uint16_t len;
     nx_uint8_t data[0];
   } SerialReqPacket;
@@ -88,13 +90,6 @@ implementation
     nx_uint16_t nodeid;
   };
 
-  uint8_t imgNum2volumeId[] = {
-    VOLUME_GOLDENIMAGE,
-    VOLUME_DELUGE1,
-    VOLUME_DELUGE2,
-    VOLUME_DELUGE3
-  };
-  
   void sendReply(error_t error, storage_len_t len)
   {
     SerialReplyPacket *reply = (SerialReplyPacket *)call SerialAMSender.getPayload(&serialMsg, sizeof(SerialReplyPacket));
@@ -186,9 +181,9 @@ implementation
     }
 
     // Converts the image number that the user wants to the real image number
-    imgNum = request->imgNum < DELUGE_NUM_VOLUMES ? imgNum2volumeId[request->imgNum] : 0xFF;
+    imgNum = imgNum2volumeId(request->imgNum);
     
-    if (imgNum != 0xFF) {
+    if (imgNum != NON_DELUGE_VOLUME) {
       error = SUCCESS;
       // We ask for a reservation only for erase and write.
       switch (request->cmd) {
@@ -205,7 +200,11 @@ implementation
        switch (request->cmd) {
         case CMD_ERASE:    // === Erases a volume ===
           state = S_ERASE;
+#if defined(PLATFORM_MICAZ) || defined(PLATFORM_IRIS) || defined(PLATFORM_EPIC)
+          error = FAIL;
+#else
           error = call BlockWrite.erase[imgNum]();
+#endif
           break;
         case CMD_WRITE:    // === Writes to a volume ===
           state = S_WRITE;
@@ -259,10 +258,9 @@ implementation
   {
     // Release the resource.
     if (state == S_IDLE && call Resource.isOwner()) {
-      call Leds.led1Off();
       call Resource.release();
     }
-    if (state == S_IDLE && !call ArbiterInfo.inUse()) {
+    if (state == S_IDLE) {
       call Leds.led1Off();
     }
   }