| // Copyright 2019 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "power_manager/powerd/system/wilco_charge_controller_helper.h" |
| |
| #include <base/files/file_path.h> |
| #include <base/files/file_util.h> |
| #include <base/logging.h> |
| #include <base/strings/stringprintf.h> |
| #include <brillo/file_utils.h> |
| |
| namespace power_manager { |
| namespace system { |
| |
| namespace { |
| |
| constexpr const char kEcDriverSysfsDirectory[] = |
| "/sys/bus/platform/devices/GOOG000C:00/"; |
| |
| // Relative path to |kEcDriverSysfsDirectory|. |
| constexpr const char kChargeScheduleDirectory[] = "wilco-charge-schedule/"; |
| |
| // Relative path to |kChargeScheduleDirectory|. |
| constexpr const char kPeakShiftDirectory[] = "peak_shift"; |
| // Relative paths to |kPeakShiftDirectory|. |
| constexpr const char kPeakShiftEnablePath[] = "enable"; |
| constexpr const char kPeakShiftThresholdPath[] = "battery_threshold"; |
| |
| // Relative path to |kChargeScheduleDirectory|. |
| constexpr const char kAdvancedChargingDirectory[] = "advanced_charging"; |
| // Relative path to |kAdvancedChargingDirectory|. |
| constexpr const char kAdvancedChargingEnablePath[] = "enable"; |
| |
| // Relative path to |kEcDriverSysfsDirectory|. |
| constexpr const char kBootOnAcEnablePath[] = "boot_on_ac"; |
| |
| // Relative path to |kEcDriverSysfsDirectory|. |
| constexpr const char kUsbPowerShareEnablePath[] = "usb_charge"; |
| |
| constexpr const char kPowerSupplyDirectory[] = |
| "/sys/class/power_supply/wilco-charger/"; |
| |
| // Relative path to |kPowerSupplyDirectory|. |
| constexpr const char kBatteryChargeModePath[] = "charge_type"; |
| |
| // Relative path to |kPowerSupplyDirectory|. |
| constexpr const char kBatteryChargeCustomChargeStartPath[] = |
| "charge_control_start_threshold"; |
| |
| // Relative path to |kPowerSupplyDirectory|. |
| constexpr const char kBatteryChargeCustomChargeStopPath[] = |
| "charge_control_end_threshold"; |
| |
| // Strings returned by this function are dictated by the kernel driver and |
| // can't be changed. |
| bool WeekDayToString(PowerManagementPolicy::WeekDay week_day, |
| std::string* week_day_out) { |
| DCHECK(week_day_out); |
| switch (week_day) { |
| case PowerManagementPolicy::MONDAY: |
| *week_day_out = "monday"; |
| return true; |
| case PowerManagementPolicy::TUESDAY: |
| *week_day_out = "tuesday"; |
| return true; |
| case PowerManagementPolicy::WEDNESDAY: |
| *week_day_out = "wednesday"; |
| return true; |
| case PowerManagementPolicy::THURSDAY: |
| *week_day_out = "thursday"; |
| return true; |
| case PowerManagementPolicy::FRIDAY: |
| *week_day_out = "friday"; |
| return true; |
| case PowerManagementPolicy::SATURDAY: |
| *week_day_out = "saturday"; |
| return true; |
| case PowerManagementPolicy::SUNDAY: |
| *week_day_out = "sunday"; |
| return true; |
| } |
| LOG(WARNING) << "Unexpected week day value " << static_cast<int>(week_day); |
| return false; |
| } |
| |
| bool WriteStringToFile(const base::FilePath& filename, |
| const std::string& data) { |
| if (!brillo::WriteStringToFile(filename, data)) { |
| PLOG(ERROR) << "Unable to write \"" << data << "\" to " << filename.value(); |
| return false; |
| } |
| return true; |
| } |
| |
| } // namespace |
| |
| WilcoChargeControllerHelper::WilcoChargeControllerHelper() = default; |
| |
| WilcoChargeControllerHelper::~WilcoChargeControllerHelper() = default; |
| |
| bool WilcoChargeControllerHelper::SetPeakShiftEnabled(bool enable) { |
| return WriteStringToFile(base::FilePath(kEcDriverSysfsDirectory) |
| .Append(kChargeScheduleDirectory) |
| .Append(kPeakShiftDirectory) |
| .Append(kPeakShiftEnablePath), |
| enable ? "1" : "0"); |
| } |
| |
| bool WilcoChargeControllerHelper::SetPeakShiftBatteryPercentThreshold( |
| int threshold) { |
| return WriteStringToFile(base::FilePath(kEcDriverSysfsDirectory) |
| .Append(kChargeScheduleDirectory) |
| .Append(kPeakShiftDirectory) |
| .Append(kPeakShiftThresholdPath), |
| base::StringPrintf("%d", threshold)); |
| } |
| |
| bool WilcoChargeControllerHelper::SetPeakShiftDayConfig( |
| PowerManagementPolicy::WeekDay week_day, const std::string& config) { |
| std::string week_day_str; |
| return WeekDayToString(week_day, &week_day_str) && |
| WriteStringToFile(base::FilePath(kEcDriverSysfsDirectory) |
| .Append(kChargeScheduleDirectory) |
| .Append(kPeakShiftDirectory) |
| .Append(week_day_str), |
| config); |
| } |
| |
| bool WilcoChargeControllerHelper::SetBootOnAcEnabled(bool enable) { |
| return WriteStringToFile( |
| base::FilePath(kEcDriverSysfsDirectory).Append(kBootOnAcEnablePath), |
| enable ? "1" : "0"); |
| } |
| |
| bool WilcoChargeControllerHelper::SetUsbPowerShareEnabled(bool enable) { |
| return WriteStringToFile( |
| base::FilePath(kEcDriverSysfsDirectory).Append(kUsbPowerShareEnablePath), |
| enable ? "1" : "0"); |
| } |
| |
| bool WilcoChargeControllerHelper::SetAdvancedBatteryChargeModeEnabled( |
| bool enable) { |
| return WriteStringToFile(base::FilePath(kEcDriverSysfsDirectory) |
| .Append(kChargeScheduleDirectory) |
| .Append(kAdvancedChargingDirectory) |
| .Append(kAdvancedChargingEnablePath), |
| enable ? "1" : "0"); |
| } |
| |
| bool WilcoChargeControllerHelper::SetAdvancedBatteryChargeModeDayConfig( |
| PowerManagementPolicy::WeekDay week_day, const std::string& config) { |
| std::string week_day_str; |
| return WeekDayToString(week_day, &week_day_str) && |
| WriteStringToFile(base::FilePath(kEcDriverSysfsDirectory) |
| .Append(kChargeScheduleDirectory) |
| .Append(kAdvancedChargingDirectory) |
| .Append(week_day_str), |
| config); |
| } |
| |
| bool WilcoChargeControllerHelper::SetBatteryChargeMode( |
| PowerManagementPolicy::BatteryChargeMode::Mode mode) { |
| std::string charge_type; |
| switch (mode) { |
| case PowerManagementPolicy::BatteryChargeMode::STANDARD: |
| charge_type = "Standard"; |
| break; |
| case PowerManagementPolicy::BatteryChargeMode::EXPRESS_CHARGE: |
| charge_type = "Fast"; |
| break; |
| case PowerManagementPolicy::BatteryChargeMode::PRIMARILY_AC_USE: |
| charge_type = "Trickle"; |
| break; |
| case PowerManagementPolicy::BatteryChargeMode::ADAPTIVE: |
| charge_type = "Adaptive"; |
| break; |
| case PowerManagementPolicy::BatteryChargeMode::CUSTOM: |
| charge_type = "Custom"; |
| break; |
| } |
| if (charge_type.empty()) { |
| LOG(WARNING) << "Invalid battery charge mode " << mode; |
| return false; |
| } |
| return WriteStringToFile( |
| base::FilePath(kPowerSupplyDirectory).Append(kBatteryChargeModePath), |
| charge_type); |
| } |
| |
| bool WilcoChargeControllerHelper::SetBatteryChargeCustomThresholds( |
| int custom_charge_start, int custom_charge_stop) { |
| return WriteStringToFile(base::FilePath(kPowerSupplyDirectory) |
| .Append(kBatteryChargeCustomChargeStartPath), |
| base::StringPrintf("%d", custom_charge_start)) && |
| WriteStringToFile(base::FilePath(kPowerSupplyDirectory) |
| .Append(kBatteryChargeCustomChargeStopPath), |
| base::StringPrintf("%d", custom_charge_stop)); |
| } |
| |
| } // namespace system |
| } // namespace power_manager |