galaxys
diff --git a/Android.mk b/Android.mk
index 7c843b2..1de07d6 100644
--- a/Android.mk
+++ b/Android.mk
@@ -13,13 +13,27 @@
 	legacy.c \
 	commands.c \
 	recovery.c \
-	bootloader.c \
-	firmware.c \
 	install.c \
 	roots.c \
 	ui.c \
 	verifier.c
 
+ifndef BOARD_HAS_NO_MISC_PARTITION
+    LOCAL_SRC_FILES += \
+        firmware.c \
+        bootloader.c
+else
+    LOCAL_CFLAGS += -DBOARD_HAS_NO_MISC_PARTITION
+endif
+
+ifdef BOARD_USES_FFORMAT
+    LOCAL_CFLAGS += -DBOARD_USES_FFORMAT
+endif
+
+ifdef BOARD_RECOVERY_IGNORE_BOOTABLES
+    LOCAL_CLFAGS += -DBOARD_RECOVERY_IGNORE_BOOTABLES
+endif
+
 LOCAL_SRC_FILES += test_roots.c
 
 LOCAL_MODULE := recovery
@@ -27,7 +41,7 @@
 LOCAL_FORCE_STATIC_EXECUTABLE := true
 
 RECOVERY_VERSION := ClockworkMod Recovery v2.5.0.1
-LOCAL_CFLAGS := -DRECOVERY_VERSION="$(RECOVERY_VERSION)"
+LOCAL_CFLAGS += -DRECOVERY_VERSION="$(RECOVERY_VERSION)"
 RECOVERY_API_VERSION := 2
 LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION)
 
@@ -59,6 +73,14 @@
   LOCAL_CFLAGS += -DDATA_FILESYSTEM=\"$(BOARD_DATA_FILESYSTEM)\"
 endif
 
+ifdef BOARD_DATADATA_DEVICE
+  LOCAL_CFLAGS += -DDATADATA_DEVICE=\"$(BOARD_DATADATA_DEVICE)\"
+endif
+
+ifdef BOARD_DATADATA_FILESYSTEM
+  LOCAL_CFLAGS += -DDATADATA_FILESYSTEM=\"$(BOARD_DATADATA_FILESYSTEM)\"
+endif
+
 ifdef BOARD_CACHE_DEVICE
   LOCAL_CFLAGS += -DCACHE_DEVICE=\"$(BOARD_CACHE_DEVICE)\"
 endif
@@ -67,6 +89,14 @@
   LOCAL_CFLAGS += -DCACHE_FILESYSTEM=\"$(BOARD_CACHE_FILESYSTEM)\"
 endif
 
+ifdef BOARD_SYSTEM_DEVICE
+  LOCAL_CFLAGS += -DSYSTEM_DEVICE=\"$(BOARD_SYSTEM_DEVICE)\"
+endif
+
+ifdef BOARD_SYSTEM_FILESYSTEM
+  LOCAL_CFLAGS += -DSYSTEM_FILESYSTEM=\"$(BOARD_SYSTEM_FILESYSTEM)\"
+endif
+
 ifdef BOARD_HAS_DATADATA
   LOCAL_CFLAGS += -DHAS_DATADATA
 endif
@@ -93,6 +123,7 @@
 include $(BUILD_EXECUTABLE)
 
 RECOVERY_LINKS := amend busybox flash_image dump_image mkyaffs2image unyaffs erase_image nandroid
+
 # nc is provided by external/netcat
 SYMLINKS := $(addprefix $(TARGET_RECOVERY_ROOT_OUT)/sbin/,$(RECOVERY_LINKS))
 $(SYMLINKS): RECOVERY_BINARY := $(LOCAL_MODULE)
@@ -132,6 +163,16 @@
 LOCAL_SRC_FILES := killrecovery.sh
 include $(BUILD_PREBUILT)
 
+ifdef BOARD_USES_FFORMAT
+include $(CLEAR_VARS)
+LOCAL_MODULE := fformat
+LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_SRC_FILES := prebuilt/fformat
+include $(BUILD_PREBUILT)
+endif
+
 include $(commands_recovery_local_path)/amend/Android.mk
 include $(commands_recovery_local_path)/minui/Android.mk
 include $(commands_recovery_local_path)/minzip/Android.mk
diff --git a/commands.c b/commands.c
index 40c4461..8db0aba 100644
--- a/commands.c
+++ b/commands.c
@@ -626,11 +626,13 @@
         return 1;
     }
 
