From f395b2d6c68d973cdcedee1ac85b8d3820adad59 Mon Sep 17 00:00:00 2001 From: "suryaprakash.konduru" Date: Tue, 7 Nov 2023 19:51:03 +0530 Subject: Weaver AIDL support added Bug: 266380721 Test: Vts test VtsHalWeaverTargetTest Change-Id: I7eb969fd718b50284f5eb6f441cb2801928b348e --- Android.bp | 27 ++++ NOTICE | 2 +- aidl_impl/Weaver.cpp | 148 ++++++++++++++++++++++ aidl_impl/Weaver.h | 51 ++++++++ aidl_impl/android.hardware.weaver-service.nxp.rc | 4 + aidl_impl/android.hardware.weaver-service.nxp.xml | 10 ++ aidl_impl/service.cpp | 44 +++++++ 7 files changed, 285 insertions(+), 1 deletion(-) create mode 100644 aidl_impl/Weaver.cpp create mode 100644 aidl_impl/Weaver.h create mode 100644 aidl_impl/android.hardware.weaver-service.nxp.rc create mode 100644 aidl_impl/android.hardware.weaver-service.nxp.xml create mode 100644 aidl_impl/service.cpp diff --git a/Android.bp b/Android.bp index 6f06246..bb9b998 100755 --- a/Android.bp +++ b/Android.bp @@ -67,3 +67,30 @@ cc_binary { "-fexceptions", ], } + +cc_binary { + name: "android.hardware.weaver-service.nxp", + relative_install_path: "hw", + init_rc: ["aidl_impl/android.hardware.weaver-service.nxp.rc"], + vintf_fragments: ["aidl_impl/android.hardware.weaver-service.nxp.xml"], + vendor: true, + srcs: [ + "aidl_impl/service.cpp", + "aidl_impl/Weaver.cpp", + ], + + local_include_dirs: [ + "libese_weaver/inc", + ], + cppflags: [ + "-Wall", + "-fexceptions", + ], + shared_libs: [ + "android.hardware.weaver-V2-ndk", + "libbase", + "libbinder_ndk", + "liblog", + "ese_weaver.nxp", + ], +} diff --git a/NOTICE b/NOTICE index a0ac881..e14ff16 100644 --- a/NOTICE +++ b/NOTICE @@ -1,6 +1,6 @@ Copyright (C) 2017 The Android Open Source Project -icensed under the Apache License, Version 2.0 (the "License"); +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at diff --git a/aidl_impl/Weaver.cpp b/aidl_impl/Weaver.cpp new file mode 100644 index 0000000..66f1313 --- /dev/null +++ b/aidl_impl/Weaver.cpp @@ -0,0 +1,148 @@ +/****************************************************************************** + * + * Copyright 2023 NXP + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ +#include "Weaver.h" +#include + +namespace aidl { +namespace android { +namespace hardware { +namespace weaver { + +using ::ndk::ScopedAStatus; +using std::vector; + +// Methods from ::android::hardware::weaver::IWeaver follow. + +Weaver::Weaver() { + ALOGD("Weaver Constructor"); + pInterface = WeaverImpl::getInstance(); + if (pInterface != NULL) { + pInterface->Init(); + } else { + ALOGE("Failed to get Weaver Interface"); + } +} + +ScopedAStatus Weaver::getConfig(WeaverConfig *out_config) { + ALOGD("Weaver::getConfig"); + + if (out_config == NULL) { + ALOGE("Invalid param"); + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + STATUS_FAILED, "Null pointer passed"); + } + memset(out_config, 0, sizeof(WeaverConfig)); + + if (pInterface == NULL) { + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + STATUS_FAILED, "Weaver interface not defined"); + } + SlotInfo slotInfo; + Status_Weaver status = pInterface->GetSlots(slotInfo); + if (status == WEAVER_STATUS_OK) { + out_config->slots = slotInfo.slots; + out_config->keySize = slotInfo.keySize; + out_config->valueSize = slotInfo.valueSize; + ALOGD("Weaver Success for getSlots Slots :(%d)", out_config->slots); + return ScopedAStatus::ok(); + } else { + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + STATUS_FAILED, "Failed to retrieve slots info"); + } +} + +ScopedAStatus Weaver::read(int32_t in_slotId, const vector &in_key, + WeaverReadResponse *out_response) { + + ALOGD("Weaver::read slot %d", in_slotId); + if (out_response == NULL) { + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + STATUS_FAILED, "Null pointer passed"); + } + if (in_key.empty()) { + out_response->status = WeaverReadStatus::FAILED; + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + STATUS_FAILED, "Empty key input passed"); + } + if (pInterface == NULL) { + out_response->status = WeaverReadStatus::FAILED; + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + STATUS_FAILED, "Weaver interface not defined"); + } + memset(out_response, 0, sizeof(WeaverReadResponse)); + + ReadRespInfo readInfo; + ScopedAStatus retStatus; + Status_Weaver status; + + status = pInterface->Read(in_slotId, in_key, readInfo); + switch (status) { + case WEAVER_STATUS_OK: + ALOGD("Read slot %d OK", in_slotId); + out_response->value = readInfo.value; + out_response->status = WeaverReadStatus::OK; + retStatus = ScopedAStatus::ok(); + break; + case WEAVER_STATUS_INCORRECT_KEY: + ALOGE("Read Incorrect Key"); + out_response->value.resize(0); + out_response->timeout = readInfo.timeout; + out_response->status = WeaverReadStatus::INCORRECT_KEY; + retStatus = ScopedAStatus::ok(); + break; + case WEAVER_STATUS_THROTTLE: + ALOGE("Read WEAVER_THROTTLE"); + out_response->value.resize(0); + out_response->timeout = readInfo.timeout; + out_response->status = WeaverReadStatus::THROTTLE; + retStatus = ScopedAStatus::ok(); + break; + default: + out_response->timeout = 0; + out_response->value.resize(0); + out_response->status = WeaverReadStatus::FAILED; + retStatus = ScopedAStatus::ok(); + break; + } + return retStatus; +} + +ScopedAStatus Weaver::write(int32_t in_slotId, const vector &in_key, + const vector &in_value) { + ALOGD("Weaver::write slot %d", in_slotId); + if (in_key.empty() || in_value.empty()) { + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + STATUS_FAILED, "Invalid parameters passed"); + } + if (pInterface == NULL) { + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + STATUS_FAILED, "Weaver interface not defined"); + } + if (pInterface->Write(in_slotId, in_key, in_value) == WEAVER_STATUS_OK) { + ALOGD("Write slot %d OK", in_slotId); + return ScopedAStatus::ok(); + } else { + return ScopedAStatus::fromServiceSpecificErrorWithMessage(STATUS_FAILED, + "Unknown error"); + } +} + +} // namespace weaver +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/aidl_impl/Weaver.h b/aidl_impl/Weaver.h new file mode 100644 index 0000000..1eaa5cc --- /dev/null +++ b/aidl_impl/Weaver.h @@ -0,0 +1,51 @@ +/****************************************************************************** + * + * Copyright 2023 NXP + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ +#pragma once + +#include +#include +#include + +namespace aidl { +namespace android { +namespace hardware { +namespace weaver { + +using ::aidl::android::hardware::weaver::WeaverConfig; +using ::aidl::android::hardware::weaver::WeaverReadResponse; +using ::ndk::ScopedAStatus; +using std::vector; + +struct Weaver : public BnWeaver { +public: + Weaver(); + // Methods from ::android::hardware::weaver::IWeaver follow. + ScopedAStatus getConfig(WeaverConfig *_aidl_return) override; + ScopedAStatus read(int32_t in_slotId, const vector &in_key, + WeaverReadResponse *_aidl_return) override; + ScopedAStatus write(int32_t in_slotId, const vector &in_key, + const vector &in_value) override; + +private: + WeaverInterface *pInterface = nullptr; +}; + +} // namespace weaver +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/aidl_impl/android.hardware.weaver-service.nxp.rc b/aidl_impl/android.hardware.weaver-service.nxp.rc new file mode 100644 index 0000000..5516e65 --- /dev/null +++ b/aidl_impl/android.hardware.weaver-service.nxp.rc @@ -0,0 +1,4 @@ +service vendor.weaver_nxp /vendor/bin/hw/android.hardware.weaver-service.nxp + class hal + user vendor_nxp_weaver + group system drmrpc diff --git a/aidl_impl/android.hardware.weaver-service.nxp.xml b/aidl_impl/android.hardware.weaver-service.nxp.xml new file mode 100644 index 0000000..bfe4396 --- /dev/null +++ b/aidl_impl/android.hardware.weaver-service.nxp.xml @@ -0,0 +1,10 @@ + + + android.hardware.weaver + 2 + + IWeaver + default + + + diff --git a/aidl_impl/service.cpp b/aidl_impl/service.cpp new file mode 100644 index 0000000..570f427 --- /dev/null +++ b/aidl_impl/service.cpp @@ -0,0 +1,44 @@ +/****************************************************************************** + * + * Copyright 2023 NXP + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ +#include "Weaver.h" +#include +#include +#include +#include + +using ::aidl::android::hardware::weaver::Weaver; + +int main() { + try { + ABinderProcess_setThreadPoolMaxThreadCount(0); + std::shared_ptr weaver = ndk::SharedRefBase::make(); + + const std::string instance = + std::string() + Weaver::descriptor + "/default"; + binder_status_t status = + AServiceManager_addService(weaver->asBinder().get(), instance.c_str()); + CHECK(status == STATUS_OK); + + ABinderProcess_joinThreadPool(); + } catch (std::__1::ios_base::failure &e) { + ALOGE("ios failure Exception occurred = %s ", e.what()); + } catch (std::__1::system_error &e) { + ALOGE("system error Exception occurred = %s ", e.what()); + } + return -1; // Should never be reached +} -- cgit v1.2.3