diff options
-rw-r--r-- | Android.mk | 3 | ||||
-rw-r--r-- | bootloader.c | 249 | ||||
-rw-r--r-- | bootloader.h | 16 | ||||
-rw-r--r-- | common.h | 7 | ||||
-rw-r--r-- | firmware.c | 132 | ||||
-rw-r--r-- | firmware.h | 36 | ||||
-rw-r--r-- | install.c | 91 | ||||
-rw-r--r-- | recovery.c | 11 | ||||
-rw-r--r-- | res/images/icon_firmware_error.png | bin | 8088 -> 0 bytes | |||
-rwxr-xr-x | res/images/icon_firmware_install.png | bin | 12717 -> 0 bytes | |||
-rw-r--r-- | ui.c | 21 | ||||
-rw-r--r-- | updater/install.c | 39 | ||||
-rw-r--r-- | updater/updater.c | 9 | ||||
-rw-r--r-- | updater/updater.h | 1 |
14 files changed, 16 insertions, 599 deletions
@@ -9,7 +9,6 @@ commands_recovery_local_path := $(LOCAL_PATH) LOCAL_SRC_FILES := \ recovery.c \ bootloader.c \ - firmware.c \ install.c \ roots.c \ ui.c \ @@ -22,7 +21,7 @@ LOCAL_MODULE := recovery LOCAL_FORCE_STATIC_EXECUTABLE := true -RECOVERY_API_VERSION := 2 +RECOVERY_API_VERSION := 3 LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION) # This binary is in the recovery ramdisk, which is otherwise a copy of root. diff --git a/bootloader.c b/bootloader.c index 61b24e9..38b5651 100644 --- a/bootloader.c +++ b/bootloader.c @@ -119,252 +119,3 @@ int set_bootloader_message(const struct bootloader_message *in) { LOGI("Set boot command \"%s\"\n", in->command[0] != 255 ? in->command : ""); return 0; } - -/* Update Image - * - * - will be stored in the "cache" partition - * - bad blocks will be ignored, like boot.img and recovery.img - * - the first block will be the image header (described below) - * - the size is in BYTES, inclusive of the header - * - offsets are in BYTES from the start of the update header - * - two raw bitmaps will be included, the "busy" and "fail" bitmaps - * - for dream, the bitmaps will be 320x480x16bpp RGB565 - */ - -#define UPDATE_MAGIC "MSM-RADIO-UPDATE" -#define UPDATE_MAGIC_SIZE 16 -#define UPDATE_VERSION 0x00010000 - -struct update_header { - unsigned char MAGIC[UPDATE_MAGIC_SIZE]; - - unsigned version; - unsigned size; - - unsigned image_offset; - unsigned image_length; - - unsigned bitmap_width; - unsigned bitmap_height; - unsigned bitmap_bpp; - - unsigned busy_bitmap_offset; - unsigned busy_bitmap_length; - - unsigned fail_bitmap_offset; - unsigned fail_bitmap_length; -}; - -#define LOG_MAGIC "LOGmagic" -#define LOG_MAGIC_SIZE 8 - -int write_update_for_bootloader( - const char *update, int update_length, - int bitmap_width, int bitmap_height, int bitmap_bpp, - const char *busy_bitmap, const char *fail_bitmap, - const char *log_filename) { - if (ensure_root_path_unmounted(CACHE_NAME)) { - LOGE("Can't unmount %s\n", CACHE_NAME); - return -1; - } - - const MtdPartition *part = get_root_mtd_partition(CACHE_NAME); - if (part == NULL) { - LOGE("Can't find %s\n", CACHE_NAME); - return -1; - } - - MtdWriteContext *write = mtd_write_partition(part); - if (write == NULL) { - LOGE("Can't open %s\n(%s)\n", CACHE_NAME, strerror(errno)); - return -1; - } - - /* Write an invalid (zero) header first, to disable any previous - * update and any other structured contents (like a filesystem), - * and as a placeholder for the amount of space required. - */ - - struct update_header header; - memset(&header, 0, sizeof(header)); - const ssize_t header_size = sizeof(header); - if (mtd_write_data(write, (char*) &header, header_size) != header_size) { - LOGE("Can't write header to %s\n(%s)\n", CACHE_NAME, strerror(errno)); - mtd_write_close(write); - return -1; - } - - /* Write each section individually block-aligned, so we can write - * each block independently without complicated buffering. - */ - - memcpy(&header.MAGIC, UPDATE_MAGIC, UPDATE_MAGIC_SIZE); - header.version = UPDATE_VERSION; - header.size = header_size; - - if (log_filename != NULL) { - // Write 1 byte into the following block, then fill to the end - // in order to reserve that block. We'll use the block to - // send a copy of the log through to the next invocation of - // recovery. We write the log as late as possible in order to - // capture any messages emitted by this function. - mtd_erase_blocks(write, 0); - if (mtd_write_data(write, (char*) &header, 1) != 1) { - LOGE("Can't write log block to %s\n(%s)\n", - CACHE_NAME, strerror(errno)); - mtd_write_close(write); - return -1; - } - } - - off_t image_start_pos = mtd_erase_blocks(write, 0); - header.image_length = update_length; - if ((int) header.image_offset == -1 || - mtd_write_data(write, update, update_length) != update_length) { - LOGE("Can't write update to %s\n(%s)\n", CACHE_NAME, strerror(errno)); - mtd_write_close(write); - return -1; - } - off_t busy_start_pos = mtd_erase_blocks(write, 0); - header.image_offset = mtd_find_write_start(write, image_start_pos); - - header.bitmap_width = bitmap_width; - header.bitmap_height = bitmap_height; - header.bitmap_bpp = bitmap_bpp; - - int bitmap_length = (bitmap_bpp + 7) / 8 * bitmap_width * bitmap_height; - - header.busy_bitmap_length = busy_bitmap != NULL ? bitmap_length : 0; - if ((int) header.busy_bitmap_offset == -1 || - mtd_write_data(write, busy_bitmap, bitmap_length) != bitmap_length) { - LOGE("Can't write bitmap to %s\n(%s)\n", CACHE_NAME, strerror(errno)); - mtd_write_close(write); - return -1; - } - off_t fail_start_pos = mtd_erase_blocks(write, 0); - header.busy_bitmap_offset = mtd_find_write_start(write, busy_start_pos); - - header.fail_bitmap_length = fail_bitmap != NULL ? bitmap_length : 0; - if ((int) header.fail_bitmap_offset == -1 || - mtd_write_data(write, fail_bitmap, bitmap_length) != bitmap_length) { - LOGE("Can't write bitmap to %s\n(%s)\n", CACHE_NAME, strerror(errno)); - mtd_write_close(write); - return -1; - } - mtd_erase_blocks(write, 0); - header.fail_bitmap_offset = mtd_find_write_start(write, fail_start_pos); - - /* Write the header last, after all the blocks it refers to, so that - * when the magic number is installed everything is valid. - */ - - if (mtd_write_close(write)) { - LOGE("Can't finish writing %s\n(%s)\n", CACHE_NAME, strerror(errno)); - return -1; - } - - write = mtd_write_partition(part); - if (write == NULL) { - LOGE("Can't reopen %s\n(%s)\n", CACHE_NAME, strerror(errno)); - return -1; - } - - if (mtd_write_data(write, (char*) &header, header_size) != header_size) { - LOGE("Can't rewrite header to %s\n(%s)\n", CACHE_NAME, strerror(errno)); - mtd_write_close(write); - return -1; - } - - if (log_filename != NULL) { - size_t erase_size; - if (mtd_partition_info(part, NULL, &erase_size, NULL) != 0) { - LOGE("Error reading block size\n(%s)\n", strerror(errno)); - mtd_write_close(write); - return -1; - } - mtd_erase_blocks(write, 0); - - if (erase_size > 0) { - char* log = malloc(erase_size); - FILE* f = fopen(log_filename, "rb"); - // The fseek() may fail if it tries to go before the - // beginning of the log, but that's okay because we want - // to be positioned at the start anyway. - fseek(f, -(erase_size-sizeof(size_t)-LOG_MAGIC_SIZE), SEEK_END); - memcpy(log, LOG_MAGIC, LOG_MAGIC_SIZE); - size_t read = fread(log+sizeof(size_t)+LOG_MAGIC_SIZE, - 1, erase_size-sizeof(size_t)-LOG_MAGIC_SIZE, f); - LOGI("read %d bytes from log\n", (int)read); - *(size_t *)(log + LOG_MAGIC_SIZE) = read; - fclose(f); - if (mtd_write_data(write, log, erase_size) != erase_size) { - LOGE("failed to store log in cache partition\n(%s)\n", - strerror(errno)); - mtd_write_close(write); - } - free(log); - } - } - - if (mtd_erase_blocks(write, 0) != image_start_pos) { - LOGE("Misalignment rewriting %s\n(%s)\n", CACHE_NAME, strerror(errno)); - mtd_write_close(write); - return -1; - } - - if (mtd_write_close(write)) { - LOGE("Can't finish header of %s\n(%s)\n", CACHE_NAME, strerror(errno)); - return -1; - } - - return 0; -} - -void recover_firmware_update_log() { - printf("recovering log from before firmware update\n"); - - const MtdPartition *part = get_root_mtd_partition(CACHE_NAME); - if (part == NULL) { - LOGE("Can't find %s\n", CACHE_NAME); - return; - } - - MtdReadContext* read = mtd_read_partition(part); - - size_t erase_size; - if (mtd_partition_info(part, NULL, &erase_size, NULL) != 0) { - LOGE("Error reading block size\n(%s)\n", strerror(errno)); - mtd_read_close(read); - return; - } - - char* buffer = malloc(erase_size); - if (mtd_read_data(read, buffer, erase_size) != erase_size) { - LOGE("Error reading header block\n(%s)\n", strerror(errno)); - mtd_read_close(read); - free(buffer); - return; - } - if (mtd_read_data(read, buffer, erase_size) != erase_size) { - LOGE("Error reading log block\n(%s)\n", strerror(errno)); - mtd_read_close(read); - free(buffer); - return; - } - mtd_read_close(read); - - if (memcmp(buffer, LOG_MAGIC, LOG_MAGIC_SIZE) != 0) { - LOGE("No log from before firmware install\n"); - free(buffer); - return; - } - - size_t log_size = *(size_t *)(buffer + LOG_MAGIC_SIZE); - LOGI("header has %d bytes of log\n", (int)log_size); - - printf("\n###\n### START RECOVERED LOG\n###\n\n"); - fwrite(buffer + sizeof(size_t) + LOG_MAGIC_SIZE, 1, log_size, stdout); - printf("\n\n###\n### END RECOVERED LOG\n###\n\n"); - - free(buffer); -} diff --git a/bootloader.h b/bootloader.h index fec6409..2e749aa 100644 --- a/bootloader.h +++ b/bootloader.h @@ -47,20 +47,4 @@ struct bootloader_message { int get_bootloader_message(struct bootloader_message *out); int set_bootloader_message(const struct bootloader_message *in); -/* Write an update to the cache partition for update-radio or update-hboot. - * Note, this destroys any filesystem on the cache partition! - * The expected bitmap format is 240x320, 16bpp (2Bpp), RGB 5:6:5. - */ -int write_update_for_bootloader( - const char *update, int update_len, - int bitmap_width, int bitmap_height, int bitmap_bpp, - const char *busy_bitmap, const char *error_bitmap, - const char *log_filename); - -/* Look for a log stored in the cache partition in the block after the - * firmware update header. If we can read such a log, copy it to - * stdout (ie, the current log). - */ -void recover_firmware_update_log(); - #endif @@ -49,17 +49,10 @@ enum { BACKGROUND_ICON_NONE, BACKGROUND_ICON_INSTALLING, BACKGROUND_ICON_ERROR, - BACKGROUND_ICON_FIRMWARE_INSTALLING, - BACKGROUND_ICON_FIRMWARE_ERROR, NUM_BACKGROUND_ICONS }; void ui_set_background(int icon); -// Get a malloc'd copy of the screen image showing (only) the specified icon. -// Also returns the width, height, and bits per pixel of the returned image. -// TODO: Use some sort of "struct Bitmap" here instead of all these variables? -char *ui_copy_image(int icon, int *width, int *height, int *bpp); - // Show a progress bar and define the scope of the next operation: // portion - fraction of the progress bar the next operation will use // seconds - expected time interval (progress bar moves at this minimum rate) diff --git a/firmware.c b/firmware.c deleted file mode 100644 index 4c1a9a4..0000000 --- a/firmware.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * 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 "bootloader.h" -#include "common.h" -#include "firmware.h" -#include "roots.h" - -#include <errno.h> -#include <string.h> -#include <sys/reboot.h> - -static const char *update_type = NULL; -static const char *update_data = NULL; -static int update_length = 0; - -int remember_firmware_update(const char *type, const char *data, int length) { - if (update_type != NULL || update_data != NULL) { - LOGE("Multiple firmware images\n"); - return -1; - } - - update_type = type; - update_data = data; - update_length = length; - return 0; -} - -// Return true if there is a firmware update pending. -int firmware_update_pending() { - return update_data != NULL && update_length > 0; -} - -/* Bootloader / Recovery Flow - * - * On every boot, the bootloader will read the bootloader_message - * from flash and check the command field. The bootloader should - * deal with the command field not having a 0 terminator correctly - * (so as to not crash if the block is invalid or corrupt). - * - * The bootloader will have to publish the partition that contains - * the bootloader_message to the linux kernel so it can update it. - * - * if command == "boot-recovery" -> boot recovery.img - * else if command == "update-radio" -> update radio image (below) - * else if command == "update-hboot" -> update hboot image (below) - * else -> boot boot.img (normal boot) - * - * Radio/Hboot Update Flow - * 1. the bootloader will attempt to load and validate the header - * 2. if the header is invalid, status="invalid-update", goto #8 - * 3. display the busy image on-screen - * 4. if the update image is invalid, status="invalid-radio-image", goto #8 - * 5. attempt to update the firmware (depending on the command) - * 6. if successful, status="okay", goto #8 - * 7. if failed, and the old image can still boot, status="failed-update" - * 8. write the bootloader_message, leaving the recovery field - * unchanged, updating status, and setting command to - * "boot-recovery" - * 9. reboot - * - * The bootloader will not modify or erase the cache partition. - * It is recovery's responsibility to clean up the mess afterwards. - */ - -int maybe_install_firmware_update(const char *send_intent, - const char *log_filename) { - if (update_data == NULL || update_length == 0) return 0; - - /* We destroy the cache partition to pass the update image to the - * bootloader, so all we can really do afterwards is wipe cache and reboot. - * Set up this instruction now, in case we're interrupted while writing. - */ - - struct bootloader_message boot; - memset(&boot, 0, sizeof(boot)); - strlcpy(boot.command, "boot-recovery", sizeof(boot.command)); - strlcpy(boot.recovery, "recovery\n--wipe_cache\n", sizeof(boot.command)); - if (send_intent != NULL) { - strlcat(boot.recovery, "--send_intent=", sizeof(boot.recovery)); - strlcat(boot.recovery, send_intent, sizeof(boot.recovery)); - strlcat(boot.recovery, "\n", sizeof(boot.recovery)); - } - if (set_bootloader_message(&boot)) return -1; - - int width = 0, height = 0, bpp = 0; - char *busy_image = ui_copy_image( - BACKGROUND_ICON_FIRMWARE_INSTALLING, &width, &height, &bpp); - char *fail_image = ui_copy_image( - BACKGROUND_ICON_FIRMWARE_ERROR, &width, &height, &bpp); - - ui_print("Writing %s image...\n", update_type); - if (write_update_for_bootloader( - update_data, update_length, - width, height, bpp, busy_image, fail_image, log_filename)) { - LOGE("Can't write %s image\n(%s)\n", update_type, strerror(errno)); - format_root_device("CACHE:"); // Attempt to clean cache up, at least. - return -1; - } - - free(busy_image); - free(fail_image); - - /* The update image is fully written, so now we can instruct the bootloader - * to install it. (After doing so, it will come back here, and we will - * wipe the cache and reboot into the system.) - */ - snprintf(boot.command, sizeof(boot.command), "update-%s", update_type); - if (set_bootloader_message(&boot)) { - format_root_device("CACHE:"); - return -1; - } - - reboot(RB_AUTOBOOT); - - // Can't reboot? WTF? - LOGE("Can't reboot\n"); - return -1; -} diff --git a/firmware.h b/firmware.h deleted file mode 100644 index 04507bb..0000000 --- a/firmware.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * 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. - */ - -#ifndef _RECOVERY_FIRMWARE_H -#define _RECOVERY_FIRMWARE_H - -/* Save a radio or bootloader update image for later installation. - * The type should be one of "hboot" or "radio". - * Takes ownership of type and data. Returns nonzero on error. - */ -int remember_firmware_update(const char *type, const char *data, int length); - -/* Returns true if a firmware update has been saved. */ -int firmware_update_pending(); - -/* If an update was saved, reboot into the bootloader now to install it. - * Returns 0 if no radio image was defined, nonzero on error, - * doesn't return at all on success... - */ -int maybe_install_firmware_update(const char *send_intent, - const char *log_filename); - -#endif @@ -32,71 +32,10 @@ #include "mtdutils/mtdutils.h" #include "roots.h" #include "verifier.h" -#include "firmware.h" #define ASSUMED_UPDATE_BINARY_NAME "META-INF/com/google/android/update-binary" #define PUBLIC_KEYS_FILE "/res/keys" -// The update binary ask us to install a firmware file on reboot. Set -// that up. Takes ownership of type and filename. -static int -handle_firmware_update(char* type, char* filename, ZipArchive* zip) { - unsigned int data_size; - const ZipEntry* entry = NULL; - - if (strncmp(filename, "PACKAGE:", 8) == 0) { - entry = mzFindZipEntry(zip, filename+8); - if (entry == NULL) { - LOGE("Failed to find \"%s\" in package", filename+8); - return INSTALL_ERROR; - } - data_size = entry->uncompLen; - } else { - struct stat st_data; - if (stat(filename, &st_data) < 0) { - LOGE("Error stat'ing %s: %s\n", filename, strerror(errno)); - return INSTALL_ERROR; - } - data_size = st_data.st_size; - } - - LOGI("type is %s; size is %d; file is %s\n", - type, data_size, filename); - - char* data = malloc(data_size); - if (data == NULL) { - LOGI("Can't allocate %d bytes for firmware data\n", data_size); - return INSTALL_ERROR; - } - - if (entry) { - if (mzReadZipEntry(zip, entry, data, data_size) == false) { - LOGE("Failed to read \"%s\" from package", filename+8); - return INSTALL_ERROR; - } - } else { - FILE* f = fopen(filename, "rb"); - if (f == NULL) { - LOGE("Failed to open %s: %s\n", filename, strerror(errno)); - return INSTALL_ERROR; - } - if (fread(data, 1, data_size, f) != data_size) { - LOGE("Failed to read firmware data: %s\n", strerror(errno)); - return INSTALL_ERROR; - } - fclose(f); - } - - if (remember_firmware_update(type, data, data_size)) { - LOGE("Can't store %s image\n", type); - free(data); - return INSTALL_ERROR; - } - free(filename); - - return INSTALL_SUCCESS; -} - // If the package contains an update binary, extract it and run it. static int try_update_binary(const char *path, ZipArchive *zip) { @@ -145,9 +84,12 @@ try_update_binary(const char *path, ZipArchive *zip) { // // firmware <"hboot"|"radio"> <filename> // arrange to install the contents of <filename> in the - // given partition on reboot. (API v2: <filename> may - // start with "PACKAGE:" to indicate taking a file from - // the OTA package.) + // given partition on reboot. + // + // (API v2: <filename> may start with "PACKAGE:" to + // indicate taking a file from the OTA package.) + // + // (API v3: this command no longer exists.) // // ui_print <string> // display <string> on the screen. @@ -172,9 +114,6 @@ try_update_binary(const char *path, ZipArchive *zip) { } close(pipefd[1]); - char* firmware_type = NULL; - char* firmware_filename = NULL; - char buffer[1024]; FILE* from_child = fdopen(pipefd[0], "r"); while (fgets(buffer, sizeof(buffer), from_child) != NULL) { @@ -194,18 +133,6 @@ try_update_binary(const char *path, ZipArchive *zip) { char* fraction_s = strtok(NULL, " \n"); float fraction = strtof(fraction_s, NULL); ui_set_progress(fraction); - } else if (strcmp(command, "firmware") == 0) { - char* type = strtok(NULL, " \n"); - char* filename = strtok(NULL, " \n"); - - if (type != NULL && filename != NULL) { - if (firmware_type != NULL) { - LOGE("ignoring attempt to do multiple firmware updates"); - } else { - firmware_type = strdup(type); - firmware_filename = strdup(filename); - } - } } else if (strcmp(command, "ui_print") == 0) { char* str = strtok(NULL, "\n"); if (str) { @@ -226,11 +153,7 @@ try_update_binary(const char *path, ZipArchive *zip) { return INSTALL_ERROR; } - if (firmware_type != NULL) { - return handle_firmware_update(firmware_type, firmware_filename, zip); - } else { - return INSTALL_SUCCESS; - } + return INSTALL_SUCCESS; } static int @@ -31,7 +31,6 @@ #include "bootloader.h" #include "common.h" #include "cutils/properties.h" -#include "firmware.h" #include "install.h" #include "minui/minui.h" #include "minzip/DirUtil.h" @@ -445,12 +444,7 @@ prompt_and_wait() { } else if (!ui_text_visible()) { return; // reboot if logs aren't visible } else { - if (firmware_update_pending()) { - ui_print("\nReboot via menu to complete\n" - "installation.\n"); - } else { - ui_print("\nInstall from sdcard complete.\n"); - } + ui_print("\nInstall from sdcard complete.\n"); } break; } @@ -563,9 +557,6 @@ main(int argc, char **argv) { if (status != INSTALL_SUCCESS) ui_set_background(BACKGROUND_ICON_ERROR); if (status != INSTALL_SUCCESS || ui_text_visible()) prompt_and_wait(); - // If there is a radio image pending, reboot now to install it. - maybe_install_firmware_update(send_intent, TEMPORARY_LOG_FILE); - // Otherwise, get ready to boot the main system... finish_recovery(send_intent); ui_print("Rebooting...\n"); diff --git a/res/images/icon_firmware_error.png b/res/images/icon_firmware_error.png Binary files differdeleted file mode 100644 index 0c32c9e..0000000 --- a/res/images/icon_firmware_error.png +++ /dev/null diff --git a/res/images/icon_firmware_install.png b/res/images/icon_firmware_install.png Binary files differdeleted file mode 100755 index 2da9e5f..0000000 --- a/res/images/icon_firmware_install.png +++ /dev/null @@ -47,10 +47,6 @@ static gr_surface gProgressBarFill; static const struct { gr_surface* surface; const char *name; } BITMAPS[] = { { &gBackgroundIcon[BACKGROUND_ICON_INSTALLING], "icon_installing" }, { &gBackgroundIcon[BACKGROUND_ICON_ERROR], "icon_error" }, - { &gBackgroundIcon[BACKGROUND_ICON_FIRMWARE_INSTALLING], - "icon_firmware_install" }, - { &gBackgroundIcon[BACKGROUND_ICON_FIRMWARE_ERROR], - "icon_firmware_error" }, { &gProgressBarIndeterminate[0], "indeterminate1" }, { &gProgressBarIndeterminate[1], "indeterminate2" }, { &gProgressBarIndeterminate[2], "indeterminate3" }, @@ -341,23 +337,6 @@ void ui_init(void) pthread_create(&t, NULL, input_thread, NULL); } -char *ui_copy_image(int icon, int *width, int *height, int *bpp) { - pthread_mutex_lock(&gUpdateMutex); - draw_background_locked(gBackgroundIcon[icon]); - *width = gr_fb_width(); - *height = gr_fb_height(); - *bpp = sizeof(gr_pixel) * 8; - int size = *width * *height * sizeof(gr_pixel); - char *ret = malloc(size); - if (ret == NULL) { - LOGE("Can't allocate %d bytes for image\n", size); - } else { - memcpy(ret, gr_fb_data(), size); - } - pthread_mutex_unlock(&gUpdateMutex); - return ret; -} - void ui_set_background(int icon) { pthread_mutex_lock(&gUpdateMutex); diff --git a/updater/install.c b/updater/install.c index 934acaa..852b393 100644 --- a/updater/install.c +++ b/updater/install.c @@ -703,44 +703,6 @@ done: return result; } -// write_firmware_image(file, partition) -// -// partition is "radio" or "hboot" -// file is not used until after updater exits -// -// TODO: this should live in some HTC-specific library -char* WriteFirmwareImageFn(const char* name, State* state, - int argc, Expr* argv[]) { - char* result = NULL; - - char* partition; - char* filename; - if (ReadArgs(state, argv, 2, &filename, &partition) < 0) { - return NULL; - } - - if (strlen(partition) == 0) { - ErrorAbort(state, "partition argument to %s can't be empty", name); - goto done; - } - if (strlen(filename) == 0) { - ErrorAbort(state, "file argument to %s can't be empty", name); - goto done; - } - - FILE* cmd = ((UpdaterInfo*)(state->cookie))->cmd_pipe; - fprintf(cmd, "firmware %s %s\n", partition, filename); - - printf("will write %s firmware from %s\n", partition, filename); - result = partition; - -done: - if (result != partition) free(partition); - free(filename); - return result; -} - - extern int applypatch(int argc, char** argv); // apply_patch(srcfile, tgtfile, tgtsha1, tgtsize, sha1:patch, ...) @@ -888,7 +850,6 @@ void RegisterInstallFunctions() { RegisterFunction("getprop", GetPropFn); RegisterFunction("file_getprop", FileGetPropFn); RegisterFunction("write_raw_image", WriteRawImageFn); - RegisterFunction("write_firmware_image", WriteFirmwareImageFn); RegisterFunction("apply_patch", ApplyPatchFn); RegisterFunction("apply_patch_check", ApplyPatchFn); diff --git a/updater/updater.c b/updater/updater.c index 1aa277c..2d16dee 100644 --- a/updater/updater.c +++ b/updater/updater.c @@ -39,9 +39,11 @@ int main(int argc, char** argv) { } char* version = argv[1]; - if ((version[0] != '1' && version[0] != '2') || version[1] != '\0') { - // We support version "1" or "2". - fprintf(stderr, "wrong updater binary API; expected 1 or 2, got %s\n", + if ((version[0] != '1' && version[0] != '2' && version[0] != '3') || + version[1] != '\0') { + // We support version 1, 2, or 3. + fprintf(stderr, "wrong updater binary API; expected 1, 2, or 3; " + "got %s\n", argv[1]); return 2; } @@ -100,6 +102,7 @@ int main(int argc, char** argv) { UpdaterInfo updater_info; updater_info.cmd_pipe = cmd_pipe; updater_info.package_zip = &za; + updater_info.version = atoi(version); State state; state.cookie = &updater_info; diff --git a/updater/updater.h b/updater/updater.h index 22fbfd2..bd60dc1 100644 --- a/updater/updater.h +++ b/updater/updater.h @@ -23,6 +23,7 @@ typedef struct { FILE* cmd_pipe; ZipArchive* package_zip; + int version; } UpdaterInfo; #endif |