From: razvanm Date: Sat, 16 Jan 2010 10:02:29 +0000 (+0000) Subject: Workaround the erase problems with AT45DB X-Git-Tag: rc_6_tinyos_2_1_1~56 X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=tinyos-2.x.git;a=commitdiff_plain;h=809036bc77a8366b0f9aa2d78cdcacdcc4dc1379 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. --- 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;