Home | History | Annotate | Download | only in targetdev
      1 import xml.etree.ElementTree as ET
      2 import tempfile
      3 
      4 DEVICE_PATH = '/vendor/etc/powerhint.xml'
      5 
      6 
      7 def restart_power_hal(target):
      8   """Kill power HAL service so it can pick up new values in powerhint.xml."""
      9   target.execute('pkill -f android\.hardware\.power')
     10 
     11 
     12 def set_touch_param(target, opcode, new_val):
     13   """Set a new value for the touch hint parameter with the specified opcode."""
     14   hinttype = '0x1A00'
     15 
     16   # Get current powerhint.xml file
     17   with tempfile.NamedTemporaryFile() as tmp:
     18     target.pull(DEVICE_PATH, tmp.name)
     19 
     20     # Replace current parameter value
     21     tree = ET.parse(tmp.name)
     22     xpath = './Hint[@type="{}"]/Resource[@opcode="{}"]'.format(hinttype, opcode)
     23     tree.findall(xpath)[0].set('value', '{:#x}'.format(new_val))
     24 
     25     # Write new powerhint.xml file to device
     26     tree.write(tmp.name)
     27     target.push(tmp.name, DEVICE_PATH)
     28 
     29   # Restart power HAL to pick up new value
     30   restart_power_hal(target)
     31 
     32 
     33 def set_touch_boost(target, boost=50):
     34   """Change the top-app schedtune.boost value to use after touch events."""
     35   opcode = '0x42C18000'
     36   if boost < 0:
     37     boost = 100-boost
     38   set_touch_param(target, opcode, boost)
     39 
     40 
     41 def set_touch_min_freq(target, cluster, freq=1100):
     42   """Change the CPU cluster min frequency (in Mhz) to use after touch events."""
     43   opcode = '0x40800000' if cluster == 'big' else '0x40800100'
     44   set_touch_param(target, opcode, freq)
     45 
     46 
     47 def set_touch_cpubw_hysteresis(target, enable=False):
     48   """Set whether to leave CPUBW hysteresis enabled after touch events."""
     49   opcode = '0x4180C000'
     50   enable_num = 1 if enable else 0
     51   set_touch_param(target, opcode, enable_num)
     52 
     53 
     54 def set_touch_cpubw_min_freq(target, freq=51):
     55   """Set CPUBW min freq used after touch events. See mapping in msm8998.dtsi."""
     56   opcode = '0x41800000'
     57   set_touch_param(target, opcode, freq)
     58 
     59 
     60 def restore_defaults(target, powerhint_host_path):
     61   """Restore default power hint settings using a powerhint.xml file from the host."""
     62   target.push(powerhint_host_path, DEVICE_PATH)
     63 
     64   restart_power_hal(target)
     65 
     66 
     67 def disable_launch_hint(target):
     68   """Turn off all launch hint tweaks."""
     69   hinttype = '0x1B00'
     70 
     71   with tempfile.NamedTemporaryFile() as tmp:
     72     target.pull(DEVICE_PATH, tmp.name)
     73 
     74     tree = ET.parse(tmp.name)
     75     xpath = './Hint[@type="{}"]'.format(hinttype)
     76     launch_hints = tree.findall(xpath)[0]
     77     for child in launch_hints.findall('./Resource'):
     78       launch_hints.remove(child)
     79 
     80     tree.write(tmp.name)
     81     target.push(tmp.name, DEVICE_PATH)
     82 
     83   restart_power_hal(target)
     84