[Tinyos-beta-commits] CVS: tinyos-1.x/beta/AT45DB BlockStorageM.nc, 1.5, 1.6 FormatStorageC.nc, 1.1, 1.2 FormatStorageM.nc, 1.1, 1.2 HALAT45DBShare.nc, 1.2, 1.3 StorageManager.h, 1.1, 1.2 StorageManagerC.nc, 1.3, 1.4 StorageManagerM.nc, 1.3, 1.4

David Gay idgay at users.sourceforge.net
Wed Jun 8 16:27:32 PDT 2005


Update of /cvsroot/tinyos/tinyos-1.x/beta/AT45DB
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14949

Modified Files:
	BlockStorageM.nc FormatStorageC.nc FormatStorageM.nc 
	HALAT45DBShare.nc StorageManager.h StorageManagerC.nc 
	StorageManagerM.nc 
Log Message:
store volume table in last block of flash


Index: BlockStorageM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/AT45DB/BlockStorageM.nc,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** BlockStorageM.nc	8 Jun 2005 21:45:11 -0000	1.5
--- BlockStorageM.nc	8 Jun 2005 23:27:29 -0000	1.6
***************
*** 266,297 ****
    }
  
!   result_t multipageDone(result_t result) {
      if (bytesRemaining == 0 || result == FAIL)
        signalDone(result);
      else
        continueRequest();
-     return SUCCESS;
    }
  
    event result_t HALAT45DB.writeDone[uint8_t id](result_t result) {
!     return multipageDone(result);
    }
  
    event result_t HALAT45DB.readDone[uint8_t id](result_t result) {
!     return multipageDone(result);
    }
  
    event result_t HALAT45DB.computeCrcDone[uint8_t id](result_t result, uint16_t newCrc) {
!     crc = crc + newCrc; // this is undoubtably horrible and wrong.
!     return multipageDone(result);
    }
  
    event result_t HALAT45DB.eraseDone[uint8_t id](result_t result) {
!     signalDone(result);
      return SUCCESS;
    }
  
    event result_t HALAT45DB.syncDone[uint8_t id](result_t result) {
!     signalDone(result);
      return SUCCESS;
    }
--- 266,306 ----
    }
  
!   void multipageDone(result_t result) {
      if (bytesRemaining == 0 || result == FAIL)
        signalDone(result);
      else
        continueRequest();
    }
  
    event result_t HALAT45DB.writeDone[uint8_t id](result_t result) {
!     if (id == client)
!       multipageDone(result);
!     return SUCCESS;
    }
  
    event result_t HALAT45DB.readDone[uint8_t id](result_t result) {
!     if (id == client)
!       multipageDone(result);
!     return SUCCESS;
    }
  
    event result_t HALAT45DB.computeCrcDone[uint8_t id](result_t result, uint16_t newCrc) {
!     if (id == client)
!       {
! 	crc = crc + newCrc; // this is undoubtably horrible and wrong.
! 	multipageDone(result);
!       }
!     return SUCCESS;
    }
  
    event result_t HALAT45DB.eraseDone[uint8_t id](result_t result) {
!     if (id == client)
!       signalDone(result);
      return SUCCESS;
    }
  
    event result_t HALAT45DB.syncDone[uint8_t id](result_t result) {
!     if (id == client)
!       signalDone(result);
      return SUCCESS;
    }

Index: FormatStorageC.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/AT45DB/FormatStorageC.nc,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** FormatStorageC.nc	8 Jun 2005 21:45:12 -0000	1.1
--- FormatStorageC.nc	8 Jun 2005 23:27:29 -0000	1.2
***************
*** 28,31 ****
--- 28,33 ----
  
  includes crc;
+ includes Storage;
+ #define HALAT45DB PageEEPROM
  
  configuration FormatStorageC {
***************
*** 33,41 ****
  }
  implementation {
!   components FormatStorageM, InternalFlashC, Main;
  
    FormatStorage = FormatStorageM;
  
    Main.StdControl -> FormatStorageM;
!   FormatStorageM.InternalFlash -> InternalFlashC;
  }
--- 35,44 ----
  }
  implementation {
!   components FormatStorageM, Main, PageEEPROMC as HALAT45DBC;
  
    FormatStorage = FormatStorageM;
  
    Main.StdControl -> FormatStorageM;
!   Main.StdControl -> HALAT45DBC;
!   FormatStorageM.HALAT45DB -> HALAT45DBC.HALAT45DB[unique("PageEEPROM")];
  }

Index: FormatStorageM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/AT45DB/FormatStorageM.nc,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** FormatStorageM.nc	8 Jun 2005 21:45:12 -0000	1.1
--- FormatStorageM.nc	8 Jun 2005 23:27:29 -0000	1.2
***************
*** 28,31 ****
--- 28,32 ----
  
  includes Storage;
