Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 71b3b434 authored by Daniel Zheng's avatar Daniel Zheng
Browse files

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
parent 16ab2b67
Loading
Loading
Loading
Loading
+15 −39
Original line number Diff line number Diff line
@@ -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<Task> reboot_task = nullptr;
    std::vector<std::string> 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;
                std::string reboot_target = next_arg(&args);
                reboot_task = std::make_unique<RebootTask>(fb, reboot_target);
            } else {
                    syntax_error("unknown reboot target %s", what.c_str());
                }
                reboot_task = std::make_unique<RebootTask>(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<RebootTask>(fb, "bootloader");
        } else if (command == FB_CMD_REBOOT_RECOVERY) {
            wants_reboot_recovery = true;
            reboot_task = std::make_unique<RebootTask>(fb, "recovery");
        } else if (command == FB_CMD_REBOOT_FASTBOOT) {
            wants_reboot_fastboot = true;
            reboot_task = std::make_unique<RebootTask>(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<RebootTask>(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<RebootTask>(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);
+26 −0
Original line number Diff line number Diff line
@@ -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());
    }
}
+12 −2
Original line number Diff line number Diff line
@@ -18,9 +18,7 @@
#include <sstream>
#include <string>

#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