diff options
Diffstat (limited to 'fastboot/engine.cpp')
-rw-r--r-- | fastboot/engine.cpp | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/fastboot/engine.cpp b/fastboot/engine.cpp index 9f7d22657..bf887c9e9 100644 --- a/fastboot/engine.cpp +++ b/fastboot/engine.cpp @@ -44,6 +44,7 @@ #define OP_NOTICE 4 #define OP_DOWNLOAD_SPARSE 5 #define OP_WAIT_FOR_DISCONNECT 6 +#define OP_DOWNLOAD_FD 7 typedef struct Action Action; @@ -56,6 +57,7 @@ struct Action { char cmd[CMD_SIZE]; const char* prod; void* data; + int fd; // The protocol only supports 32-bit sizes, so you'll have to break // anything larger into chunks. @@ -142,7 +144,20 @@ void fb_queue_erase(const char *ptn) a->msg = mkmsg("erasing '%s'", ptn); } -void fb_queue_flash(const char *ptn, void *data, unsigned sz) +void fb_queue_flash_fd(const char *ptn, int fd, uint32_t sz) +{ + Action *a; + + a = queue_action(OP_DOWNLOAD_FD, ""); + a->fd = fd; + a->size = sz; + a->msg = mkmsg("sending '%s' (%d KB)", ptn, sz / 1024); + + a = queue_action(OP_COMMAND, "flash:%s", ptn); + a->msg = mkmsg("writing '%s'", ptn); +} + +void fb_queue_flash(const char *ptn, void *data, uint32_t sz) { Action *a; @@ -155,7 +170,7 @@ void fb_queue_flash(const char *ptn, void *data, unsigned sz) a->msg = mkmsg("writing '%s'", ptn); } -void fb_queue_flash_sparse(const char* ptn, struct sparse_file* s, unsigned sz, size_t current, +void fb_queue_flash_sparse(const char* ptn, struct sparse_file* s, uint32_t sz, size_t current, size_t total) { Action *a; @@ -282,7 +297,7 @@ static int cb_save(Action* a, int status, const char* resp) { return 0; } -void fb_queue_query_save(const char *var, char *dest, unsigned dest_size) +void fb_queue_query_save(const char *var, char *dest, uint32_t dest_size) { Action *a; a = queue_action(OP_QUERY, "getvar:%s", var); @@ -309,7 +324,7 @@ void fb_queue_command(const char *cmd, const char *msg) a->msg = msg; } -void fb_queue_download(const char *name, void *data, unsigned size) +void fb_queue_download(const char *name, void *data, uint32_t size) { Action *a = queue_action(OP_DOWNLOAD, ""); a->data = data; @@ -351,6 +366,10 @@ int64_t fb_execute_queue(Transport* transport) status = fb_download_data(transport, a->data, a->size); status = a->func(a, status, status ? fb_get_error().c_str() : ""); if (status) break; + } else if (a->op == OP_DOWNLOAD_FD) { + status = fb_download_data_fd(transport, a->fd, a->size); + status = a->func(a, status, status ? fb_get_error().c_str() : ""); + if (status) break; } else if (a->op == OP_COMMAND) { status = fb_command(transport, a->cmd); status = a->func(a, status, status ? fb_get_error().c_str() : ""); |