diff --git a/Android.mk b/Android.mk index 80fa6d3..4786c79 100644 --- a/Android.mk +++ b/Android.mk @@ -44,7 +44,7 @@ LOCAL_MODULE := recovery LOCAL_FORCE_STATIC_EXECUTABLE := true -RECOVERY_VERSION := ClockworkMod Recovery v2.5.1.1 +RECOVERY_VERSION := ClockworkMod Recovery v2.5.1.2 LOCAL_CFLAGS += -DRECOVERY_VERSION="$(RECOVERY_VERSION)" RECOVERY_API_VERSION := 2 LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION) diff --git a/extendedcommands.c b/extendedcommands.c index d70e0fd..cc7fb01 100644 --- a/extendedcommands.c +++ b/extendedcommands.c @@ -34,6 +34,7 @@ #include "amend/amend.h" #include "mtdutils/mtdutils.h" +#include "mmcutils/mmcutils.h" #include "mtdutils/dump_image.h" #include "../../external/yaffs2/yaffs2/utils/mkyaffs2image.h" #include "../../external/yaffs2/yaffs2/utils/unyaffs.h" @@ -924,7 +925,15 @@ void write_fstab_root(char *root_path, FILE *file) } else { - fprintf(file, "%s ", info->device); + MmcPartition *mmc = get_root_mmc_partition(root_path); + if (mmc != NULL) + { + fprintf(file, "%s ", mmc->device_index); + } + else + { + fprintf(file, "%s ", info->device); + } } fprintf(file, "%s ", info->mount_point); diff --git a/mmcutils/mmcutils.c b/mmcutils/mmcutils.c index d7e459a..f7df95d 100644 --- a/mmcutils/mmcutils.c +++ b/mmcutils/mmcutils.c @@ -47,16 +47,6 @@ char *ext3_partitions[] = {"system", "userdata", "cache", "NONE"}; unsigned vfat_count = 0; char *vfat_partitions[] = {"modem", "NONE"}; -struct MmcPartition { - char *device_index; - char *filesystem; - char *name; - unsigned dstatus; - unsigned dtype ; - unsigned dfirstsec; - unsigned dsize; -}; - typedef struct { MmcPartition *partitions; int partitions_allocd; @@ -80,6 +70,10 @@ mmc_partition_name (MmcPartition *mbr, unsigned int type) { sprintf(name,"boot"); mbr->name = strdup(name); break; + case MMC_RECOVERY_TYPE: + sprintf(name,"recovery"); + mbr->name = strdup(name); + break; case MMC_EXT3_TYPE: if (strcmp("NONE", ext3_partitions[ext3_count])) { strcpy((char *)name,(const char *)ext3_partitions[ext3_count]); @@ -291,9 +285,9 @@ mmc_find_partition_by_name(const char *name) return NULL; } -#define MKE2FS_BIN "/sbin/mke2fs_static" -#define TUNE2FS_BIN "/sbin/tune2fs_static" -#define E2FSCK_BIN "/sbin/e2fsck_static" +#define MKE2FS_BIN "/sbin/mke2fs" +#define TUNE2FS_BIN "/sbin/tune2fs" +#define E2FSCK_BIN "/sbin/e2fsck" static int run_exec_process ( char **argv) { @@ -323,7 +317,7 @@ mmc_format_ext3 (MmcPartition *partition) { return -1; // Run tune2fs - char *const tune2fs[] = {TUNE2FS_BIN, "-C", "1", device, NULL}; + char *const tune2fs[] = {TUNE2FS_BIN, "-j", "-C", "1", device, NULL}; if(run_exec_process(tune2fs)) return -1; @@ -413,3 +407,55 @@ ERROR3: } + +int +mmc_raw_dump (const MmcPartition *partition, char *out_file) { + int ch; + FILE *in; + FILE *out; + int val = 0; + char buf[512]; + unsigned sz = 0; + unsigned i; + int ret = -1; + char *in_file = partition->device_index; + + in = fopen ( in_file, "r" ); + if (in == NULL) + goto ERROR3; + + out = fopen ( out_file, "w" ); + if (out == NULL) + goto ERROR2; + + fseek(in, 0L, SEEK_END); + sz = ftell(in); + fseek(in, 0L, SEEK_SET); + + if (sz % 512) + { + while ( ( ch = fgetc ( in ) ) != EOF ) + fputc ( ch, out ); + } + else + { + for (i=0; i< (sz/512); i++) + { + if ((fread(buf, 512, 1, in)) != 1) + goto ERROR1; + if ((fwrite(buf, 512, 1, out)) != 1) + goto ERROR1; + } + } + + fsync(out); + ret = 0; +ERROR1: + fclose ( out ); +ERROR2: + fclose ( in ); +ERROR3: + return ret; + +} + diff --git a/mmcutils/mmcutils.h b/mmcutils/mmcutils.h index bab494a..6a3070d 100644 --- a/mmcutils/mmcutils.h +++ b/mmcutils/mmcutils.h @@ -50,6 +50,7 @@ #define MMC_BOOT_TYPE 0x48 #define MMC_SYSTEM_TYPE 0x82 #define MMC_USERDATA_TYPE 0x83 +#define MMC_RECOVERY_TYPE 0x71 #define MMC_RCA 2 @@ -70,7 +71,15 @@ #define MMC_BOOT_TYPE 0x48 #define MMC_EXT3_TYPE 0x83 #define MMC_VFAT_TYPE 0xC -typedef struct MmcPartition MmcPartition; +typedef struct MmcPartition { + char *device_index; + char *filesystem; + char *name; + unsigned dstatus; + unsigned dtype ; + unsigned dfirstsec; + unsigned dsize; +} MmcPartition; /* Functions */ int mmc_scan_partitions(); @@ -79,6 +88,7 @@ int mmc_format_ext3 (MmcPartition *partition); int mmc_mount_partition(const MmcPartition *partition, const char *mount_point, \ int read_only); int mmc_raw_copy (const MmcPartition *partition, char *in_file); +int mmc_raw_dump (const MmcPartition *partition, char *out_file); #endif // MMCUTILS_H_ diff --git a/nandroid.c b/nandroid.c index b47a269..dae3713 100644 --- a/nandroid.c +++ b/nandroid.c @@ -34,6 +34,7 @@ #include "amend/amend.h" #include "mtdutils/dump_image.h" +#include "mmcutils/mmcutils.h" #include "../../external/yaffs2/yaffs2/utils/mkyaffs2image.h" #include "../../external/yaffs2/yaffs2/utils/unyaffs.h" @@ -42,7 +43,22 @@ #include "extendedcommands.h" #include "nandroid.h" -#ifndef BOARD_USES_BMLUTILS +#ifdef BOARD_USES_BMLUTILS +#elif BOARD_USES_MMCUTILS +int write_raw_image(const char* partition, const char* filename) { + mmc_scan_partitions(); + const MmcPartition *p; + p = mmc_find_partition_by_name(partition); + return mmc_raw_copy (p, filename); +} + +int read_raw_image(const char* partition, const char* filename) { + mmc_scan_partitions(); + const MmcPartition *p; + p = mmc_find_partition_by_name(partition); + return mmc_raw_dump (p, filename); +} +#else int write_raw_image(const char* partition, const char* filename) { char tmp[PATH_MAX]; sprintf(tmp, "flash_image boot %s", filename); diff --git a/roots.c b/roots.c index c7bd16d..92b89a4 100644 --- a/roots.c +++ b/roots.c @@ -42,19 +42,19 @@ static const char g_raw[] = "@\0g_raw"; static const char g_package_file[] = "@\0g_package_file"; static RootInfo g_roots[] = { - { "BOOT:", g_mtd_device, NULL, "boot", NULL, g_raw, NULL }, + { "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 }, #endif - { "MISC:", g_mtd_device, NULL, "misc", NULL, g_raw, NULL }, + { "MISC:", DEFAULT_DEVICE, NULL, "misc", NULL, g_raw, NULL }, { "PACKAGE:", NULL, NULL, NULL, NULL, g_package_file, NULL }, - { "RECOVERY:", g_mtd_device, NULL, "recovery", "/", g_raw, 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:", g_mtd_device, NULL, "mbm", NULL, g_raw, NULL }, + { "MBM:", 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])) @@ -255,6 +255,20 @@ ensure_root_path_mounted(const char *root_path) 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 || @@ -326,6 +340,19 @@ get_root_mtd_partition(const char *root_path) 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); +} + int format_root_device(const char *root) { @@ -348,7 +375,7 @@ format_root_device(const char *root) LOGW("format_root_device: can't resolve \"%s\"\n", root); return -1; } - if (info->mount_point != NULL && info->device == g_mtd_device) { + if (info->mount_point != NULL && (info->device == g_mtd_device || info->device == g_mmc_device)) { /* Don't try to format a mounted device. */ int ret = ensure_root_path_unmounted(root); @@ -398,9 +425,13 @@ format_root_device(const char *root) return -1; } if (!strcmp(info->filesystem, "ext3")) { - if(mmc_format_ext3(partition)) - LOGE("\n\"%s\" wipe failed!\n", info->partition_name); + 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); diff --git a/roots.h b/roots.h index 5018e9f..ee78363 100644 --- a/roots.h +++ b/roots.h @@ -20,11 +20,14 @@ #include "minzip/Zip.h" #include "mtdutils/mtdutils.h" +#include "mmcutils/mmcutils.h" -#ifndef BOARD_USES_BMLUTILS +#ifndef BOARD_USES_MMCUTILS #define DEFAULT_DEVICE g_mtd_device +#define DEFAULT_FILESYSTEM "yaffs2" #else #define DEFAULT_DEVICE g_mmc_device +#define DEFAULT_FILESYSTEM "ext3" #endif #ifndef SDCARD_DEVICE_PRIMARY @@ -48,7 +51,7 @@ #endif #ifndef DATA_FILESYSTEM -#define DATA_FILESYSTEM "yaffs2" +#define DATA_FILESYSTEM DEFAULT_FILESYSTEM #endif #ifndef DATADATA_DEVICE @@ -56,7 +59,7 @@ #endif #ifndef DATADATA_FILESYSTEM -#define DATADATA_FILESYSTEM "yaffs2" +#define DATADATA_FILESYSTEM DEFAULT_FILESYSTEM #endif #ifndef CACHE_DEVICE @@ -64,7 +67,7 @@ #endif #ifndef CACHE_FILESYSTEM -#define CACHE_FILESYSTEM "yaffs2" +#define CACHE_FILESYSTEM DEFAULT_FILESYSTEM #endif #ifndef SYSTEM_DEVICE @@ -72,7 +75,7 @@ #endif #ifndef SYSTEM_FILESYSTEM -#define SYSTEM_FILESYSTEM "yaffs2" +#define SYSTEM_FILESYSTEM DEFAULT_FILESYSTEM #endif #ifndef DATA_FILESYSTEM_OPTIONS @@ -126,6 +129,7 @@ int ensure_root_path_mounted(const char *root_path); int ensure_root_path_unmounted(const char *root_path); const MtdPartition *get_root_mtd_partition(const char *root_path); +const MmcPartition *get_root_mmc_partition(const char *root_path); /* "root" must be the exact name of the root; no relative path is permitted. * If the named root is mounted, this will attempt to unmount it first.