#!/usr/bin/python3 import glob import os import sys,getopt import subprocess import time gear_m = [] gear_m.append(" +-----------------------------------+-----------------+-----------+") #0 gear_m.append(" | Cortex-A53 | Cortex-A72 | Mali-T860 |") #1 gear_m.append(" +--------+--------+--------+--------+--------+--------+-----------+") #2 gear_m.append(" | CPU 0 | CPU 1 | CPU 2 | CPU 3 | CPU 4 | CPU 5 | GPU |") #3 gear_m.append("+---+--------+--------+--------+--------+--------+--------+-----------+") #4 gear_m.append("| 1 | 600 MHz| OFF | |") #5 gear_m.append("+---+--------+--------+-----------------------------------+ 200 MHz +") #6 gear_m.append("| 2 | 800 MHz | OFF | |") #7 gear_m.append("+---+-----------------+-----------------+-----------------+-----------+") #8 gear_m.append("| 3 | 1008 MHz | OFF | |") #9 gear_m.append("+---+-----------------------------------+-----------------+ +") #10 gear_m.append("| 4 | OFF | 1008 MHz | 400 MHz |") #11 gear_m.append("+---+-----------------------------------+-----------------+ +") #12 gear_m.append("| 5 | OFF | 1200 MHz | |") #13 gear_m.append("+---+-----------------------------------+-----------------+-----------+") #14 gear_idx = [] gear_idx.append("|*1*| 600 MHz| OFF | | <===") #0 => 5 gear_idx.append("|*2*| 800 MHz | OFF | | <===") #1 => 7 gear_idx.append("|*3*| 1008 MHz | OFF | | <===") #9 gear_idx.append("|*4*| OFF | 1008 MHz | 400 MHz | <===") #11 gear_idx.append("|*5*| OFF | 1200 MHz | | <===") #13 cur_stat = [] cur_stat.append("+-----------------------------------+-----------------+-----------+") cur_stat.append("| Cortex-A53 | Cortex-A72 | Mali-T860 |") cur_stat.append("+--------+--------+--------+--------+--------+--------+-----------+") cur_stat.append("| CPU 0 | CPU 1 | CPU 2 | CPU 3 | CPU 4 | CPU 5 | GPU |") cur_stat.append("+--------+--------+--------+--------+--------+--------+-----------+") cur_stat.append("| 600MHz | OFF | OFF | OFF | OFF | OFF | 400MHz |") #5 cur_stat.append("+--------+--------+--------+--------+--------+--------+-----------+") def isDigit(x): try: float(x) return True except ValueError: return False class A06: cpus = [] cpu_scaling_governor= "schedutil" gpu_governor="simple_ondemand" gpu_max_freq=200000000 gear = 1 # 1-5 null_out = "2>/dev/null" def __init__(self): self.cpus = [] self.init_cpu_infos() self.cpu_total_count = len(self.cpus) def init_cpu_infos(self): self.cpus = glob.glob('/sys/devices/system/cpu/cpu[0-9]') self.cpus.sort() def get_cpu_gov(self): if self.gear < 4: cpu_gov_path = "/sys/devices/system/cpu/cpufreq/policy0/scaling_governor" else: cpu_gov_path = "/sys/devices/system/cpu/cpufreq/policy4/scaling_governor" gov = "" with open(cpu_gov_path,"r") as f: gov = f.read().strip() return gov def set_cpu_gov0( self,gov): cpu_gov_path = "/sys/devices/system/cpu/cpufreq/policy0/scaling_governor" try: subprocess.run( "echo %s | sudo tee %s " %(gov,cpu_gov_path),shell=True,stdout=subprocess.DEVNULL) except: print("set cpu governor failed") def set_cpu_gov4( self,gov): cpu_gov_path = "/sys/devices/system/cpu/cpufreq/policy4/scaling_governor" try: subprocess.run( "echo %s | sudo tee %s" %(gov,cpu_gov_path),shell=True,stdout=subprocess.DEVNULL) except: print("set cpu governor failed") def get_cpu_on_off(self,cpu_num): cpu_onoff_file = "/sys/devices/system/cpu/cpu%d/online" % cpu_num onoff = "0" max_freq = "0" with open(cpu_onoff_file,"r") as f: onoff = f.read().strip() if onoff == "1": cpu_max_freq_file = "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq" % cpu_num with open(cpu_max_freq_file,"r") as f: max_freq = f.read().strip() mhz = int(max_freq)/1000 return "%dMhz" % mhz return "OFF" def set_cpu_on_off(self,cpu_num,onoff): cpu_onoff_file = "/sys/devices/system/cpu/cpu%d/online" % cpu_num try: #print("echo %d | sudo tee %s" %(onoff,cpu_onoff_file) ) subprocess.run( "echo %d | sudo tee %s" %(onoff,cpu_onoff_file),shell=True,stdout=subprocess.DEVNULL) except: print("set cpu %d on off failed" % cpu_num) def set_cpu_max_freq(self,cpu_num,max_freq): cpu_max_freq_file = "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq" % cpu_num try: subprocess.run( "echo %d | sudo tee %s" %(max_freq,cpu_max_freq_file),shell=True,stdout=subprocess.DEVNULL) except: print("set cpu %d max freq failed" % cpu_num) def get_gpu_freq(self): gpu_sys_path = "/sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu" gpu_freq_path = os.path.join(gpu_sys_path,"max_freq") freq = "" with open(gpu_freq_path,"r") as f: freq = f.read().strip() mhz = int(freq)/1000000 return "%dMhz" % mhz def set_gpu(self,gov,hz): gpu_sys_path = "/sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu" gpu_gov_path = os.path.join(gpu_sys_path,"governor") gpu_freq_path = os.path.join(gpu_sys_path,"max_freq") try: subprocess.run("echo %s | sudo tee %s" %(gov,gpu_gov_path),shell=True,stdout=subprocess.DEVNULL) subprocess.run("echo %d | sudo tee %s" %(hz, gpu_freq_path),shell=True,stdout=subprocess.DEVNULL) except: print("set gpu failed") def print_cpu_gpu_gov(self): print("CPU Governor: %s GPU Governor: %s" % (self.get_cpu_gov(),self.gpu_governor)) def print_cur_status(self): global cur_stat stat_str = "|%s|%s|%s|%s|%s|%s|%s|" cpu0 = self.get_cpu_on_off(0).center(8)[:8] cpu1 = self.get_cpu_on_off(1).center(8)[:8] cpu2 = self.get_cpu_on_off(2).center(8)[:8] cpu3 = self.get_cpu_on_off(3).center(8)[:8] cpu4 = self.get_cpu_on_off(4).center(8)[:8] cpu5 = self.get_cpu_on_off(5).center(8)[:8] gpu = self.get_gpu_freq().center(11)[:11] table_str = stat_str %(cpu0,cpu1,cpu2,cpu3,cpu4,cpu5,gpu) print("\nCurrent Status:") for idx,val in enumerate(cur_stat): if idx == 5: print(table_str) else: print(val) self.print_cpu_gpu_gov() def set_gear(self,g): self.gear = g if self.gear == 1: self.set_cpu_on_off(0,1) self.set_cpu_on_off(1,0) self.set_cpu_on_off(2,0) self.set_cpu_on_off(3,0) self.set_cpu_on_off(4,0) self.set_cpu_on_off(5,0) self.set_cpu_max_freq(0,600000) self.set_gpu(self.gpu_governor,self.gpu_max_freq) self.set_cpu_gov0(self.cpu_scaling_governor) if self.gear == 2: self.set_cpu_on_off(0,1) self.set_cpu_on_off(1,1) self.set_cpu_on_off(2,0) self.set_cpu_on_off(3,0) self.set_cpu_on_off(4,0) self.set_cpu_on_off(5,0) self.set_cpu_max_freq(0,800000) self.set_cpu_max_freq(1,800000) self.set_gpu(self.gpu_governor,self.gpu_max_freq) self.set_cpu_gov0(self.cpu_scaling_governor) if self.gear == 3: self.set_cpu_on_off(0,1) self.set_cpu_on_off(1,1) self.set_cpu_on_off(2,1) self.set_cpu_on_off(3,1) self.set_cpu_on_off(4,0) self.set_cpu_on_off(5,0) self.set_cpu_max_freq(0,1008000) self.set_cpu_max_freq(1,1008000) self.set_cpu_max_freq(2,1008000) self.set_cpu_max_freq(3,1008000) self.set_gpu(self.gpu_governor,self.gpu_max_freq*2) self.set_cpu_gov0(self.cpu_scaling_governor) if self.gear == 4: self.set_cpu_on_off(4,1) self.set_cpu_on_off(5,1) self.set_cpu_on_off(0,0) self.set_cpu_on_off(1,0) self.set_cpu_on_off(2,0) self.set_cpu_on_off(3,0) self.set_cpu_max_freq(4,600000) self.set_cpu_max_freq(5,600000) self.set_gpu(self.gpu_governor,self.gpu_max_freq*2) self.set_cpu_gov4(self.cpu_scaling_governor) if self.gear == 5: self.set_cpu_on_off(4,1) self.set_cpu_on_off(5,1) self.set_cpu_on_off(0,0) self.set_cpu_on_off(1,0) self.set_cpu_on_off(2,0) self.set_cpu_on_off(3,0) self.set_cpu_max_freq(4,1200000) self.set_cpu_max_freq(5,1200000) self.set_gpu(self.gpu_governor,self.gpu_max_freq*2) self.set_cpu_gov4(self.cpu_scaling_governor) def print_gear_map(gear): global gear_m rp = -1 if gear > 0: rp = 5 + (gear -1)*2 for idx, val in enumerate(gear_m): if idx == rp: print(gear_idx[gear-1]) else: print(val) def print_help_msg(): print("Useage: devterm-a06-gearbox [OPTION]...") print("Show or set the CPU operating frequency,online status and GPU operating frequency for DevTerm A06.") print() print(" -s, --set [n] set a speed mode between the number 1-5:") print(" 1 for simple writing tasks with long battery life.") print(" 2 for browsing most websites with long battery life.") print(" 3 for most 2D games and emulators.") print(" 4 for playing videos and 3D games.") print(" 5 for performance-first tasks.") print() print("Examples:") print("Set to mode 1, single LITTLE core @600MHz(max), GPU@200MHz.") print(" $ devterm-a06-gearbox -s 1") def is_root(): return os.geteuid() == 0 def main(argv): gear = 1 try: opts, args = getopt.getopt(argv,"hs:",["set="]) except getopt.GetoptError: print_help_msg() sys.exit(2) for opt, arg in opts: if opt == '-h': print_help_msg() sys.exit() elif opt in ("-s","--set"): if(isDigit(arg)): gear = int(arg) if gear > 5 or gear < 1: print("illegal input: mode range 1-5") sys.exit(-1) DT = A06() if len(argv) == 0: DT.print_cur_status() sys.exit(0) DT = A06() if is_root(): DT.set_gear(gear) print_gear_map(gear) DT.print_cpu_gpu_gov() else: print("Require super user privilege to set mode,try run it with sudo") sys.exit(1) if __name__ == "__main__": main(sys.argv[1:])