From 2879067ddb8bb17db84d963e93f70a0992e27d5b Mon Sep 17 00:00:00 2001 From: Stan Rokita Date: Tue, 20 Aug 2019 14:32:15 -0700 Subject: [PATCH] Multihal 2.0 - Implement SubHal discovery Collect the SubHal pointers discovered from dynamic libs contained within the multi hal config file. Bug: 136511617 Test: Compiled with mma -j and observed loading of modules Change-Id: I148265722e70d4cd56671af9c6f1ff6dde355ae4 --- sensors/2.0/multihal/Android.bp | 2 +- sensors/2.0/multihal/HalProxy.cpp | 41 ++++++++++++++++++++++++++++++- sensors/2.0/multihal/HalProxy.h | 5 ++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/sensors/2.0/multihal/Android.bp b/sensors/2.0/multihal/Android.bp index f0b33e42a1..dff28abcf0 100644 --- a/sensors/2.0/multihal/Android.bp +++ b/sensors/2.0/multihal/Android.bp @@ -44,4 +44,4 @@ cc_library_headers { name: "android.hardware.sensors@2.0-subhal.header", vendor: true, export_include_dirs: ["include"], -} \ No newline at end of file +} diff --git a/sensors/2.0/multihal/HalProxy.cpp b/sensors/2.0/multihal/HalProxy.cpp index 31f8a182b8..41c35485b6 100644 --- a/sensors/2.0/multihal/HalProxy.cpp +++ b/sensors/2.0/multihal/HalProxy.cpp @@ -18,12 +18,19 @@ #include +#include + +#include +#include + namespace android { namespace hardware { namespace sensors { namespace V2_0 { namespace implementation { +typedef ISensorsSubHal*(SensorsHalGetSubHalFunc)(uint32_t*); + // TODO: Use this wake lock name as the prefix to all sensors HAL wake locks acquired. // constexpr const char* kWakeLockName = "SensorsHAL_WAKEUP"; @@ -62,7 +69,39 @@ class SensorsCallbackProxy : public ISensorsCallback { }; HalProxy::HalProxy() { - // TODO: Initialize all sub-HALs and discover sensors. + const char* kMultiHalConfigFilePath = "/vendor/etc/sensors/hals.conf"; + std::ifstream subHalConfigStream(kMultiHalConfigFilePath); + if (!subHalConfigStream) { + LOG_FATAL("Failed to load subHal config file: %s", kMultiHalConfigFilePath); + } else { + std::string subHalLibraryFile; + while (subHalConfigStream >> subHalLibraryFile) { + void* handle = dlopen(subHalLibraryFile.c_str(), RTLD_NOW); + if (handle == nullptr) { + LOG_FATAL("dlopen failed for library: %s", subHalLibraryFile.c_str()); + } else { + SensorsHalGetSubHalFunc* sensorsHalGetSubHalPtr = + (SensorsHalGetSubHalFunc*)dlsym(handle, "sensorsHalGetSubHal"); + if (sensorsHalGetSubHalPtr == nullptr) { + LOG_FATAL("Failed to locate sensorsHalGetSubHal function for library: %s", + subHalLibraryFile.c_str()); + } else { + std::function sensorsHalGetSubHal = + *sensorsHalGetSubHalPtr; + uint32_t version; + ISensorsSubHal* subHal = sensorsHalGetSubHal(&version); + if (version != SUB_HAL_2_0_VERSION) { + LOG_FATAL("SubHal version was not 2.0 for library: %s", + subHalLibraryFile.c_str()); + } else { + ALOGI("Loaded SubHal from library: %s", subHalLibraryFile.c_str()); + mSubHalList.push_back(subHal); + } + } + } + } + } + // TODO: Discover sensors } HalProxy::~HalProxy() { diff --git a/sensors/2.0/multihal/HalProxy.h b/sensors/2.0/multihal/HalProxy.h index b9855a6ac5..e5799fdcd4 100644 --- a/sensors/2.0/multihal/HalProxy.h +++ b/sensors/2.0/multihal/HalProxy.h @@ -111,6 +111,11 @@ struct HalProxy : public ISensors { * Callback to the sensors framework to inform it that new sensors have been added or removed. */ sp mDynamicSensorsCallback; + + /** + * SubHal object pointers that have been saved from vendor dynamic libraries. + */ + std::vector mSubHalList; }; } // namespace implementation