diff options
author | Connor O'Brien <connoro@google.com> | 2016-10-10 12:31:37 -0700 |
---|---|---|
committer | Connor O'Brien <connoro@google.com> | 2016-10-18 11:19:06 -0700 |
commit | 74f82923184705abff39cacd59b7b203a7fdf760 (patch) | |
tree | d7c1aa71814239f783f45ad9a0dbf079d9e8be80 /boot/1.0/default/BootControl.cpp | |
parent | 6a9e89a6e6fef968e1b2617397ec49d73ae30b81 (diff) |
Add boot_control HIDL default implementation
Create basic implementation that passes commands
through to the old HAL implementation.
Bug: 31864052
Test: Ran and compared output to old implementation
Change-Id: I01f4450dc3a1893e13b8fb325ea40cf9c98297be
Signed-off-by: Connor O'Brien <connoro@google.com>
Diffstat (limited to 'boot/1.0/default/BootControl.cpp')
-rw-r--r-- | boot/1.0/default/BootControl.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/boot/1.0/default/BootControl.cpp b/boot/1.0/default/BootControl.cpp new file mode 100644 index 0000000000..4c34168696 --- /dev/null +++ b/boot/1.0/default/BootControl.cpp @@ -0,0 +1,98 @@ +#define LOG_TAG "android.hardware.boot@1.0-impl" +#include <utils/Log.h> + +#include <hardware/hardware.h> +#include <hardware/boot_control.h> +#include "BootControl.h" + +namespace android { +namespace hardware { +namespace boot { +namespace V1_0 { +namespace implementation { + +BootControl::BootControl(boot_control_module_t *module) : mModule(module){ +} + +// Methods from ::android::hardware::boot::V1_0::IBootControl follow. +Return<uint32_t> BootControl::getNumberSlots() { + return mModule->getNumberSlots(mModule); +} + +Return<uint32_t> BootControl::getCurrentSlot() { + return mModule->getCurrentSlot(mModule); +} + +Return<void> BootControl::markBootSuccessful(markBootSuccessful_cb _hidl_cb) { + int ret = mModule->markBootSuccessful(mModule); + struct CommandResult cr; + cr.success = (ret == 0); + cr.errMsg = strerror(-ret); + _hidl_cb(cr); + return Void(); +} + +Return<void> BootControl::setActiveBootSlot(uint32_t slot, setActiveBootSlot_cb _hidl_cb) { + int ret = mModule->setActiveBootSlot(mModule, slot); + struct CommandResult cr; + cr.success = (ret == 0); + cr.errMsg = strerror(-ret); + _hidl_cb(cr); + return Void(); +} + +Return<void> BootControl::setSlotAsUnbootable(uint32_t slot, setSlotAsUnbootable_cb _hidl_cb) { + int ret = mModule->setSlotAsUnbootable(mModule, slot); + struct CommandResult cr; + cr.success = (ret == 0); + cr.errMsg = strerror(-ret); + _hidl_cb(cr); + return Void(); +} + +Return<BoolResult> BootControl::isSlotBootable(uint32_t slot) { + int32_t ret = mModule->isSlotBootable(mModule, slot); + if (ret < 0) { + return BoolResult::INVALID_SLOT; + } + return ret ? BoolResult::TRUE : BoolResult::FALSE; +} + +Return<BoolResult> BootControl::isSlotMarkedSuccessful(uint32_t slot) { + int32_t ret = mModule->isSlotMarkedSuccessful(mModule, slot); + if (ret < 0) { + return BoolResult::INVALID_SLOT; + } + return ret ? BoolResult::TRUE : BoolResult::FALSE; +} + +Return<void> BootControl::getSuffix(uint32_t slot, getSuffix_cb _hidl_cb) { + hidl_string ans; + const char *suffix = mModule->getSuffix(mModule, slot); + if (suffix) { + ans = suffix; + } + _hidl_cb(ans); + return Void(); +} + + +IBootControl* HIDL_FETCH_IBootControl(const char* hal) { + int ret = 0; + boot_control_module_t* module = NULL; + hw_module_t **hwm = reinterpret_cast<hw_module_t**>(&module); + ret = hw_get_module(hal, const_cast<const hw_module_t**>(hwm)); + if (ret) + { + ALOGE("hw_get_module %s failed: %d", hal, ret); + return nullptr; + } + module->init(module); + return new BootControl(module); +} + +} // namespace implementation +} // namespace V1_0 +} // namespace boot +} // namespace hardware +} // namespace android |