]> 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 4ed7a64b9a7bd722e684cc69c5da77731597fb3f..b91f194bee9f4ded4544df14a5b030819dd0ba19 100644 (file)
  * @author Razvan Musaloiu-E. <razvanm@cs.jhu.edu>
  */
 
+#include "imgNum2volumeId.h"
+
 generic module FlashVolumeManagerP()
 {
   uses {
     interface BlockRead[uint8_t imgNum];
     interface BlockWrite[uint8_t imgNum];
-    interface Resource[uint8_t imgNum];
+    interface Resource;
     interface ArbiterInfo;
     interface AMSend as SerialAMSender;
     interface Receive as SerialAMReceiver;
@@ -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,16 +181,16 @@ implementation
     }
 
     // Converts the image number that the user wants to the real image number
-    imgNum = imgNum2volumeId[request->imgNum];
+    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) {
        case CMD_ERASE:
        case CMD_WRITE:
-         if (!call Resource.isOwner[imgNum]()) {
-           error = call Resource.immediateRequest[imgNum]();
+         if (!call Resource.isOwner()) {
+           error = call Resource.immediateRequest();
          }
       }
       if (error == SUCCESS) {
@@ -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;
@@ -258,17 +257,16 @@ implementation
   event void TimeoutTimer.fired()
   {
     // Release the resource.
-    if (state == S_IDLE && call Resource.isOwner[currentImgNum]()) {
-      call Leds.led1Off();
-      call Resource.release[currentImgNum]();
+    if (state == S_IDLE && call Resource.isOwner()) {
+      call Resource.release();
     }
-    if (state == S_IDLE && !call ArbiterInfo.inUse()) {
+    if (state == S_IDLE) {
       call Leds.led1Off();
     }
   }
 
   event void SerialAMSender.sendDone(message_t* msg, error_t error) {}
-  event void Resource.granted[uint8_t imgNum]() {}
+  event void Resource.granted() {}
 
   default command error_t BlockWrite.write[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; }
   default command error_t BlockWrite.erase[uint8_t imgNum]() { return FAIL; }
@@ -276,7 +274,7 @@ implementation
   default command error_t BlockRead.read[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; }
   default command error_t BlockRead.computeCrc[uint8_t imgNum](storage_addr_t addr, storage_len_t len, uint16_t crc) { return FAIL; }
 
-  default async command error_t Resource.immediateRequest[uint8_t imgNum]() { return FAIL; }
-  default async command error_t Resource.release[uint8_t imgNum]() { return FAIL; }
-  default async command bool Resource.isOwner[uint8_t imgNum]() { return FAIL; }
+  default async command error_t Resource.immediateRequest() { return FAIL; }
+  default async command error_t Resource.release() { return FAIL; }
+  default async command bool Resource.isOwner() { return FAIL; }
 }