+ #define HALAT45DB PageEEPROM
  includes StorageManager;
  includes crc;
***************
*** 37,41 ****
    }
    uses {
!     interface InternalFlash;
    }
  }
--- 38,42 ----
    }
    uses {
!     interface HALAT45DB;
    }
  }
***************
*** 48,53 ****
    enum {
      S_INIT,
!     S_COMMIT,
!     S_COMMIT_DONE,
    };
    
--- 49,53 ----
    enum {
      S_INIT,
!     S_COMMIT, S_COMMIT_HEADER, S_COMMIT_VOLUMES, S_COMMIT_DONE
    };
    
***************
*** 180,191 ****
    }
  
!   task void commitVolumes() {
!     result_t ok1, ok2;
  
      header.crc = computeSectorTableCrc();
!     ok1 = call InternalFlash.write((uint8_t *)VOLUME_TABLE_ADDRESS, &header, sizeof header);
!     ok2 = call InternalFlash.write((uint8_t *)VOLUME_DEF_ADDRESS, &volumes, sizeof *volumes * header.nvolumes);
  
!     signal FormatStorage.commitDone(rcombine(ok1, ok2) != FAIL ? STORAGE_OK : STORAGE_FAIL);
    }
  
--- 180,232 ----
    }
  
!   void commitComplete(result_t x) {
!     state = S_COMMIT_DONE;
!     signal FormatStorage.commitDone(x == FAIL ? STORAGE_FAIL : STORAGE_OK);
!   }
  
+   task void commitVolumes() {
      header.crc = computeSectorTableCrc();
!     if (call HALAT45DB.write(VOLUME_TABLE_PAGE, 0, &header, sizeof header) != FAIL)
!       state = S_COMMIT_HEADER;
!     else
!       commitComplete(FAIL);
!   }
  
!   event result_t HALAT45DB.writeDone(result_t result) {
!     if (result != FAIL)
!       switch (state)
! 	{
! 	case S_COMMIT_HEADER:
! 	  result = call HALAT45DB.write(VOLUME_TABLE_PAGE, sizeof header, &volumes,
! 					sizeof *volumes * header.nvolumes);
! 	  state = S_COMMIT_VOLUMES;
! 	  break;
! 	case S_COMMIT_VOLUMES:
! 	  result = call HALAT45DB.sync(VOLUME_TABLE_PAGE);
! 	}
!     if (result == FAIL)
!       commitComplete(FAIL);
!     return SUCCESS;
!   }
! 
!   event result_t HALAT45DB.syncDone(result_t result) {
!     commitComplete(result);
!     return SUCCESS;
!   }
! 
!   event result_t HALAT45DB.eraseDone(result_t result) {
!     return SUCCESS;
!   }
! 
!   event result_t HALAT45DB.flushDone(result_t result) {
!     return SUCCESS;
!   }
! 
!   event result_t HALAT45DB.readDone(result_t result) {
!     return SUCCESS;
!   }
! 
!   event result_t HALAT45DB.computeCrcDone(result_t result, uint16_t crc) {
!     return SUCCESS;
    }
  

