| /* |
| * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials provided |
| * with the distribution. |
| * * Neither the name of The Linux Foundation nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS |
| * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
| * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
| * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN |
| * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| /* |
| * Changes from Qualcomm Innovation Center are provided under the following license: |
| * |
| * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted (subject to the limitations in the disclaimer |
| * below) provided that the following conditions are met: |
| * |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * * Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials provided |
| * with the distribution. |
| * |
| * * Neither the name of Qualcomm Innovation Center, Inc.nor the |
| * names of its contributors may be used to endorse or promote |
| * products derived from this software without specific prior |
| * written permission. |
| * |
| * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT |
| * RIGHTS ARE GRANTED BY THIS LICENSE. THIS SOFTWARE IS |
| * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS |
| * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
| * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER |
| * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
| * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
| * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #define LOG_TAG "health_impl_qti" |
| |
| #include <android-base/logging.h> |
| #include <health/utils.h> |
| #include <health2impl/Health.h> |
| #include <cutils/klog.h> |
| |
| using ::android::hardware::health::InitHealthdConfig; |
| using ::android::hardware::health::V2_1::IHealth; |
| using namespace std::literals; |
| |
| namespace { |
| |
| constexpr char ucsiPSYName[]{"ucsi-source-psy-soc:qcom,pmic_glink:qcom,ucsi1"}; |
| |
| #define RETRY_COUNT 100 |
| |
| void qti_healthd_board_init(struct healthd_config *hc) |
| { |
| int fd; |
| unsigned char retries = RETRY_COUNT; |
| int ret = 0; |
| unsigned char buf; |
| |
| hc->ignorePowerSupplyNames.push_back(android::String8(ucsiPSYName)); |
| retry: |
| if (!retries) { |
| KLOG_ERROR(LOG_TAG, "Cannot open battery/capacity, fd=%d\n", fd); |
| return; |
| } |
| |
| fd = open("/sys/class/power_supply/battery/capacity", 0440); |
| if (fd >= 0) { |
| KLOG_INFO(LOG_TAG, "opened battery/capacity after %d retries\n", RETRY_COUNT - retries); |
| while (retries) { |
| ret = read(fd, &buf, 1); |
| if(ret >= 0) { |
| KLOG_INFO(LOG_TAG, "Read Batt Capacity after %d retries ret : %d\n", RETRY_COUNT - retries, ret); |
| close(fd); |
| return; |
| } |
| |
| retries--; |
| usleep(100000); |
| } |
| |
| KLOG_ERROR(LOG_TAG, "Failed to read Battery Capacity ret=%d\n", ret); |
| close(fd); |
| return; |
| } |
| |
| retries--; |
| usleep(100000); |
| goto retry; |
| } |
| } //anonymous namespace |
| |
| namespace android { |
| namespace hardware { |
| namespace health { |
| namespace V2_1 { |
| namespace implementation { |
| |
| class HealthImpl : public Health { |
| public: |
| HealthImpl(std::unique_ptr<healthd_config>&& config) |
| : Health(std::move(config)) {} |
| }; |
| |
| } // namespace implementation |
| } // namespace V2_1 |
| } // namespace health |
| } // namespace hardware |
| } // namespace android |
| |
| |
| extern "C" IHealth* HIDL_FETCH_IHealth(const char* instance) { |
| using ::android::hardware::health::V2_1::implementation::HealthImpl; |
| if (instance != "default"sv) { |
| return nullptr; |
| } |
| auto config = std::make_unique<healthd_config>(); |
| InitHealthdConfig(config.get()); |
| qti_healthd_board_init(config.get()); |
| |
| return new HealthImpl(std::move(config)); |
| } |