Loading fastboot/Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,8 @@ cc_binary { "device/fastboot_device.cpp", "device/main.cpp", "device/usb_client.cpp", "device/utility.cpp", "device/variables.cpp", ], shared_libs: [ Loading @@ -103,6 +105,7 @@ cc_binary { "libext4_utils", "libsparse", "liblog", "android.hardware.boot@1.0", "libbootloader_message", "libhidltransport", "libhidlbase", Loading fastboot/constants.h +2 −0 Original line number Diff line number Diff line Loading @@ -51,3 +51,5 @@ #define FB_VAR_HAS_SLOT "has-slot" #define FB_VAR_SLOT_COUNT "slot-count" #define FB_VAR_PARTITION_SIZE "partition-size" #define FB_VAR_SLOT_SUCCESSFUL "slot-successful" #define FB_VAR_SLOT_UNBOOTABLE "slot-unbootable" fastboot/device/commands.cpp +61 −2 Original line number Diff line number Diff line Loading @@ -27,7 +27,43 @@ #include <android-base/unique_fd.h> #include <cutils/android_reboot.h> #include "constants.h" #include "fastboot_device.h" #include "utility.h" using ::android::hardware::hidl_string; using ::android::hardware::boot::V1_0::BoolResult; using ::android::hardware::boot::V1_0::CommandResult; using ::android::hardware::boot::V1_0::Slot; bool GetVarHandler(FastbootDevice* device, const std::vector<std::string>& args) { using VariableHandler = std::function<std::string(FastbootDevice*, const std::vector<std::string>&)>; const std::unordered_map<std::string, VariableHandler> kVariableMap = { {FB_VAR_VERSION, GetVersion}, {FB_VAR_VERSION_BOOTLOADER, GetBootloaderVersion}, {FB_VAR_VERSION_BASEBAND, GetBasebandVersion}, {FB_VAR_PRODUCT, GetProduct}, {FB_VAR_SERIALNO, GetSerial}, {FB_VAR_SECURE, GetSecure}, {FB_VAR_UNLOCKED, GetUnlocked}, {FB_VAR_MAX_DOWNLOAD_SIZE, GetMaxDownloadSize}, {FB_VAR_CURRENT_SLOT, ::GetCurrentSlot}, {FB_VAR_SLOT_COUNT, GetSlotCount}, {FB_VAR_HAS_SLOT, GetHasSlot}, {FB_VAR_SLOT_SUCCESSFUL, GetSlotSuccessful}, {FB_VAR_SLOT_UNBOOTABLE, GetSlotUnbootable}}; // args[0] is command name, args[1] is variable. auto found_variable = kVariableMap.find(args[1]); if (found_variable == kVariableMap.end()) { return device->WriteStatus(FastbootResult::FAIL, "Unknown variable"); } std::vector<std::string> getvar_args(args.begin() + 2, args.end()); auto result = found_variable->second(device, getvar_args); return device->WriteStatus(FastbootResult::OKAY, result); } bool DownloadHandler(FastbootDevice* device, const std::vector<std::string>& args) { if (args.size() < 2) { Loading @@ -51,8 +87,31 @@ bool DownloadHandler(FastbootDevice* device, const std::vector<std::string>& arg return device->WriteStatus(FastbootResult::FAIL, "Couldn't download data"); } bool SetActiveHandler(FastbootDevice* device, const std::vector<std::string>& /* args */) { return device->WriteStatus(FastbootResult::OKAY, ""); bool SetActiveHandler(FastbootDevice* device, const std::vector<std::string>& args) { if (args.size() < 2) { return device->WriteStatus(FastbootResult::FAIL, "Missing slot argument"); } // Slot suffix needs to be between 'a' and 'z'. Slot slot; if (!GetSlotNumber(args[1], &slot)) { return device->WriteStatus(FastbootResult::FAIL, "Bad slot suffix"); } // Non-A/B devices will not have a boot control HAL. auto boot_control_hal = device->boot_control_hal(); if (!boot_control_hal) { return device->WriteStatus(FastbootResult::FAIL, "Cannot set slot: boot control HAL absent"); } if (slot >= boot_control_hal->getNumberSlots()) { return device->WriteStatus(FastbootResult::FAIL, "Slot out of range"); } CommandResult ret; auto cb = [&ret](CommandResult result) { ret = result; }; auto result = boot_control_hal->setActiveBootSlot(slot, cb); if (result.isOk() && ret.success) return device->WriteStatus(FastbootResult::OKAY, ""); return device->WriteStatus(FastbootResult::FAIL, "Unable to set slot"); } bool ShutDownHandler(FastbootDevice* device, const std::vector<std::string>& /* args */) { Loading fastboot/device/commands.h +1 −0 Original line number Diff line number Diff line Loading @@ -38,3 +38,4 @@ bool RebootHandler(FastbootDevice* device, const std::vector<std::string>& args) bool RebootBootloaderHandler(FastbootDevice* device, const std::vector<std::string>& args); bool RebootFastbootHandler(FastbootDevice* device, const std::vector<std::string>& args); bool RebootRecoveryHandler(FastbootDevice* device, const std::vector<std::string>& args); bool GetVarHandler(FastbootDevice* device, const std::vector<std::string>& args); fastboot/device/fastboot_device.cpp +21 −1 Original line number Diff line number Diff line Loading @@ -18,23 +18,31 @@ #include <android-base/logging.h> #include <android-base/strings.h> #include <android/hardware/boot/1.0/IBootControl.h> #include <algorithm> #include "constants.h" #include "usb_client.h" using ::android::hardware::hidl_string; using ::android::hardware::boot::V1_0::IBootControl; using ::android::hardware::boot::V1_0::Slot; namespace sph = std::placeholders; FastbootDevice::FastbootDevice() : kCommandMap({ {FB_CMD_SET_ACTIVE, SetActiveHandler}, {FB_CMD_DOWNLOAD, DownloadHandler}, {FB_CMD_GETVAR, GetVarHandler}, {FB_CMD_SHUTDOWN, ShutDownHandler}, {FB_CMD_REBOOT, RebootHandler}, {FB_CMD_REBOOT_BOOTLOADER, RebootBootloaderHandler}, {FB_CMD_REBOOT_FASTBOOT, RebootFastbootHandler}, {FB_CMD_REBOOT_RECOVERY, RebootRecoveryHandler}, }), transport_(std::make_unique<ClientUsbTransport>()) {} transport_(std::make_unique<ClientUsbTransport>()), boot_control_hal_(IBootControl::getService()) {} FastbootDevice::~FastbootDevice() { CloseDevice(); Loading @@ -44,9 +52,21 @@ void FastbootDevice::CloseDevice() { transport_->Close(); } std::string FastbootDevice::GetCurrentSlot() { // Non-A/B devices must not have boot control HALs. if (!boot_control_hal_) { return ""; } std::string suffix; auto cb = [&suffix](hidl_string s) { suffix = s; }; boot_control_hal_->getSuffix(boot_control_hal_->getCurrentSlot(), cb); return suffix; } bool FastbootDevice::WriteStatus(FastbootResult result, const std::string& message) { constexpr size_t kResponseReasonSize = 4; constexpr size_t kNumResponseTypes = 4; // "FAIL", "OKAY", "INFO", "DATA" char buf[FB_RESPONSE_SZ]; constexpr size_t kMaxMessageSize = sizeof(buf) - kResponseReasonSize; size_t msg_len = std::min(kMaxMessageSize, message.size()); Loading Loading
fastboot/Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,8 @@ cc_binary { "device/fastboot_device.cpp", "device/main.cpp", "device/usb_client.cpp", "device/utility.cpp", "device/variables.cpp", ], shared_libs: [ Loading @@ -103,6 +105,7 @@ cc_binary { "libext4_utils", "libsparse", "liblog", "android.hardware.boot@1.0", "libbootloader_message", "libhidltransport", "libhidlbase", Loading
fastboot/constants.h +2 −0 Original line number Diff line number Diff line Loading @@ -51,3 +51,5 @@ #define FB_VAR_HAS_SLOT "has-slot" #define FB_VAR_SLOT_COUNT "slot-count" #define FB_VAR_PARTITION_SIZE "partition-size" #define FB_VAR_SLOT_SUCCESSFUL "slot-successful" #define FB_VAR_SLOT_UNBOOTABLE "slot-unbootable"
fastboot/device/commands.cpp +61 −2 Original line number Diff line number Diff line Loading @@ -27,7 +27,43 @@ #include <android-base/unique_fd.h> #include <cutils/android_reboot.h> #include "constants.h" #include "fastboot_device.h" #include "utility.h" using ::android::hardware::hidl_string; using ::android::hardware::boot::V1_0::BoolResult; using ::android::hardware::boot::V1_0::CommandResult; using ::android::hardware::boot::V1_0::Slot; bool GetVarHandler(FastbootDevice* device, const std::vector<std::string>& args) { using VariableHandler = std::function<std::string(FastbootDevice*, const std::vector<std::string>&)>; const std::unordered_map<std::string, VariableHandler> kVariableMap = { {FB_VAR_VERSION, GetVersion}, {FB_VAR_VERSION_BOOTLOADER, GetBootloaderVersion}, {FB_VAR_VERSION_BASEBAND, GetBasebandVersion}, {FB_VAR_PRODUCT, GetProduct}, {FB_VAR_SERIALNO, GetSerial}, {FB_VAR_SECURE, GetSecure}, {FB_VAR_UNLOCKED, GetUnlocked}, {FB_VAR_MAX_DOWNLOAD_SIZE, GetMaxDownloadSize}, {FB_VAR_CURRENT_SLOT, ::GetCurrentSlot}, {FB_VAR_SLOT_COUNT, GetSlotCount}, {FB_VAR_HAS_SLOT, GetHasSlot}, {FB_VAR_SLOT_SUCCESSFUL, GetSlotSuccessful}, {FB_VAR_SLOT_UNBOOTABLE, GetSlotUnbootable}}; // args[0] is command name, args[1] is variable. auto found_variable = kVariableMap.find(args[1]); if (found_variable == kVariableMap.end()) { return device->WriteStatus(FastbootResult::FAIL, "Unknown variable"); } std::vector<std::string> getvar_args(args.begin() + 2, args.end()); auto result = found_variable->second(device, getvar_args); return device->WriteStatus(FastbootResult::OKAY, result); } bool DownloadHandler(FastbootDevice* device, const std::vector<std::string>& args) { if (args.size() < 2) { Loading @@ -51,8 +87,31 @@ bool DownloadHandler(FastbootDevice* device, const std::vector<std::string>& arg return device->WriteStatus(FastbootResult::FAIL, "Couldn't download data"); } bool SetActiveHandler(FastbootDevice* device, const std::vector<std::string>& /* args */) { return device->WriteStatus(FastbootResult::OKAY, ""); bool SetActiveHandler(FastbootDevice* device, const std::vector<std::string>& args) { if (args.size() < 2) { return device->WriteStatus(FastbootResult::FAIL, "Missing slot argument"); } // Slot suffix needs to be between 'a' and 'z'. Slot slot; if (!GetSlotNumber(args[1], &slot)) { return device->WriteStatus(FastbootResult::FAIL, "Bad slot suffix"); } // Non-A/B devices will not have a boot control HAL. auto boot_control_hal = device->boot_control_hal(); if (!boot_control_hal) { return device->WriteStatus(FastbootResult::FAIL, "Cannot set slot: boot control HAL absent"); } if (slot >= boot_control_hal->getNumberSlots()) { return device->WriteStatus(FastbootResult::FAIL, "Slot out of range"); } CommandResult ret; auto cb = [&ret](CommandResult result) { ret = result; }; auto result = boot_control_hal->setActiveBootSlot(slot, cb); if (result.isOk() && ret.success) return device->WriteStatus(FastbootResult::OKAY, ""); return device->WriteStatus(FastbootResult::FAIL, "Unable to set slot"); } bool ShutDownHandler(FastbootDevice* device, const std::vector<std::string>& /* args */) { Loading
fastboot/device/commands.h +1 −0 Original line number Diff line number Diff line Loading @@ -38,3 +38,4 @@ bool RebootHandler(FastbootDevice* device, const std::vector<std::string>& args) bool RebootBootloaderHandler(FastbootDevice* device, const std::vector<std::string>& args); bool RebootFastbootHandler(FastbootDevice* device, const std::vector<std::string>& args); bool RebootRecoveryHandler(FastbootDevice* device, const std::vector<std::string>& args); bool GetVarHandler(FastbootDevice* device, const std::vector<std::string>& args);
fastboot/device/fastboot_device.cpp +21 −1 Original line number Diff line number Diff line Loading @@ -18,23 +18,31 @@ #include <android-base/logging.h> #include <android-base/strings.h> #include <android/hardware/boot/1.0/IBootControl.h> #include <algorithm> #include "constants.h" #include "usb_client.h" using ::android::hardware::hidl_string; using ::android::hardware::boot::V1_0::IBootControl; using ::android::hardware::boot::V1_0::Slot; namespace sph = std::placeholders; FastbootDevice::FastbootDevice() : kCommandMap({ {FB_CMD_SET_ACTIVE, SetActiveHandler}, {FB_CMD_DOWNLOAD, DownloadHandler}, {FB_CMD_GETVAR, GetVarHandler}, {FB_CMD_SHUTDOWN, ShutDownHandler}, {FB_CMD_REBOOT, RebootHandler}, {FB_CMD_REBOOT_BOOTLOADER, RebootBootloaderHandler}, {FB_CMD_REBOOT_FASTBOOT, RebootFastbootHandler}, {FB_CMD_REBOOT_RECOVERY, RebootRecoveryHandler}, }), transport_(std::make_unique<ClientUsbTransport>()) {} transport_(std::make_unique<ClientUsbTransport>()), boot_control_hal_(IBootControl::getService()) {} FastbootDevice::~FastbootDevice() { CloseDevice(); Loading @@ -44,9 +52,21 @@ void FastbootDevice::CloseDevice() { transport_->Close(); } std::string FastbootDevice::GetCurrentSlot() { // Non-A/B devices must not have boot control HALs. if (!boot_control_hal_) { return ""; } std::string suffix; auto cb = [&suffix](hidl_string s) { suffix = s; }; boot_control_hal_->getSuffix(boot_control_hal_->getCurrentSlot(), cb); return suffix; } bool FastbootDevice::WriteStatus(FastbootResult result, const std::string& message) { constexpr size_t kResponseReasonSize = 4; constexpr size_t kNumResponseTypes = 4; // "FAIL", "OKAY", "INFO", "DATA" char buf[FB_RESPONSE_SZ]; constexpr size_t kMaxMessageSize = sizeof(buf) - kResponseReasonSize; size_t msg_len = std::min(kMaxMessageSize, message.size()); Loading