[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