+#ifndef BOARD_HAS_NO_MISC_PARTITION
     if (remember_firmware_update(type, context.data, context.total_bytes)) {
         LOGE("Can't store %s image\n", type);
         free(context.data);
         return 1;
     }
+#endif
 
     return 0;
 }
diff --git a/default_recovery_ui.c b/default_recovery_ui.c
index 8ee1239..09bf19c 100644
--- a/default_recovery_ui.c
+++ b/default_recovery_ui.c
@@ -50,10 +50,12 @@
 int device_handle_key(int key_code, int visible) {
     if (visible) {
         switch (key_code) {
+            case KEY_CAPSLOCK:
             case KEY_DOWN:
             case KEY_VOLUMEDOWN:
                 return HIGHLIGHT_DOWN;
 
+            case KEY_LEFTSHIFT:
             case KEY_UP:
             case KEY_VOLUMEUP:
                 return HIGHLIGHT_UP;
@@ -65,6 +67,7 @@
                 if (!get_allow_toggle_display())
                     return GO_BACK;
                 break;
+            case KEY_LEFTBRACE:
             case KEY_ENTER:
             case BTN_MOUSE:
             case KEY_CENTER:
diff --git a/extendedcommands.c b/extendedcommands.c
index 9310305..fe7de6a 100644
--- a/extendedcommands.c
+++ b/extendedcommands.c
@@ -61,7 +61,9 @@
 int install_zip(const char* packagefilepath)
 {
     ui_print("\n-- Installing: %s\n", packagefilepath);
+#ifndef BOARD_HAS_NO_MISC_PARTITION
     set_sdcard_update_bootloader_message();
+#endif
     int status = install_package(packagefilepath);
     ui_reset_progress();
     if (status != INSTALL_SUCCESS) {
@@ -69,9 +71,11 @@
         ui_print("Installation aborted.\n");
         return 1;
     } 
+#ifndef BOARD_HAS_NO_MISC_PARTITION
     if (firmware_update_pending()) {
         ui_print("\nReboot via menu to complete\ninstallation.\n");
     }
+#endif
     ui_set_background(BACKGROUND_ICON_NONE);
     ui_print("\nInstall from sdcard complete.\n");
     return 0;
diff --git a/install.c b/install.c
index bbdb854..de3ec73 100644
--- a/install.c
+++ b/install.c
@@ -90,11 +90,13 @@
         fclose(f);
     }
 
+#ifndef BOARD_HAS_NO_MISC_PARTITION
     if (remember_firmware_update(type, data, data_size)) {
         LOGE("Can't store %s image\n", type);
         free(data);
         return INSTALL_ERROR;
     }
+#endif
     free(filename);
 
     return INSTALL_SUCCESS;
diff --git a/killrecovery.sh b/killrecovery.sh
index f215250..2052ef9 100755
--- a/killrecovery.sh
+++ b/killrecovery.sh
@@ -5,4 +5,6 @@
 touch /tmp/.ignorebootmessage
 kill $(ps | grep /sbin/adbd)
 kill $(ps | grep /sbin/recovery)
+
+/sbin/recovery
 exit 1
\ No newline at end of file
diff --git a/nandroid.c b/nandroid.c
index 00afbd9..33899d1 100644
--- a/nandroid.c
+++ b/nandroid.c
@@ -133,6 +133,7 @@
     sprintf(tmp, "mkdir -p %s", backup_path);
     __system(tmp);
 
+#ifndef BOARD_RECOVERY_IGNORE_BOOTABLES
     ui_print("Backing up boot...\n");
     sprintf(tmp, "%s/%s", backup_path, "boot.img");
     ret = dump_image("boot", tmp, NULL);
@@ -143,7 +144,8 @@
     sprintf(tmp, "%s/%s", backup_path, "recovery.img");
     ret = dump_image("recovery", tmp, NULL);
     if (0 != ret)
-        return print_and_error("Error while dumping boot image!\n");
+        return print_and_error("Error while dumping recovery image!\n");
+#endif
 
     if (0 != (ret = nandroid_backup_partition(backup_path, "SYSTEM:")))
         return ret;
@@ -198,13 +200,28 @@
 
 typedef int (*format_function)(char* root);
 
+static void ensure_directory(const char* dir) {
+    char tmp[PATH_MAX];
+    sprintf(tmp, "mkdir -p %s", dir);
+    __system(tmp);
+}
+
 int nandroid_restore_partition_extended(const char* backup_path, const char* root, int umount_when_finished) {
     int ret = 0;
     char mount_point[PATH_MAX];
     translate_root_path(root, mount_point, PATH_MAX);
     char* name = basename(mount_point);
     
+    char tmp[PATH_MAX];
+    sprintf(tmp, "%s/%s.img", backup_path, name);
     struct stat file_info;
+    if (0 != (ret = statfs(tmp, &file_info))) {
+        ui_print("%s.img not found. Skipping restore of /sd-ext.", name);
+        return 0;
+    }
+
+    ensure_directory(mount_point);
+
     unyaffs_callback callback = NULL;
     if (0 != stat("/sdcard/clockworkmod/.hidenandroidprogress", &file_info)) {
         callback = yaffs_callback;
@@ -225,8 +242,6 @@
         return ret;
     }
     
-    char tmp[PATH_MAX];
-    sprintf(tmp, "%s/%s.img", backup_path, name);
     if (0 != (ret = unyaffs(tmp, mount_point, callback))) {
         ui_print("Error while restoring %s!\n", mount_point);
         return ret;
@@ -260,6 +275,7 @@
         return print_and_error("MD5 mismatch!\n");
     
     int ret;
+#ifndef BOARD_RECOVERY_IGNORE_BOOTABLES
     if (restore_boot)
     {
         ui_print("Erasing boot before restore...\n");
@@ -272,6 +288,7 @@
             return ret;
         }
     }
+#endif
     
     if (restore_system && 0 != (ret = nandroid_restore_partition(backup_path, "SYSTEM:")))
         return ret;
@@ -284,34 +301,14 @@
         return ret;
 #endif
 
-    if (restore_data)
-    {
-        struct statfs s;
-        sprintf(tmp, "%s/.android_secure.img", backup_path);
-        if (0 != (ret = statfs(tmp, &s)))
-        {
-            ui_print(".android_secure.img not found. Skipping restore of applications on external storage.");
-        }
-        else
-        {
-            __system("mkdir -p /sdcard/.android_secure");
-            if (0 != (ret = nandroid_restore_partition_extended(backup_path, "SDCARD:/.android_secure", 0)))
-                return ret;
-        }
-    }
+    if (restore_data && 0 != (ret = nandroid_restore_partition_extended(backup_path, "SDCARD:/.android_secure", 0)))
+        return ret;
 
     if (restore_cache && 0 != (ret = nandroid_restore_partition_extended(backup_path, "CACHE:", 0)))
         return ret;
 
-    if (restore_sdext)
-    {
-        struct statfs s;
-        sprintf(tmp, "%s/sd-ext.img", backup_path);
-        if (0 != (ret = statfs(tmp, &s)))
-            ui_print("sd-ext.img not found. Skipping restore of /sd-ext.");
-        else if (0 != (ret = nandroid_restore_partition(backup_path, "SDEXT:")))
-            return ret;
-    }
+    if (restore_sdext && 0 != (ret = nandroid_restore_partition(backup_path, "SDEXT:")))
+        return ret;
 
     sync();
     ui_set_background(BACKGROUND_ICON_NONE);
diff --git a/recovery.c b/recovery.c
index b0123db..fea1e7d 100644
--- a/recovery.c
+++ b/recovery.c
@@ -157,7 +157,9 @@
 get_args(int *argc, char ***argv) {
     struct bootloader_message boot;
     memset(&boot, 0, sizeof(boot));
+#ifndef BOARD_HAS_NO_MISC_PARTITION
     get_bootloader_message(&boot);  // this may fail, leaving a zeroed structure
+#endif
 
     if (boot.command[0] != 0 && boot.command[0] != 255) {
         LOGI("Boot command: %.*s\n", sizeof(boot.command), boot.command);
@@ -214,9 +216,12 @@
         strlcat(boot.recovery, (*argv)[i], sizeof(boot.recovery));
         strlcat(boot.recovery, "\n", sizeof(boot.recovery));
     }
+#ifndef BOARD_HAS_NO_MISC_PARTITION
     set_bootloader_message(&boot);
+#endif
 }
 
+#ifndef BOARD_HAS_NO_MISC_PARTITION
 void
 set_sdcard_update_bootloader_message()
 {
@@ -226,6 +231,7 @@
     strlcpy(boot.recovery, "recovery\n", sizeof(boot.recovery));
     set_bootloader_message(&boot);
 }
+#endif
 
 // clear the recovery command and prepare to boot a (hopefully working) system,
 // copy our log file to cache as well (for the system to read), and
@@ -260,10 +266,12 @@
         check_and_fclose(log, LOG_FILE);
     }
 
+#ifndef BOARD_HAS_NO_MISC_PARTITION
     // Reset the bootloader message to revert to a normal main system boot.
     struct bootloader_message boot;
     memset(&boot, 0, sizeof(boot));
     set_bootloader_message(&boot);
+#endif
 
     // Remove the command file, so recovery won't repeat indefinitely.
     char path[PATH_MAX] = "";
@@ -464,7 +472,9 @@
                 if (confirm_selection("Confirm install?", "Yes - Install /sdcard/update.zip"))
                 {
                     ui_print("\n-- Install from sdcard...\n");
+#ifndef BOARD_HAS_NO_MISC_PARTITION
                     set_sdcard_update_bootloader_message();
+#endif
                     int status = install_package(SDCARD_PACKAGE_FILE);
                     if (status != INSTALL_SUCCESS) {
                         ui_set_background(BACKGROUND_ICON_ERROR);
@@ -472,12 +482,16 @@
                     } else if (!ui_text_visible()) {
                         return;  // reboot if logs aren't visible
                     } else {
+#ifndef BOARD_HAS_NO_MISC_PARTITION
                         if (firmware_update_pending()) {
                             ui_print("\nReboot via menu to complete\n"
                                      "installation.\n");
                         } else {
                             ui_print("\nInstall from sdcard complete.\n");
                         }
+#else
+                        ui_print("\nInstall from sdcard complete.\n");
+#endif
                     }
                 }
                 break;
@@ -524,8 +538,8 @@
             return nandroid_main(argc, argv);
 		return busybox_driver(argc, argv);
 	}
-    create_fstab();
     __system("/sbin/postrecoveryboot.sh");
+    create_fstab();
     
     int is_user_initiated_recovery = 0;
     time_t start = time(NULL);
@@ -614,8 +628,10 @@
     if (status != INSTALL_SUCCESS && !is_user_initiated_recovery) ui_set_background(BACKGROUND_ICON_ERROR);
     if (status != INSTALL_SUCCESS || ui_text_visible()) prompt_and_wait();
 
+#ifndef BOARD_HAS_NO_MISC_PARTITION
     // If there is a radio image pending, reboot now to install it.
     maybe_install_firmware_update(send_intent);
+#endif
 
     // Otherwise, get ready to boot the main system...
     finish_recovery(send_intent);
diff --git a/roots.c b/roots.c
index da10ee7..fc2d177 100644
--- a/roots.c
+++ b/roots.c
@@ -50,7 +50,7 @@
     { "RECOVERY:", g_mtd_device, NULL, "recovery", "/", g_raw },
     { "SDCARD:", SDCARD_DEVICE_PRIMARY, SDCARD_DEVICE_SECONDARY, NULL, "/sdcard", "vfat" },
     { "SDEXT:", SDEXT_DEVICE, NULL, NULL, "/sd-ext", SDEXT_FILESYSTEM },
-    { "SYSTEM:", g_mtd_device, NULL, "system", "/system", "yaffs2" },
+    { "SYSTEM:", SYSTEM_DEVICE, NULL, "system", "/system", SYSTEM_FILESYSTEM },
     { "MBM:", g_mtd_device, NULL, "mbm", NULL, g_raw },
     { "TMP:", NULL, NULL, NULL, "/tmp", NULL },
 };
@@ -378,5 +378,13 @@
         }
     }
 
+#ifdef BOARD_USES_FFORMAT
+    if (info->filesystem != NULL && strcmp("rfs", info->filesystem) == 0) {
+        char cmd[PATH_MAX];
+        sprintf("/sbin/fformat %s", info->device);
+        return __system(cmd);
+    }
+#endif
+
     return format_non_mtd_device(root);
 }
diff --git a/roots.h b/roots.h
index e777093..a75de9c 100644
--- a/roots.h
+++ b/roots.h
@@ -60,6 +60,14 @@
 #define CACHE_FILESYSTEM "yaffs2"
 #endif
 
+#ifndef SYSTEM_DEVICE
+#define SYSTEM_DEVICE g_mtd_device
+#endif
+
+#ifndef SYSTEM_FILESYSTEM
+#define SYSTEM_FILESYSTEM "yaffs2"
+#endif
+
 /* Any of the "root_path" arguments can be paths with relative
  * components, like "SYSTEM:a/b/c".
  */