From 809036bc77a8366b0f9aa2d78cdcacdcc4dc1379 Mon Sep 17 00:00:00 2001 From: razvanm Date: Sat, 16 Jan 2010 10:02:29 +0000 Subject: [PATCH 1/1] Workaround the erase problems with AT45DB The previous commit did not take in consideration that STM45P requires the erase operation. The new strategy is to make the FlashVolumeManager refuse the erase for AT45DB, and make the tos-deluge attempt to overwrite of the metadata only when the erase fails. --- tools/tinyos/misc/tos-deluge | 13 ++++++++----- .../FlashVolumeManager/FlashVolumeManagerP.nc | 4 ++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/tools/tinyos/misc/tos-deluge b/tools/tinyos/misc/tos-deluge index 1277ba5d..7a215a0e 100755 --- a/tools/tinyos/misc/tos-deluge +++ b/tools/tinyos/misc/tos-deluge @@ -186,12 +186,15 @@ def read(imgNum, offset, length): def erase(imgNum): # Note: the normal erase doesn't work properly on AT45DB. A - # workaroud is to overwrite the metadata of the Deluge image. - # - #sreqpkt = FMReqPacket((FM_CMD_ERASE, imgNum, 0, 0, [])) - #success = am.write(sreqpkt, FM_AMID) - #return handleResponse(success, "ERROR: Unable to erase the flash volume") + # workaround is to do the normal erase (to make happy STM45P) + # and then overwrite the metadata (to make happy AT45DB). + sreqpkt = FMReqPacket((FM_CMD_ERASE, imgNum, 0, 0, [])) + success = am.write(sreqpkt, FM_AMID) + result = handleResponse(success, "ERROR: Unable to erase the flash volume") + if result: return True; + + print 'Attempt the workaround for AT45DB...' sreqpkt = FMReqPacket((FM_CMD_WRITE, imgNum, 0, 0, [])) sreqpkt.data = [0xFF] * DELUGE_IDENT_SIZE sreqpkt.length = DELUGE_IDENT_SIZE diff --git a/tos/lib/net/Deluge/FlashVolumeManager/FlashVolumeManagerP.nc b/tos/lib/net/Deluge/FlashVolumeManager/FlashVolumeManagerP.nc index e758e77a..b91f194b 100644 --- a/tos/lib/net/Deluge/FlashVolumeManager/FlashVolumeManagerP.nc +++ b/tos/lib/net/Deluge/FlashVolumeManager/FlashVolumeManagerP.nc @@ -200,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; -- 2.39.2