From 71b3b4349563e2b21329c9e31c314300f8aaeea4 Mon Sep 17 00:00:00 2001 From: Daniel Zheng Date: Mon, 30 Jan 2023 17:43:00 +0000 Subject: [PATCH] Added support for reboot task Test: tested on raven device Change-Id: I4935d720f567e70da95ea8da37f3404b80b313c8 Bug: 194686221 Changed reboot {target} to work off tasks. reboot-{target} commands are also supported. Test: tested reboot on raven device Change-Id: I05aed269d121a5d651c1ab1180a1b4878ae213fd Modified load_buf to be able to find images in $OUT directory Test: tested flash {partition} and flash {partition} {img_name} on raven device Change-Id: I3879792d11ad15bc910670853d2a7fe200fcc66f --- fastboot/fastboot.cpp | 54 ++++++++++++------------------------------- fastboot/task.cpp | 26 +++++++++++++++++++++ fastboot/task.h | 14 +++++++++-- 3 files changed, 53 insertions(+), 41 deletions(-) diff --git a/fastboot/fastboot.cpp b/fastboot/fastboot.cpp index 799c9f911..517253078 100644 --- a/fastboot/fastboot.cpp +++ b/fastboot/fastboot.cpp @@ -1099,7 +1099,9 @@ static bool load_buf(const char* fname, struct fastboot_buffer* buf) { unique_fd fd(TEMP_FAILURE_RETRY(open(fname, O_RDONLY | O_BINARY))); if (fd == -1) { - return false; + auto path = find_item_given_name(fname); + fd = unique_fd(TEMP_FAILURE_RETRY(open(path.c_str(), O_RDONLY | O_BINARY))); + if (fd == -1) return false; } struct stat s; @@ -2143,10 +2145,6 @@ int FastBootTool::Main(int argc, char* argv[]) { android::base::InitLogging(argv, FastbootLogger, FastbootAborter); bool wants_wipe = false; - bool wants_reboot = false; - bool wants_reboot_bootloader = false; - bool wants_reboot_recovery = false; - bool wants_reboot_fastboot = false; bool skip_reboot = false; bool wants_set_active = false; bool skip_secondary = false; @@ -2335,7 +2333,7 @@ int FastBootTool::Main(int argc, char* argv[]) { } } } - + std::unique_ptr reboot_task = nullptr; std::vector args(argv, argv + argc); while (!args.empty()) { std::string command = next_arg(&args); @@ -2387,30 +2385,19 @@ int FastBootTool::Main(int argc, char* argv[]) { fb->Download("signature", data); fb->RawCommand("signature", "installing signature"); } else if (command == FB_CMD_REBOOT) { - wants_reboot = true; - if (args.size() == 1) { - std::string what = next_arg(&args); - if (what == "bootloader") { - wants_reboot = false; - wants_reboot_bootloader = true; - } else if (what == "recovery") { - wants_reboot = false; - wants_reboot_recovery = true; - } else if (what == "fastboot") { - wants_reboot = false; - wants_reboot_fastboot = true; - } else { - syntax_error("unknown reboot target %s", what.c_str()); - } + std::string reboot_target = next_arg(&args); + reboot_task = std::make_unique(fb, reboot_target); + } else { + reboot_task = std::make_unique(fb); } if (!args.empty()) syntax_error("junk after reboot command"); } else if (command == FB_CMD_REBOOT_BOOTLOADER) { - wants_reboot_bootloader = true; + reboot_task = std::make_unique(fb, "bootloader"); } else if (command == FB_CMD_REBOOT_RECOVERY) { - wants_reboot_recovery = true; + reboot_task = std::make_unique(fb, "recovery"); } else if (command == FB_CMD_REBOOT_FASTBOOT) { - wants_reboot_fastboot = true; + reboot_task = std::make_unique(fb, "fastboot"); } else if (command == FB_CMD_CONTINUE) { fb->Continue(); } else if (command == FB_CMD_BOOT) { @@ -2454,7 +2441,7 @@ int FastBootTool::Main(int argc, char* argv[]) { } else { do_flashall(slot_override, skip_secondary, wants_wipe, force_flash); } - wants_reboot = true; + reboot_task = std::make_unique(fb); } else if (command == "update") { bool slot_all = (slot_override == "all"); if (slot_all) { @@ -2466,7 +2453,7 @@ int FastBootTool::Main(int argc, char* argv[]) { filename = next_arg(&args); } do_update(filename.c_str(), slot_override, skip_secondary || slot_all, force_flash); - wants_reboot = true; + reboot_task = std::make_unique(fb); } else if (command == FB_CMD_SET_ACTIVE) { std::string slot = verify_slot(next_arg(&args), false); fb->SetActive(slot); @@ -2538,7 +2525,6 @@ int FastBootTool::Main(int argc, char* argv[]) { syntax_error("unknown command %s", command.c_str()); } } - if (wants_wipe) { if (force_flash) { CancelSnapshotIfNeeded(); @@ -2557,19 +2543,9 @@ int FastBootTool::Main(int argc, char* argv[]) { if (wants_set_active) { fb->SetActive(next_active); } - if (wants_reboot && !skip_reboot) { - fb->Reboot(); - fb->WaitForDisconnect(); - } else if (wants_reboot_bootloader) { - fb->RebootTo("bootloader"); - fb->WaitForDisconnect(); - } else if (wants_reboot_recovery) { - fb->RebootTo("recovery"); - fb->WaitForDisconnect(); - } else if (wants_reboot_fastboot) { - reboot_to_userspace_fastboot(); + if (reboot_task && !skip_reboot) { + reboot_task->Run(); } - fprintf(stderr, "Finished. Total time: %.3fs\n", (now() - start)); auto* old_transport = fb->set_transport(nullptr); diff --git a/fastboot/task.cpp b/fastboot/task.cpp index 3f33c7603..94dd5c32c 100644 --- a/fastboot/task.cpp +++ b/fastboot/task.cpp @@ -14,6 +14,8 @@ // limitations under the License. // #include "task.h" +#include "fastboot.h" +#include "util.h" #include "fastboot.h" #include "util.h" @@ -44,3 +46,27 @@ void FlashTask::Run() { }; do_for_partitions(pname_, slot_, flash, true); } + +RebootTask::RebootTask(fastboot::FastBootDriver* _fb) : fb_(_fb){}; +RebootTask::RebootTask(fastboot::FastBootDriver* _fb, std::string _reboot_target) + : reboot_target_(std::move(_reboot_target)), fb_(_fb){}; + +void RebootTask::Run() { + if ((reboot_target_ == "userspace" || reboot_target_ == "fastboot")) { + if (!is_userspace_fastboot()) { + reboot_to_userspace_fastboot(); + fb_->WaitForDisconnect(); + } + } else if (reboot_target_ == "recovery") { + fb_->RebootTo("recovery"); + fb_->WaitForDisconnect(); + } else if (reboot_target_ == "bootloader") { + fb_->RebootTo("bootloader"); + fb_->WaitForDisconnect(); + } else if (reboot_target_ == "") { + fb_->Reboot(); + fb_->WaitForDisconnect(); + } else { + syntax_error("unknown reboot target %s", reboot_target_.c_str()); + } +} diff --git a/fastboot/task.h b/fastboot/task.h index 216e6586a..582fa2fae 100644 --- a/fastboot/task.h +++ b/fastboot/task.h @@ -18,9 +18,7 @@ #include #include -#include "fastboot.h" #include "fastboot_driver.h" -#include "util.h" class Task { public: @@ -46,3 +44,15 @@ class FlashTask : public Task { const std::string slot_; bool force_flash_ = false; }; + +class RebootTask : public Task { + public: + RebootTask(fastboot::FastBootDriver* _fb); + RebootTask(fastboot::FastBootDriver* _fb, const std::string _reboot_target); + void Run() override; + ~RebootTask() {} + + private: + const std::string reboot_target_ = ""; + fastboot::FastBootDriver* fb_; +}; \ No newline at end of file