Index: HALAT45DBShare.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/AT45DB/HALAT45DBShare.nc,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** HALAT45DBShare.nc	4 Jun 2005 00:04:34 -0000	1.2
--- HALAT45DBShare.nc	8 Jun 2005 23:27:29 -0000	1.3
***************
*** 46,74 ****
  }
  implementation {
-   enum {
-     NCLIENTS = uniqueCount("StorageManager")
-   };
    volume_t lastClient;
  
-   // Read & write the client id. We special case the 1-client case to
-   // eliminate the overhead (still costs 1 byte of ram, though)
    int setClient(volume_t client) {
!     if (NCLIENTS != 1)
!       {
! 	if (lastClient)
! 	  return FALSE;
! 	lastClient = client + 1;
!       }
      return TRUE;
    }
  
    volume_t getClient() {
!     volume_t id = 0;
  
!     if (NCLIENTS != 1)
!       {
! 	id = lastClient - 1;
! 	lastClient = 0;
!       }
  
      return id;
--- 46,63 ----
  }
  implementation {
    volume_t lastClient;
  
    int setClient(volume_t client) {
!     if (lastClient)
!       return FALSE;
!     lastClient = client + 1;
! 
      return TRUE;
    }
  
    volume_t getClient() {
!     volume_t id = lastClient - 1;
  
!     lastClient = 0;
  
      return id;
***************
*** 76,83 ****
  
    inline at45page_t remap(at45page_t page) {
!     if (NCLIENTS != 1)
!       return call AT45Remap.remap(lastClient, page);
!     else
!       return call AT45Remap.remap(0, page);
    }
  
--- 65,69 ----
  
    inline at45page_t remap(at45page_t page) {
!     return call AT45Remap.remap(lastClient - 1, page);
    }
  

Index: StorageManager.h
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/AT45DB/StorageManager.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** StorageManager.h	8 Jun 2005 21:45:12 -0000	1.1
--- StorageManager.h	8 Jun 2005 23:27:29 -0000	1.2
***************
*** 16,22 ****
  enum {
    INVALID_VOLUME_ID = 0,
!   VOLUME_TABLE_SIZE = 256,
!   VOLUME_TABLE_ADDRESS = 0xf00, // in on-chip eeprom
!   VOLUME_DEF_ADDRESS = VOLUME_TABLE_ADDRESS + sizeof(struct volume_definition_header_t),
    MAX_VOLUMES = (VOLUME_TABLE_SIZE - sizeof(struct volume_definition_header_t)) / sizeof(struct volume_definition_t)
  };
--- 16,21 ----
  enum {
    INVALID_VOLUME_ID = 0,
!   VOLUME_TABLE_SIZE = AT45_PAGE_SIZE,
!   VOLUME_TABLE_PAGE = AT45_MAX_PAGES - 1,
    MAX_VOLUMES = (VOLUME_TABLE_SIZE - sizeof(struct volume_definition_header_t)) / sizeof(struct volume_definition_t)
  };

Index: StorageManagerC.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/AT45DB/StorageManagerC.nc,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** StorageManagerC.nc	8 Jun 2005 21:45:12 -0000	1.3
--- StorageManagerC.nc	8 Jun 2005 23:27:29 -0000	1.4
***************
*** 20,24 ****
    AT45Remap = StorageManagerM;
  
!   StorageManagerM.InternalFlash -> InternalFlashC;
  
    HALAT45DBShare.ActualAT45 -> HALAT45DBC.PageEEPROM[unique("PageEEPROM")];
--- 20,24 ----
    AT45Remap = StorageManagerM;
  
!   StorageManagerM.HALAT45DB -> HALAT45DBShare.HALAT45DB[uniqueCount("StorageManager")];
  
    HALAT45DBShare.ActualAT45 -> HALAT45DBC.PageEEPROM[unique("PageEEPROM")];

Index: StorageManagerM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/AT45DB/StorageManagerM.nc,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** StorageManagerM.nc	8 Jun 2005 21:45:12 -0000	1.3
--- StorageManagerM.nc	8 Jun 2005 23:27:29 -0000	1.4
***************
*** 1,4 ****
--- 1,5 ----
  includes crc;
  includes StorageManager;
+ #define HALAT45DB PageEEPROM
  module StorageManagerM {
    provides {
***************
*** 7,11 ****
      interface AT45Remap;
    }
!   uses interface InternalFlash;
  }
  implementation {
--- 8,12 ----
      interface AT45Remap;
    }
!   uses interface HALAT45DB;
  }
  implementation {
***************
*** 14,28 ****
    };
  
    struct volume_definition_t volumes[NVOLUMES];
-   uint8_t nvolumes;
  
    enum {
-     S_BOOT,
      S_READY,
!     S_MOUNTING,
!     S_INVALID
    };
!   uint8_t state;
  
    volume_t client;
    volume_id_t id;
--- 15,33 ----
    };
  
+   struct volume_definition_header_t header;
    struct volume_definition_t volumes[NVOLUMES];
  
    enum {
      S_READY,
!     S_MOUNTING
    };
!   struct {
!     bool validated : 1;
!     bool invalid : 1;
!     bool busy : 1;
!     uint8_t state : 2;
!   } f;
  
+   uint8_t nextVolume;
    volume_t client;
    volume_id_t id;
***************
*** 34,38 ****
        volumes[i].id = INVALID_VOLUME_ID;
  
-     state = S_BOOT;
      return SUCCESS;
    }
--- 39,42 ----
***************
*** 47,120 ****
  
    void mountComplete(storage_result_t r) {
!     state = S_READY;
      signal Mount.mountDone[client](r, id);
    }
  
!   task void mountVolume() {
!     uint8_t i;
!     uint8_t *addr = (uint8_t *)VOLUME_DEF_ADDRESS;
! 
!     for (i = 0; i < nvolumes; i++)
!       {
! 	volume_id_t vid;
! 
! 	if (call InternalFlash.read(addr + offsetof(struct volume_definition_t, id),
! 				    &vid, sizeof vid) == FAIL)
! 	  {
! 	    mountComplete(STORAGE_FAIL);
! 	    return;
! 	  }
! 	if (vid == id &&
! 	    call InternalFlash.read(addr, &volumes[client], sizeof volumes[client]) != FAIL)
! 	  {
! 	    mountComplete(STORAGE_OK);
! 	    return;
! 	  }
! 	addr += sizeof(struct volume_definition_t);
!       }
!     mountComplete(STORAGE_FAIL);
    }
  
