summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJP Abgrall <jpa@google.com>2013-06-25 11:52:05 -0700
committerJP Abgrall <jpa@google.com>2013-06-25 11:52:05 -0700
commit6f1cd0b2ad7a16d4ec0b5324f992cae33dc34f34 (patch)
treebc398f2ce54a1300ea49d040c57661b25884f62e
parent25383a5da2ce4ada76df46e1bc7ae56ac0e41fc4 (diff)
downloadsystem_core-6f1cd0b2ad7a16d4ec0b5324f992cae33dc34f34.zip
system_core-6f1cd0b2ad7a16d4ec0b5324f992cae33dc34f34.tar.gz
system_core-6f1cd0b2ad7a16d4ec0b5324f992cae33dc34f34.tar.bz2
fastboot: add preflash command to help with large downloads+flash
Without the partition name, the bootloader would have to store all of the data until the next flash command, which potentially wastes time. To help the bootloader deal with the data more efficiently, we now issue a flashing hint ("preflash:%s", partname). "preflash:" is used to indicate that the following download should ignore any previous "preflash:%s". Bug: 6045918 Change-Id: I4e9708f64f28a4781bde14eb3714d36b281ec5be
-rw-r--r--fastboot/engine.c13
-rw-r--r--fastboot/fastboot_protocol.txt18
2 files changed, 21 insertions, 10 deletions
diff --git a/fastboot/engine.c b/fastboot/engine.c
index 8d46991..4045759 100644
--- a/fastboot/engine.c
+++ b/fastboot/engine.c
@@ -76,6 +76,7 @@ char *mkmsg(const char *fmt, ...)
#define OP_NOTICE 4
#define OP_FORMAT 5
#define OP_DOWNLOAD_SPARSE 6
+#define OP_COMMAND_IGNORE_FAIL 7
typedef struct Action Action;
@@ -374,6 +375,8 @@ int fb_format(Action *a, usb_handle *usb, int skip_if_not_supported)
// Following piece of code is similar to fb_queue_flash() but executes
// actions directly without queuing
+ snprintf(cmd, sizeof(cmd), "preflash:%s", partition);
+ fb_command(usb, cmd); /* Ignore status */
fprintf(stderr, "sending '%s' (%lli KB)...\n", partition, image.image_size/1024);
status = fb_download_data(usb, image.buffer, image.image_size);
if (status) goto cleanup;
@@ -402,6 +405,8 @@ void fb_queue_flash(const char *ptn, void *data, unsigned sz)
{
Action *a;
+ a = queue_action(OP_COMMAND_IGNORE_FAIL, "preflash:%s", ptn);
+ a->msg = mkmsg("prep for '%s' (%d KB)", ptn, sz / 1024);
a = queue_action(OP_DOWNLOAD, "");
a->data = data;
a->size = sz;
@@ -415,6 +420,8 @@ void fb_queue_flash_sparse(const char *ptn, struct sparse_file *s, unsigned sz)
{
Action *a;
+ a = queue_action(OP_COMMAND_IGNORE_FAIL, "preflash:%s", ptn);
+ a->msg = mkmsg("prep for sparse '%s' (%d KB)", ptn, sz / 1024);
a = queue_action(OP_DOWNLOAD_SPARSE, "");
a->data = s;
a->size = 0;
@@ -575,7 +582,9 @@ void fb_queue_command(const char *cmd, const char *msg)
void fb_queue_download(const char *name, void *data, unsigned size)
{
- Action *a = queue_action(OP_DOWNLOAD, "");
+ Action *a;
+ a = queue_action(OP_COMMAND_IGNORE_FAIL, "preflash:");
+ a = queue_action(OP_DOWNLOAD, "");
a->data = data;
a->size = size;
a->msg = mkmsg("downloading '%s'", name);
@@ -614,6 +623,8 @@ int fb_execute_queue(usb_handle *usb)
status = fb_command(usb, a->cmd);
status = a->func(a, status, status ? fb_get_error() : "");
if (status) break;
+ } else if (a->op == OP_COMMAND_IGNORE_FAIL) {
+ fb_command(usb, a->cmd); /* Ignore status */
} else if (a->op == OP_QUERY) {
status = fb_command_response(usb, a->cmd, resp);
status = a->func(a, status, status ? fb_get_error() : resp);
diff --git a/fastboot/fastboot_protocol.txt b/fastboot/fastboot_protocol.txt
index 2248992..eede5d1 100644
--- a/fastboot/fastboot_protocol.txt
+++ b/fastboot/fastboot_protocol.txt
@@ -1,5 +1,5 @@
-FastBoot Version 0.4
+FastBoot Version 0.4++
----------------------
The fastboot protocol is a mechanism for communicating with bootloaders
@@ -67,10 +67,6 @@ Transport and Framing
Example Session
---------------
-Host: "getvar:version" request version variable
-
-Client: "OKAY0.4" return version "0.4"
-
Host: "getvar:nonexistant" request some undefined variable
Client: "OKAY" return value ""
@@ -123,6 +119,11 @@ Command Reference
"flash:%s" Write the previously downloaded image to the
named partition (if possible).
+ "preflash:%s" Optionally prepare for a download + flash.
+ E.g. flash directly during download. To deal with a
+ failed "flash" followed by a "boot", we send
+ "preflash:".
+
"erase:%s" Erase the indicated partition (clear to 0xFFs)
"boot" The previously downloaded data is a boot.img
@@ -140,7 +141,9 @@ Command Reference
"powerdown" Power off the device.
-
+* Note about sparse files
+ Large files can be split up using libsparse, and sent to the bootloader
+ as repeated chunks of "download:%08x" + "flash:%s".
Client Variables
----------------
@@ -151,9 +154,6 @@ on it.
The various currently defined names are:
- version Version of FastBoot protocol supported.
- It should be "0.3" for this document.
-
version-bootloader Version string for the Bootloader.
version-baseband Version string of the Baseband Software