From 75b930f39633282acf5c5692e8f6df25b4c3e97a Mon Sep 17 00:00:00 2001 From: Magnus Eriksson Date: Wed, 10 Mar 2010 18:29:38 +0100 Subject: [PATCH] added erase_flash, utility to erase mtd partition primarily for platforms without engineering SPL or native fastboot support --- mtdutils/Android.mk | 9 +++++ mtdutils/erase_flash.c | 82 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 mtdutils/erase_flash.c diff --git a/mtdutils/Android.mk b/mtdutils/Android.mk index 06ba854..e83cbf3 100644 --- a/mtdutils/Android.mk +++ b/mtdutils/Android.mk @@ -28,6 +28,14 @@ LOCAL_STATIC_LIBRARIES := libmtdutils LOCAL_SHARED_LIBRARIES := libcutils libc include $(BUILD_EXECUTABLE) +include $(CLEAR_VARS) +LOCAL_SRC_FILES := erase_flash.c +LOCAL_MODULE := erase_flash +LOCAL_MODULE_TAGS := eng +LOCAL_STATIC_LIBRARIES := libmtdutils +LOCAL_SHARED_LIBRARIES := libcutils libc +include $(BUILD_EXECUTABLE) + include $(CLEAR_VARS) LOCAL_SRC_FILES := flash_image.c LOCAL_MODULE := libflash_image @@ -46,6 +54,7 @@ LOCAL_MODULE_PATH := $(TARGET_OUT)/utilities LOCAL_STATIC_LIBRARIES := libmtdutils libcutils libc include $(BUILD_EXECUTABLE) + include $(CLEAR_VARS) LOCAL_SRC_FILES := dump_image.c LOCAL_MODULE := libdump_image diff --git a/mtdutils/erase_flash.c b/mtdutils/erase_flash.c new file mode 100644 index 0000000..111e637 --- /dev/null +++ b/mtdutils/erase_flash.c @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * Portions Copyright (C) 2010 Magnus Eriksson + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "cutils/log.h" +#include "mtdutils.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif + +#define LOG_TAG "erase_flash" + +void die(const char *msg, ...) { + int err = errno; + va_list args; + va_start(args, msg); + char buf[1024]; + vsnprintf(buf, sizeof(buf), msg, args); + va_end(args); + + if (err != 0) { + strlcat(buf, ": ", sizeof(buf)); + strlcat(buf, strerror(err), sizeof(buf)); + } + + fprintf(stderr, "%s\n", buf); + LOGE("%s\n", buf); + exit(1); +} + +/* Erase a mtd partition */ + +int main(int argc, char **argv) { + MtdWriteContext *out; + size_t erased; + size_t total_size; + size_t erase_size; + + if (argc != 2) { + fprintf(stderr, "usage: %s \n", argv[0]); + return 2; + } + + if (mtd_scan_partitions() <= 0) die("error scanning partitions"); + const MtdPartition *partition = mtd_find_partition_by_name(argv[1]); + if (partition == NULL) die("can't find %s partition", argv[1]); + + out = mtd_write_partition(partition); + if (out == NULL) die("could not estabilish write context for %s", argv[1]); + + // do the actual erase, -1 = full partition erase + erased = mtd_erase_blocks(out, -1); + + // erased = bytes erased, if zero, something borked + if (!erased) die("error erasing %s", argv[1]); + + return 0; +}