!   task void validateVolumeTable() {
!     struct volume_definition_header_t header;
!     uint16_t i;
!     uint16_t crc;
! 
!     if (call InternalFlash.read((uint8_t *)VOLUME_TABLE_ADDRESS, &header, sizeof header))
!       {
! 	/* Compute crc of volume table */
! 	nvolumes = header.nvolumes;
! 	crc = crcByte(0, nvolumes);
! 	for (i = 0; i < nvolumes * sizeof(struct volume_definition_t); i++)
! 	  {
! 	    uint8_t x;
  
! 	    if (call InternalFlash.read((uint8_t *)VOLUME_DEF_ADDRESS + i, &x, 1) == FAIL)
! 	      goto invalid;
! 	    crc = crcByte(crc, x);
! 	  }
! 	if (crc == header.crc)
! 	  {
! 	    post mountVolume();
! 	    return;
! 	  }
!       }
!   invalid:
!     state = S_INVALID;
!     signal Mount.mountDone[client](STORAGE_FAIL, id);
    }
  
    command result_t Mount.mount[volume_t v](volume_id_t i) {
!     if (state == S_MOUNTING || state == S_INVALID || volumes[v].id != INVALID_VOLUME_ID)
        return FAIL;
  
      client = v;
      id = i;
! 
!     if (state == S_BOOT)
!       post validateVolumeTable();
!     else
!       post mountVolume();
!     state = S_MOUNTING;
  
      return SUCCESS;
--- 51,88 ----
  
    void mountComplete(storage_result_t r) {
!     f.busy = FALSE;
      signal Mount.mountDone[client](r, id);
    }
  
!   void check(result_t r) {
!     if (r == FAIL)
!       mountComplete(STORAGE_FAIL);
    }
  
!   void checkNextVolume() {
!     if (f.invalid || nextVolume == header.nvolumes)
!       mountComplete(STORAGE_FAIL);
!     else
!       check(call HALAT45DB.read(VOLUME_TABLE_PAGE, sizeof(struct volume_definition_header_t) +
! 				nextVolume++ * sizeof(struct volume_definition_t),
! 				&volumes[client], sizeof volumes[client]));
!   }
  
!   task void mountVolume() {
!     if (!f.validated)
!       check(call HALAT45DB.read(VOLUME_TABLE_PAGE, 0, &header, sizeof header));
!     else
!       checkNextVolume();
    }
  
    command result_t Mount.mount[volume_t v](volume_id_t i) {
!     if (f.busy || volumes[v].id != INVALID_VOLUME_ID)
        return FAIL;
  
+     f.busy = TRUE;
      client = v;
      id = i;
!     nextVolume = 0;
!     post mountVolume();
  
      return SUCCESS;
***************
*** 122,126 ****
  
    command at45page_t AT45Remap.remap(volume_t volume, at45page_t volumePage) {
!     return volumePage + volumes[volume].start;
    }
  
--- 90,97 ----
  
    command at45page_t AT45Remap.remap(volume_t volume, at45page_t volumePage) {
!     if (volume == NVOLUMES) // special internal-use case
!       return volumePage;
!     else
!       return volumePage + volumes[volume].start;
    }
  
***************
*** 128,130 ****
--- 99,142 ----
      return (storage_addr_t)volumes[volume].length << AT45_PAGE_SIZE_LOG2;
    }
+ 
+   event result_t HALAT45DB.writeDone(result_t result) {
+     return SUCCESS;
+   }
+ 
+   event result_t HALAT45DB.eraseDone(result_t result) {
+     return SUCCESS;
+   }
+ 
+   event result_t HALAT45DB.syncDone(result_t result) {
+     return SUCCESS;
+   }
+ 
+   event result_t HALAT45DB.flushDone(result_t result) {
+     return SUCCESS;
+   }
+ 
+   event result_t HALAT45DB.readDone(result_t result) {
+     if (!f.validated)
+       {
+ 	size_t nvOffset = offsetof(struct volume_definition_header_t, nvolumes);
+ 	call HALAT45DB.computeCrc(VOLUME_TABLE_PAGE, nvOffset,
+ 				  header.nvolumes * sizeof *volumes +
+ 				  sizeof(struct volume_definition_header_t) - nvOffset);
+       }
+     else
+       {
+ 	if (volumes[client].id == id)
+ 	  mountComplete(STORAGE_OK);
+ 	else
+ 	  checkNextVolume();
+       }
+     return SUCCESS;
+   }
+ 
+   event result_t HALAT45DB.computeCrcDone(result_t result, uint16_t crc) {
+     f.validated = TRUE;
+     f.invalid = crc != header.crc;
+     checkNextVolume();
+     return SUCCESS;
+   }
  }



More information about the Tinyos-beta-commits mailing list