[Tinyos-2-commits] CVS: tinyos-2.x/tos/chips/at45db
BlockStorageP.nc, 1.1.2.11, 1.1.2.12 LogStorageP.nc, 1.1.2.7,
1.1.2.8
David Gay
idgay at users.sourceforge.net
Tue May 30 16:42:26 PDT 2006
Update of /cvsroot/tinyos/tinyos-2.x/tos/chips/at45db
In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv30881
Modified Files:
Tag: tinyos-2_0_devel-BRANCH
BlockStorageP.nc LogStorageP.nc
Log Message:
block storage cleanup
Index: BlockStorageP.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/tos/chips/at45db/Attic/BlockStorageP.nc,v
retrieving revision 1.1.2.11
retrieving revision 1.1.2.12
diff -C2 -d -r1.1.2.11 -r1.1.2.12
*** BlockStorageP.nc 30 May 2006 21:36:27 -0000 1.1.2.11
--- BlockStorageP.nc 30 May 2006 23:42:23 -0000 1.1.2.12
***************
*** 55,65 ****
{
enum {
! S_IDLE,
! S_WRITE,
! S_ERASE,
! S_COMMIT, S_COMMIT2, S_COMMIT3,
! S_READ,
! S_VERIFY, S_VERIFY2,
! S_CRC,
};
--- 55,71 ----
{
enum {
! R_IDLE,
! R_WRITE,
! R_ERASE,
! R_COMMIT,
! R_READ,
! R_VERIFY,
! R_CRC,
! };
!
! enum {
! META_IDLE,
! META_COMMIT,
! META_VERIFY
};
***************
*** 70,88 ****
uint8_t client = NO_CLIENT;
storage_addr_t bytesRemaining;
! uint16_t crc;
/* The requests */
! uint8_t state[N]; /* automatically initialised to S_IDLE */
! uint8_t *bufPtr[N];
! storage_addr_t curAddr[N];
! storage_len_t requestedLength[N];
! storage_addr_t maxAddr[N];
! uint8_t sig[8];
! inline int configClient(blockstorage_t id) {
! return id < uniqueCount(UQ_CONFIG_STORAGE);
! }
at45page_t pageRemap(at45page_t p) {
--- 76,101 ----
uint8_t client = NO_CLIENT;
+ uint8_t metaState;
storage_addr_t bytesRemaining;
! nx_struct {
! nx_uint16_t crc;
! nx_uint32_t maxAddr;
! } sig;
/* The requests */
! struct {
! /* The latest request made for this client, and it's arguments */
! uint8_t request; /* automatically initialised to R_IDLE */
! uint8_t *buf;
! storage_addr_t addr;
! storage_len_t len;
! storage_addr_t maxAddr;
! } s[N];
!
! /* ------------------------------------------------------------------ */
! /* Interface with ConfigStorageP */
! /* ------------------------------------------------------------------ */
at45page_t pageRemap(at45page_t p) {
***************
*** 108,122 ****
}
! void verifySignature();
! void commitSignature();
! void commitSync();
! void continueRequest();
! void setupRequest(uint8_t newState, blockstorage_t id,
! storage_addr_t addr, uint8_t* buf, storage_len_t len) {
! state[id] = newState;
! curAddr[id] = addr;
! bufPtr[id] = buf;
! requestedLength[id] = len;
}
--- 121,178 ----
}
! /* ------------------------------------------------------------------ */
! /* Queue and initiate user requests */
! /* ------------------------------------------------------------------ */
! void eraseStart();
! void verifyStart();
! void multipageStart(storage_len_t len, uint16_t crc);
!
! void startRequest() {
! switch (s[client].request)
! {
! case R_ERASE:
! eraseStart();
! break;
! case R_VERIFY:
! verifyStart();
! break;
! default:
! multipageStart(s[client].len, (uint16_t)s[client].buf);
! }
! }
!
! void endRequest(error_t result, uint16_t crc) {
! blockstorage_t c = client;
! uint8_t tmpState = s[c].request;
! storage_addr_t actualLength = s[c].len - bytesRemaining;
! storage_addr_t addr = s[c].addr - actualLength;
! void *ptr = s[c].buf - actualLength;
!
! client = NO_CLIENT;
! s[c].request = R_IDLE;
! call Resource.release[c]();
!
! switch(tmpState)
! {
! case R_READ:
! signal BlockRead.readDone[c](addr, ptr, actualLength, result);
! break;
! case R_WRITE:
! signal BlockWrite.writeDone[c](addr, ptr, actualLength, result);
! break;
! case R_ERASE:
! signal BlockWrite.eraseDone[c](result);
! break;
! case R_CRC:
! signal BlockRead.computeCrcDone[c](addr, actualLength, crc, result);
! break;
! case R_COMMIT:
! signal BlockWrite.commitDone[c](result);
! break;
! case R_VERIFY:
! signal BlockRead.verifyDone[c](result);
! break;
! }
}
***************
*** 125,136 ****
storage_len_t vsize;
! if (state[id] != S_IDLE)
return EBUSY;
vsize = call BlockRead.getSize[id]();
! if (addr > vsize || len >= vsize - addr)
return EINVAL;
! setupRequest(newState, id, addr, buf, len);
call Resource.request[id]();
--- 181,195 ----
storage_len_t vsize;
! if (s[id].request != R_IDLE)
return EBUSY;
vsize = call BlockRead.getSize[id]();
! if (addr > vsize || len > vsize - addr)
return EINVAL;
! s[id].request = newState;
! s[id].addr = addr;
! s[id].buf = buf;
! s[id].len = len;
call Resource.request[id]();
***************
*** 141,153 ****
event void Resource.granted[blockstorage_t blockId]() {
client = blockId;
- bytesRemaining = requestedLength[client];
- crc = 0;
! if (state[blockId] == S_WRITE && call BConfig.writeHook[blockId]())
! /* Log write intercept. We'll get a writeContinue when it's
! time to resume. */
! client = NO_CLIENT;
! else
! continueRequest();
}
--- 200,218 ----
event void Resource.granted[blockstorage_t blockId]() {
client = blockId;
! if (s[blockId].request == R_WRITE)
! {
! if (s[blockId].addr + s[blockId].len > s[blockId].maxAddr)
! s[blockId].maxAddr = s[blockId].addr + s[blockId].len;
!
! if (call BConfig.writeHook[blockId]())
! {
! /* Config write intercept. We'll get a writeContinue when it's
! time to resume. */
! client = NO_CLIENT;
! return;
! }
! }
! startRequest();
}
***************
*** 156,229 ****
}
- void signalDone(error_t result);
-
event void BConfig.writeContinue[blockstorage_t blockId](error_t error) {
client = blockId;
if (error == SUCCESS)
! continueRequest();
else
! signalDone(error);
}
! void actualSignal(error_t result) {
! blockstorage_t c = client;
! uint8_t tmpState = state[c];
! storage_addr_t actualLength = requestedLength[c] - bytesRemaining;
! storage_addr_t addr = curAddr[c] - actualLength;
! void *ptr = bufPtr[c] - actualLength;
!
! client = NO_CLIENT;
! state[c] = S_IDLE;
! call Resource.release[c]();
! switch(tmpState)
{
! case S_READ:
! signal BlockRead.readDone[c](addr, ptr, actualLength, result);
! break;
! case S_WRITE:
! signal BlockWrite.writeDone[c](addr, ptr, actualLength, result);
! break;
! case S_ERASE:
! signal BlockWrite.eraseDone[c](result);
! break;
! case S_CRC:
! signal BlockRead.computeCrcDone[c](addr, actualLength, crc, result);
! break;
! case S_COMMIT: case S_COMMIT2: case S_COMMIT3:
! signal BlockWrite.commitDone[c](result);
! break;
! case S_VERIFY: case S_VERIFY2:
! signal BlockRead.verifyDone[c](result);
! break;
}
}
- task void signalSuccess() { actualSignal(SUCCESS); }
-
- task void signalFail() { actualSignal(FAIL); }
-
- void signalDone(error_t result) {
- if (result == SUCCESS)
- switch (state[client])
- {
- case S_COMMIT: commitSignature(); break;
- case S_COMMIT2: commitSync(); break;
- case S_VERIFY: verifySignature(); break;
- case S_VERIFY2:
- if (crc == (sig[0] | (uint16_t)sig[1] << 8))
- actualSignal(SUCCESS);
- else
- {
- maxAddr[client] = 0;
- actualSignal(FAIL);
- }
- break;
- default: post signalSuccess(); break;
- }
- else
- post signalFail();
- }
-
void calcRequest(storage_addr_t addr, at45page_t *page,
at45pageoffset_t *offset, at45pageoffset_t *count) {
--- 221,248 ----
}
event void BConfig.writeContinue[blockstorage_t blockId](error_t error) {
client = blockId;
if (error == SUCCESS)
! startRequest();
else
! endRequest(error, 0);
}
! /* ------------------------------------------------------------------ */
! /* Multipage operations */
! /* ------------------------------------------------------------------ */
! void commitCrcDone(uint16_t crc);
! void verifyCrcDone(uint16_t crc);
!
! void multipageDone(uint16_t crc) {
! switch (s[client].request)
{
! default: endRequest(SUCCESS, crc); break;
! case R_COMMIT: commitCrcDone(crc); break;
! case R_VERIFY: verifyCrcDone(crc); break;
}
}
void calcRequest(storage_addr_t addr, at45page_t *page,
at45pageoffset_t *offset, at45pageoffset_t *count) {
***************
*** 237,386 ****
}
! void continueRequest() {
at45page_t page;
at45pageoffset_t offset, count;
! uint8_t *buf = bufPtr[client];
! calcRequest(curAddr[client], &page, &offset, &count);
bytesRemaining -= count;
! curAddr[client] += count;
! bufPtr[client] += count;
! switch (state[client])
{
! case S_WRITE:
call At45db.write(page, offset, buf, count);
break;
! case S_READ:
call At45db.read(page, offset, buf, count);
break;
! case S_CRC: case S_COMMIT: case S_VERIFY2:
call At45db.computeCrc(page, offset, count, crc);
break;
- case S_ERASE:
- call At45db.erase(page, AT45_ERASE);
- break;
- case S_VERIFY:
- call At45db.read(page, 1 << AT45_PAGE_SIZE_LOG2, sig, sizeof sig);
- break;
}
}
! command error_t BlockWrite.write[blockstorage_t id](storage_addr_t addr, void* buf, storage_len_t len) {
! error_t ok = newRequest(S_WRITE, id, addr, buf, len);
!
! if (ok == SUCCESS && addr + len > maxAddr[id])
! maxAddr[id] = addr + len;
! return ok;
}
command error_t BlockWrite.erase[blockstorage_t id]() {
! return newRequest(S_ERASE, id, 0, NULL, 0);
}
! command error_t BlockWrite.commit[blockstorage_t id]() {
! return newRequest(S_COMMIT, id, 0, NULL, maxAddr[id]);
}
! /* Called once crc computed. Write crc + signature in block 0. */
! void commitSignature() {
! sig[0] = crc;
! sig[1] = crc >> 8;
! sig[2] = maxAddr[client];
! sig[3] = maxAddr[client] >> 8;
! sig[4] = maxAddr[client] >> 16;
! sig[5] = maxAddr[client] >> 24;
! sig[6] = 0xb1; /* block sig: b10c */
! sig[7] = 0x0c;
! state[client] = S_COMMIT2;
! /* Note: bytesRemaining is 0, so multipageDone will go straight to
! signalDone */
! call At45db.write(pageRemap(0), 1 << AT45_PAGE_SIZE_LOG2, sig, sizeof sig);
}
! /* Called once signature written. Ensure writes complete. */
! void commitSync() {
! state[client] = S_COMMIT3;
! call At45db.syncAll();
}
! command storage_len_t BlockRead.getSize[blockstorage_t blockId]() {
! storage_len_t vsize;
! if (call BConfig.isConfig[blockId]())
! vsize = signal BConfig.npages[blockId]();
! else
! vsize = call At45dbVolume.volumeSize[blockId]();
! return vsize << AT45_PAGE_SIZE_LOG2;
}
! command error_t BlockRead.read[blockstorage_t id](storage_addr_t addr, void* buf, storage_len_t len) {
! return newRequest(S_READ, id, addr, buf, len);
}
command error_t BlockRead.verify[blockstorage_t id]() {
! return newRequest(S_VERIFY, id, 0, NULL, 0);
}
! /* See commitSignature */
! void verifySignature() {
! if (sig[6] == 0xb1 && sig[7] == 0x0c)
{
! uint32_t max = sig[2] | (uint32_t)sig[3] << 8 |
! (uint32_t)sig[4] << 16 | (uint32_t)sig[5] << 24;
/* Ignore maxAddress values that are too large */
if (max <= call BlockRead.getSize[client]())
{
! maxAddr[client] = max;
! setupRequest(S_VERIFY2, client, 0, NULL, max);
! signal Resource.granted[client]();
return;
}
}
! actualSignal(FAIL);
}
! command error_t BlockRead.computeCrc[blockstorage_t id](storage_addr_t addr, storage_len_t len) {
! return newRequest(S_CRC, id, addr, NULL, len);
}
! void multipageDone(error_t result) {
! if (client != NO_CLIENT)
! if (bytesRemaining == 0 || result == FAIL)
! signalDone(result);
! else
! continueRequest();
}
event void At45db.writeDone(error_t result) {
! multipageDone(result);
}
event void At45db.readDone(error_t result) {
! multipageDone(result);
}
event void At45db.computeCrcDone(error_t result, uint16_t newCrc) {
! crc = newCrc;
! multipageDone(result);
}
event void At45db.eraseDone(error_t result) {
if (client != NO_CLIENT)
! signalDone(result);
}
event void At45db.syncDone(error_t result) {
if (client != NO_CLIENT)
! signalDone(result);
}
event void At45db.flushDone(error_t result) { }
-
event void At45db.copyPageDone(error_t error) { }
-
default event void BlockWrite.writeDone[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len, error_t result) { }
default event void BlockWrite.eraseDone[uint8_t id](error_t result) { }
--- 256,462 ----
}
! void multipageContinue(uint16_t crc) {
at45page_t page;
at45pageoffset_t offset, count;
! uint8_t *buf = s[client].buf;
! if (bytesRemaining == 0)
! {
! multipageDone(crc);
! return;
! }
!
! calcRequest(s[client].addr, &page, &offset, &count);
bytesRemaining -= count;
! s[client].addr += count;
! s[client].buf = buf + count;
! switch (s[client].request)
{
! case R_WRITE:
call At45db.write(page, offset, buf, count);
break;
! case R_READ:
call At45db.read(page, offset, buf, count);
break;
! default:
call At45db.computeCrc(page, offset, count, crc);
break;
}
}
! void multipageStart(storage_len_t len, uint16_t crc) {
! metaState = META_IDLE;
! bytesRemaining = len;
! multipageContinue(crc);
! }
! void multipageOpDone(error_t result, uint16_t crc) {
! if (result != SUCCESS)
! endRequest(result, 0);
! else
! multipageContinue(crc);
}
+ /* ------------------------------------------------------------------ */
+ /* Erase */
+ /* ------------------------------------------------------------------ */
+
command error_t BlockWrite.erase[blockstorage_t id]() {
! return newRequest(R_ERASE, id, 0, NULL, 0);
}
! void eraseStart() {
! call At45db.erase(pageRemap(0), AT45_ERASE);
}
! void eraseEraseDone(error_t error) {
! endRequest(error, 0);
}
! /* ------------------------------------------------------------------ */
! /* Write */
! /* ------------------------------------------------------------------ */
!
! command error_t BlockWrite.write[blockstorage_t id](storage_addr_t addr, void* buf, storage_len_t len) {
! return newRequest(R_WRITE, id, addr, buf, len);
}
! /* ------------------------------------------------------------------ */
! /* Commit */
! /* ------------------------------------------------------------------ */
! command error_t BlockWrite.commit[blockstorage_t id]() {
! return newRequest(R_COMMIT, id, 0, NULL, s[id].maxAddr);
! }
! /* Called once crc computed. Write crc + signature in block 0. */
! void commitCrcDone(uint16_t crc) {
! sig.crc = crc;
! sig.maxAddr = s[client].maxAddr;
! metaState = META_COMMIT;
! call At45db.write(pageRemap(0), 1 << AT45_PAGE_SIZE_LOG2, &sig, sizeof sig);
}
! void commitWriteDone(error_t error) {
! if (error == SUCCESS)
! call At45db.syncAll();
! else
! endRequest(error, 0);
! }
!
! void commitSyncDone(error_t error) {
! endRequest(error, 0);
}
+ /* ------------------------------------------------------------------ */
+ /* Verify */
+ /* ------------------------------------------------------------------ */
+
command error_t BlockRead.verify[blockstorage_t id]() {
! return newRequest(R_VERIFY, id, 0, NULL, 0);
}
! void verifyStart() {
! metaState = META_VERIFY;
! call At45db.read(pageRemap(0), 1 << AT45_PAGE_SIZE_LOG2, &sig, sizeof sig);
! }
!
! /* See signature written in commit */
! void verifyReadDone(error_t error) {
! if (error == SUCCESS)
{
! storage_addr_t max = sig.maxAddr;
/* Ignore maxAddress values that are too large */
if (max <= call BlockRead.getSize[client]())
{
! s[client].addr = 0;
! s[client].maxAddr = max;
! multipageStart(max, 0);
return;
}
}
! endRequest(FAIL, 0);
}
! void verifyCrcDone(uint16_t crc) {
! if (crc == sig.crc)
! endRequest(SUCCESS, 0);
! else
! {
! s[client].maxAddr = 0;
! endRequest(FAIL, 0);
! }
}
! /* ------------------------------------------------------------------ */
! /* Read */
! /* ------------------------------------------------------------------ */
!
! command error_t BlockRead.read[blockstorage_t id](storage_addr_t addr, void* buf, storage_len_t len) {
! return newRequest(R_READ, id, addr, buf, len);
! }
!
! /* ------------------------------------------------------------------ */
! /* Compute CRC */
! /* ------------------------------------------------------------------ */
!
! command error_t BlockRead.computeCrc[blockstorage_t id](storage_addr_t addr, storage_len_t len, uint16_t basecrc) {
! return newRequest(R_CRC, id, addr, (void *)basecrc, len);
! }
!
! /* ------------------------------------------------------------------ */
! /* Get Size */
! /* ------------------------------------------------------------------ */
!
! command storage_len_t BlockRead.getSize[blockstorage_t blockId]() {
! storage_len_t vsize;
!
! if (call BConfig.isConfig[blockId]())
! vsize = signal BConfig.npages[blockId]();
! else
! vsize = call At45dbVolume.volumeSize[blockId]();
!
! return vsize << AT45_PAGE_SIZE_LOG2;
}
+ /* ------------------------------------------------------------------ */
+ /* Dispatch HAL operations to current user op */
+ /* ------------------------------------------------------------------ */
+
event void At45db.writeDone(error_t result) {
! if (client != NO_CLIENT)
! if (metaState == META_IDLE)
! multipageOpDone(result, 0);
! else
! commitWriteDone(result);
}
event void At45db.readDone(error_t result) {
! if (client != NO_CLIENT)
! if (metaState == META_IDLE)
! multipageOpDone(result, 0);
! else
! verifyReadDone(result);
}
event void At45db.computeCrcDone(error_t result, uint16_t newCrc) {
! if (client != NO_CLIENT)
! multipageOpDone(result, newCrc);
}
event void At45db.eraseDone(error_t result) {
if (client != NO_CLIENT)
! eraseEraseDone(result);
}
event void At45db.syncDone(error_t result) {
if (client != NO_CLIENT)
! commitSyncDone(result);
}
event void At45db.flushDone(error_t result) { }
event void At45db.copyPageDone(error_t error) { }
default event void BlockWrite.writeDone[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len, error_t result) { }
default event void BlockWrite.eraseDone[uint8_t id](error_t result) { }
Index: LogStorageP.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/tos/chips/at45db/Attic/LogStorageP.nc,v
retrieving revision 1.1.2.7
retrieving revision 1.1.2.8
diff -C2 -d -r1.1.2.7 -r1.1.2.8
*** LogStorageP.nc 24 May 2006 21:37:37 -0000 1.1.2.7
--- LogStorageP.nc 30 May 2006 23:42:23 -0000 1.1.2.8
***************
*** 229,239 ****
}
- void setupRequest(uint8_t newRequest, logstorage_t id,
- uint8_t *buf, storage_len_t length) {
- s[id].request = newRequest;
- s[id].buf = buf;
- s[id].len = length;
- }
-
error_t newRequest(uint8_t newRequest, logstorage_t id, bool circular,
uint8_t *buf, storage_len_t length) {
--- 229,232 ----
***************
*** 246,250 ****
s[id].circular = circular;
! setupRequest(newRequest, id, buf, length);
call Resource.request[id]();
--- 239,245 ----
s[id].circular = circular;
! s[id].request = newRequest;
! s[id].buf = buf;
! s[id].len = length;
call Resource.request[id]();
More information about the Tinyos-2-commits
mailing list