Refactor recovery's block device handling to work across variant hardware in a cleaner fashion.
Re add firmware update
Change-Id: I699ad22390ed14e597d17a7bcb32ad1b1af00b4b
support mmc misc
Change-Id: Iff02f8d03db6835f501d052140cebeefee521305
fix compile errors
Change-Id: I032edbd157a8a15f561bb83330c715ebaa008d18
fix compile errors
Change-Id: Idff3449be3376f22fceefc2c35637527f8df8f3f
Initial work to clean up the block devices.
Change-Id: I4be20ac124864a281be9cd116e211a2618404a27
all done
Change-Id: I0338f62f6a045556ebe90b0200685be113178319
fix up nandroid
Change-Id: I886f00271183e6d2921c080b0939341f2cf12a4d
diff --git a/roots.c b/roots.c
index 92b89a4..39179e9 100644
--- a/roots.c
+++ b/roots.c
@@ -24,37 +24,35 @@
#include <limits.h>
-#include "mtdutils/mtdutils.h"
-#include "mtdutils/mounts.h"
-#include "mmcutils/mmcutils.h"
+#include "flashutils/flashutils.h"
#include "minzip/Zip.h"
#include "roots.h"
#include "common.h"
+#include "mounts.h"
#include "extendedcommands.h"
/* Canonical pointers.
xxx may just want to use enums
*/
-static const char g_mtd_device[] = "@\0g_mtd_device";
-static const char g_mmc_device[] = "@\0g_mmc_device";
+static const char g_default_device[] = "@\0g_default_device";
static const char g_raw[] = "@\0g_raw";
static const char g_package_file[] = "@\0g_package_file";
static RootInfo g_roots[] = {
- { "BOOT:", DEFAULT_DEVICE, NULL, "boot", NULL, g_raw, NULL },
- { "CACHE:", CACHE_DEVICE, NULL, "cache", "/cache", CACHE_FILESYSTEM, CACHE_FILESYSTEM_OPTIONS },
- { "DATA:", DATA_DEVICE, NULL, "userdata", "/data", DATA_FILESYSTEM, DATA_FILESYSTEM_OPTIONS },
-#ifdef HAS_DATADATA
- { "DATADATA:", DATADATA_DEVICE, NULL, "datadata", "/datadata", DATADATA_FILESYSTEM, DATADATA_FILESYSTEM_OPTIONS },
+ { "BOOT:", g_default_device, NULL, "boot", NULL, g_raw, NULL },
+ { "CACHE:", BOARD_CACHE_DEVICE, NULL, "cache", "/cache", BOARD_CACHE_FILESYSTEM, BOARD_CACHE_FILESYSTEM_OPTIONS },
+ { "DATA:", BOARD_DATA_DEVICE, NULL, "userdata", "/data", BOARD_DATA_FILESYSTEM, BOARD_DATA_FILESYSTEM_OPTIONS },
+#ifdef BOARD_HAS_DATADATA
+ { "DATADATA:", BOARD_DATADATA_DEVICE, NULL, "datadata", "/datadata", BOARD_DATADATA_FILESYSTEM, BOARD_DATADATA_FILESYSTEM_OPTIONS },
#endif
- { "MISC:", DEFAULT_DEVICE, NULL, "misc", NULL, g_raw, NULL },
+ { "MISC:", g_default_device, NULL, "misc", NULL, g_raw, NULL },
{ "PACKAGE:", NULL, NULL, NULL, NULL, g_package_file, NULL },
- { "RECOVERY:", DEFAULT_DEVICE, NULL, "recovery", "/", g_raw, NULL },
- { "SDCARD:", SDCARD_DEVICE_PRIMARY, SDCARD_DEVICE_SECONDARY, NULL, "/sdcard", "vfat", NULL },
- { "SDEXT:", SDEXT_DEVICE, NULL, NULL, "/sd-ext", SDEXT_FILESYSTEM, NULL },
- { "SYSTEM:", SYSTEM_DEVICE, NULL, "system", "/system", SYSTEM_FILESYSTEM, SYSTEM_FILESYSTEM_OPTIONS },
- { "MBM:", DEFAULT_DEVICE, NULL, "mbm", NULL, g_raw, NULL },
+ { "RECOVERY:", g_default_device, NULL, "recovery", "/", g_raw, NULL },
+ { "SDCARD:", BOARD_SDCARD_DEVICE_PRIMARY, BOARD_SDCARD_DEVICE_SECONDARY, NULL, "/sdcard", "vfat", NULL },
+ { "SDEXT:", BOARD_SDEXT_DEVICE, NULL, NULL, "/sd-ext", BOARD_SDEXT_FILESYSTEM, NULL },
+ { "SYSTEM:", BOARD_SYSTEM_DEVICE, NULL, "system", "/system", BOARD_SYSTEM_FILESYSTEM, BOARD_SYSTEM_FILESYSTEM_OPTIONS },
+ { "MBM:", g_default_device, NULL, "mbm", NULL, g_raw, NULL },
{ "TMP:", NULL, NULL, NULL, "/tmp", NULL, NULL },
};
#define NUM_ROOTS (sizeof(g_roots) / sizeof(g_roots[0]))
@@ -240,35 +238,6 @@
/* It's not mounted.
*/
- if (info->device == g_mtd_device) {
- if (info->partition_name == NULL) {
- return -1;
- }
-//TODO: make the mtd stuff scan once when it needs to
- mtd_scan_partitions();
- const MtdPartition *partition;
- partition = mtd_find_partition_by_name(info->partition_name);
- if (partition == NULL) {
- return -1;
- }
- return mtd_mount_partition(partition, info->mount_point,
- info->filesystem, 0);
- }
-
- if (info->device == g_mmc_device) {
- if (info->partition_name == NULL) {
- return -1;
- }
-//TODO: make the mtd stuff scan once when it needs to
- mmc_scan_partitions();
- const MmcPartition *partition;
- partition = mmc_find_partition_by_name(info->partition_name);
- if (partition == NULL) {
- return -1;
- }
- return mmc_mount_partition(partition, info->mount_point, 0);
- }
-
if (info->device == NULL || info->mount_point == NULL ||
info->filesystem == NULL ||
info->filesystem == g_raw ||
@@ -276,6 +245,13 @@
return -1;
}
+ if (info->device == g_default_device) {
+ if (info->partition_name == NULL) {
+ return -1;
+ }
+ return mount_partition(info->partition_name, info->mount_point, info->filesystem, 0);
+ }
+
mkdir(info->mount_point, 0755); // in case it doesn't already exist
if (mount_internal(info->device, info->mount_point, info->filesystem, info->filesystem_options)) {
if (info->device2 == NULL) {
@@ -322,11 +298,24 @@
return unmount_mounted_volume(volume);
}
+int
+get_root_partition_device(const char *root_path, char *device)
+{
+ const RootInfo *info = get_root_info_for_path(root_path);
+ if (info == NULL || info->device != g_default_device ||
+ info->partition_name == NULL)
+ {
+ return NULL;
+ }
+ return get_partition_device(info->partition_name, device);
+}
+
+#ifndef BOARD_HAS_NO_MISC_PARTITION
const MtdPartition *
get_root_mtd_partition(const char *root_path)
{
const RootInfo *info = get_root_info_for_path(root_path);
- if (info == NULL || info->device != g_mtd_device ||
+ if (info == NULL || info->device != g_default_device ||
info->partition_name == NULL)
{
#ifdef BOARD_HAS_MTD_CACHE
@@ -339,19 +328,7 @@
mtd_scan_partitions();
return mtd_find_partition_by_name(info->partition_name);
}
-
-const MmcPartition *
-get_root_mmc_partition(const char *root_path)
-{
- const RootInfo *info = get_root_info_for_path(root_path);
- if (info == NULL || info->device != g_mmc_device ||
- info->partition_name == NULL)
- {
- return NULL;
- }
- mmc_scan_partitions();
- return mmc_find_partition_by_name(info->partition_name);
-}
+#endif
int
format_root_device(const char *root)
@@ -375,7 +352,8 @@
LOGW("format_root_device: can't resolve \"%s\"\n", root);
return -1;
}
- if (info->mount_point != NULL && (info->device == g_mtd_device || info->device == g_mmc_device)) {
+
+ if (info->mount_point != NULL && info->device == g_default_device) {
/* Don't try to format a mounted device.
*/
int ret = ensure_root_path_unmounted(root);
@@ -387,52 +365,17 @@
/* Format the device.
*/
- if (info->device == g_mtd_device) {
- mtd_scan_partitions();
- const MtdPartition *partition;
- partition = mtd_find_partition_by_name(info->partition_name);
- if (partition == NULL) {
- LOGW("format_root_device: can't find mtd partition \"%s\"\n",
- info->partition_name);
- return -1;
- }
- if (info->filesystem == g_raw || !strcmp(info->filesystem, "yaffs2")) {
- MtdWriteContext *write = mtd_write_partition(partition);
- if (write == NULL) {
- LOGW("format_root_device: can't open \"%s\"\n", root);
- return -1;
- } else if (mtd_erase_blocks(write, -1) == (off_t) -1) {
- LOGW("format_root_device: can't erase \"%s\"\n", root);
- mtd_write_close(write);
- return -1;
- } else if (mtd_write_close(write)) {
- LOGW("format_root_device: can't close \"%s\"\n", root);
- return -1;
- } else {
- return 0;
- }
- }
+ if (info->device == g_default_device) {
+ int ret = 0;
+ if (info->filesystem == g_raw)
+ ret = erase_raw_partition(info->partition_name);
+ else
+ ret = erase_partition(info->partition_name, info->filesystem);
+
+ if (ret != 0)
+ LOGE("Error erasing device %s\n", info->device);
+ return ret;
}
- //Handle MMC device types
- if(info->device == g_mmc_device) {
- mmc_scan_partitions();
- const MmcPartition *partition;
- partition = mmc_find_partition_by_name(info->partition_name);
- if (partition == NULL) {
- LOGE("format_root_device: can't find mmc partition \"%s\"\n",
- info->partition_name);
- return -1;
- }
- if (!strcmp(info->filesystem, "ext3")) {
- if(0 == mmc_format_ext3(partition))
- return 0;
- LOGE("\n\"%s\" wipe failed!\n", info->partition_name);
- return -1;
- }
- LOGW("\n\"%s\" wipe skipped!\n", info->partition_name);
- return 0;
- }
-
- return format_non_mtd_device(root);
+ return format_unknown_device(root);
}