diff --git a/selfdrive/hardware/base.py b/selfdrive/hardware/base.py index 14a1a6f81..edfd02aad 100644 --- a/selfdrive/hardware/base.py +++ b/selfdrive/hardware/base.py @@ -105,3 +105,7 @@ class HardwareBase: @abstractmethod def set_screen_brightness(self, percentage): pass + + @abstractmethod + def set_power_save(self, enabled): + pass diff --git a/selfdrive/hardware/eon/hardware.py b/selfdrive/hardware/eon/hardware.py index 2ef2a8f47..95fdd7cd7 100644 --- a/selfdrive/hardware/eon/hardware.py +++ b/selfdrive/hardware/eon/hardware.py @@ -352,3 +352,6 @@ class Android(HardwareBase): def set_screen_brightness(self, percentage): with open("/sys/class/leds/lcd-backlight/brightness", "w") as f: f.write(str(int(percentage * 2.55))) + + def set_power_save(self, enabled): + pass diff --git a/selfdrive/hardware/pc/hardware.py b/selfdrive/hardware/pc/hardware.py index 7ee40bd6b..edbc4e07b 100644 --- a/selfdrive/hardware/pc/hardware.py +++ b/selfdrive/hardware/pc/hardware.py @@ -79,3 +79,6 @@ class Pc(HardwareBase): def set_screen_brightness(self, percentage): pass + + def set_power_save(self, enabled): + pass diff --git a/selfdrive/hardware/tici/hardware.py b/selfdrive/hardware/tici/hardware.py index bdf2170c2..536ab4d15 100644 --- a/selfdrive/hardware/tici/hardware.py +++ b/selfdrive/hardware/tici/hardware.py @@ -1,6 +1,7 @@ import os import subprocess from pathlib import Path +from smbus2 import SMBus from cereal import log from selfdrive.hardware.base import HardwareBase, ThermalConfig @@ -27,6 +28,14 @@ NetworkStrength = log.DeviceState.NetworkStrength MM_MODEM_ACCESS_TECHNOLOGY_UMTS = 1 << 5 MM_MODEM_ACCESS_TECHNOLOGY_LTE = 1 << 14 +AMP_I2C_BUS = 0 +AMP_ADDRESS = 0x10 + +def write_amplifier_reg(reg, val, offset, mask): + with SMBus(AMP_I2C_BUS) as bus: + v = bus.read_byte_data(AMP_ADDRESS, reg, force=True) + v = (v & (~mask)) | ((val << offset) & mask) + bus.write_byte_data(AMP_ADDRESS, reg, v, force=True) class Tici(HardwareBase): def __init__(self): @@ -191,3 +200,12 @@ class Tici(HardwareBase): f.write(str(int(percentage * 10.23))) except Exception: pass + + def set_power_save(self, enabled): + # amplifier, 100mW at idle + write_amplifier_reg(0x51, 0b0 if enabled else 0b1, 7, 0b10000000) + + +if __name__ == "__main__": + import sys + Tici().set_power_save(bool(int(sys.argv[1]))) diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index 8881a0a0b..4d37b56a8 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -25,8 +25,6 @@ from selfdrive.version import get_git_branch, terms_version, training_version FW_SIGNATURE = get_expected_signature() -DISABLE_LTE_ONROAD = os.path.exists("/persist/disable_lte_onroad") or TICI - ThermalStatus = log.DeviceState.ThermalStatus NetworkType = log.DeviceState.NetworkType NetworkStrength = log.DeviceState.NetworkStrength @@ -348,12 +346,14 @@ def thermald_thread(): # Handle offroad/onroad transition should_start = all(startup_conditions.values()) - if should_start: - if not should_start_prev: - params.delete("IsOffroad") - if TICI and DISABLE_LTE_ONROAD: - os.system("sudo systemctl stop --no-block lte") + if should_start != should_start_prev or (count == 0): + params.put_bool("IsOffroad", not should_start) + HARDWARE.set_power_save(not should_start) + if TICI: + fxn = "stop" if should_start else "start" + os.system(f"sudo systemctl {fxn} --no-block lte") + if should_start: off_ts = None if started_ts is None: started_ts = sec_since_boot() @@ -362,11 +362,6 @@ def thermald_thread(): if startup_conditions["ignition"] and (startup_conditions != startup_conditions_prev): cloudlog.event("Startup blocked", startup_conditions=startup_conditions) - if should_start_prev or (count == 0): - params.put_bool("IsOffroad", True) - if TICI and DISABLE_LTE_ONROAD: - os.system("sudo systemctl start --no-block lte") - started_ts = None if off_ts is None: off_ts = sec_since_boot()