/*
* Copyright (C) 2011-2012 sakuramilk <c.sakuramilk@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.sakuramilk.TweakGS2.CpuControl;
import java.io.File;
import android.content.Context;
import net.sakuramilk.util.Misc;
import net.sakuramilk.util.RootProcess;
import net.sakuramilk.util.SettingManager;
import net.sakuramilk.util.SysFs;
public class CpuControlSetting extends SettingManager {
public static final String KEY_CPU_GOV_LIST = "cpu_governor_list";
public static final String KEY_CPU_GOV_SETTING = "cpu_governor_setting";
public static final String KEY_CPU_GOV_SET_ON_BOOT = "cpu_governor_set_on_boot";
public static final String KEY_CPU_MAX_FREQ = "cpu_max_freq";
public static final String KEY_CPU_MIN_FREQ = "cpu_min_freq";
public static final String KEY_CPU_MAX_SUSPEND_FREQ = "cpu_max_suspend_freq";
public static final String KEY_CPU_MIN_SUSPEND_FREQ = "cpu_min_suspend_freq";
public static final String KEY_CPU_FREQ_SET_ON_BOOT = "cpu_freq_set_on_boot";
public static final String KEY_CPU_VOLT_SET_ON_BOOT = "cpu_volt_set_on_boot";
private static final String CRTL_PATH = "/sys/devices/system/cpu/cpu0/cpufreq";
private static final String PATH_SCALING_AVAILABLE_FREQS_KERNEL_3_0 = "/sys/power/cpufreq_table";
private static final String PATH_SCALING_AVAILABLE_FREQS_KERNEL_2_6 = CRTL_PATH + "/scaling_available_frequencies";
private final SysFs mSysFsAvailableGovernors = new SysFs(CRTL_PATH + "/scaling_available_governors");
private final SysFs mSysFsScalingGovernor = new SysFs(CRTL_PATH + "/scaling_governor");
private final SysFs mSysFsCpuAvailableFrequencies;
private final SysFs mSysFsScalingMaxFreq = new SysFs(CRTL_PATH + "/scaling_max_freq");
private final SysFs mSysFsScalingMinFreq = new SysFs(CRTL_PATH + "/scaling_min_freq");
private final SysFs mSysFsScalingMaxSuspendFreq = new SysFs(CRTL_PATH + "/scaling_max_suspend_freq");
private final SysFs mSysFsScalingMinSuspendFreq = new SysFs(CRTL_PATH + "/scaling_min_suspend_freq");
public CpuControlSetting(Context context, RootProcess rootProcess) {
super(context, rootProcess);
if (Misc.getKernelVersion() >= Misc.KERNEL_VER_3_0_0) {
File file = new File(PATH_SCALING_AVAILABLE_FREQS_KERNEL_2_6);
if (file.exists()) {
mSysFsCpuAvailableFrequencies = new SysFs(PATH_SCALING_AVAILABLE_FREQS_KERNEL_2_6);
} else {
mSysFsCpuAvailableFrequencies = new SysFs(PATH_SCALING_AVAILABLE_FREQS_KERNEL_3_0);
}
} else {
mSysFsCpuAvailableFrequencies = new SysFs(PATH_SCALING_AVAILABLE_FREQS_KERNEL_2_6);
}
}
public CpuControlSetting(Context context) {
this(context, null);
}
public String[] getAvailableGovernors() {
String values = mSysFsAvailableGovernors.read(mRootProcess);
if (values != null) {
return values.split(" ");
}
return null;
}
public String getScalingGovernor() {
return mSysFsScalingGovernor.read(mRootProcess);
}
public void setScalingGovernor(String value) {
mSysFsScalingGovernor.write(value, mRootProcess);
}
public String loadScalingGovernor() {
return getStringValue(KEY_CPU_GOV_LIST);
}
public void saveScalingGovernor(String value) {
setValue(KEY_CPU_GOV_LIST, value);
}
public boolean loadGovernorSetOnBoot() {
return getBooleanValue(KEY_CPU_GOV_SET_ON_BOOT, false);
}
public String[] getAvailableFrequencies() {
String values;
values = mSysFsCpuAvailableFrequencies.read(mRootProcess);
if (values != null) {
return values.split(" ");
}
// FIXME: default kernel is not found target sysfs.
return new String[] { "1200000", "1000000", "800000", "500000", "200000" };
}
public String getScalingMaxFreq() {
return mSysFsScalingMaxFreq.read(mRootProcess);
}
public void setScalingMaxFreq(String value) {
mSysFsScalingMaxFreq.write(value, mRootProcess);
}
public String loadScalingMaxFreq() {
return getStringValue(KEY_CPU_MAX_FREQ);
}
public void saveScalingMaxFreq(String value) {
setValue(KEY_CPU_MAX_FREQ, value);
}
public String getScalingMinFreq() {
return mSysFsScalingMinFreq.read(mRootProcess);
}
public void setScalingMinFreq(String value) {
mSysFsScalingMinFreq.write(value, mRootProcess);
}
public String loadScalingMinFreq() {
return getStringValue(KEY_CPU_MIN_FREQ);
}
public void saveScalingMinFreq(String value) {
setValue(KEY_CPU_MIN_FREQ, value);
}
public boolean isEnableSuspendFreq() {
return mSysFsScalingMaxSuspendFreq.exists();
}
public String getScalingMaxSuspendFreq() {
return mSysFsScalingMaxSuspendFreq.read(mRootProcess);
}
public void setScalingMaxSuspendFreq(String value) {
mSysFsScalingMaxSuspendFreq.write(value, mRootProcess);
}
public String loadScalingMaxSuspendFreq() {
return getStringValue(KEY_CPU_MAX_SUSPEND_FREQ);
}
public void saveScalingMaxSuspendFreq(String value) {
setValue(KEY_CPU_MAX_SUSPEND_FREQ, value);
}
public String getScalingMinSuspendFreq() {
return mSysFsScalingMinSuspendFreq.read(mRootProcess);
}
public void setScalingMinSuspendFreq(String value) {
mSysFsScalingMinSuspendFreq.write(value, mRootProcess);
}
public String loadScalingMinSuspendFreq() {
return getStringValue(KEY_CPU_MIN_SUSPEND_FREQ);
}
public void saveScalingMinSuspendFreq(String value) {
setValue(KEY_CPU_MIN_SUSPEND_FREQ, value);
}
public boolean loadFreqSetOnBoot() {
return getBooleanValue(KEY_CPU_FREQ_SET_ON_BOOT, false);
}
public boolean loadVoltSetOnBoot() {
return getBooleanValue(KEY_CPU_VOLT_SET_ON_BOOT, false);
}
@Override
public void setOnBoot() {
String value;
if (loadGovernorSetOnBoot()) {
value = loadScalingGovernor();
if (!Misc.isNullOfEmpty(value)) {
setScalingGovernor(value);
CpuGovernorSetting cpuGovSetting = new CpuGovernorSetting(mContext, value);
cpuGovSetting.setOnBoot();
}
}
if (loadFreqSetOnBoot()) {
value = loadScalingMaxFreq();
if (!Misc.isNullOfEmpty(value)) {
setScalingMaxFreq(value);
}
value = loadScalingMinFreq();
if (!Misc.isNullOfEmpty(value)) {
setScalingMinFreq(value);
}
if (isEnableSuspendFreq()) {
value = loadScalingMaxSuspendFreq();
if (!Misc.isNullOfEmpty(value)) {
setScalingMaxSuspendFreq(value);
}
value = loadScalingMinSuspendFreq();
if (!Misc.isNullOfEmpty(value)) {
setScalingMinSuspendFreq(value);
}
}
}
if (loadVoltSetOnBoot()) {
CpuVoltageSetting cpuVoltSetting = new CpuVoltageSetting(mContext);
cpuVoltSetting.setOnBoot();
}
}
@Override
public void setRecommend() {
// noop
}
@Override
public void reset() {
clearValue(KEY_CPU_GOV_SETTING);
clearValue(KEY_CPU_GOV_SET_ON_BOOT);
clearValue(KEY_CPU_MAX_FREQ);
clearValue(KEY_CPU_MIN_FREQ);
clearValue(KEY_CPU_MAX_SUSPEND_FREQ);
clearValue(KEY_CPU_MIN_SUSPEND_FREQ);
clearValue(KEY_CPU_FREQ_SET_ON_BOOT);
clearValue(KEY_CPU_VOLT_SET_ON_BOOT);
CpuVoltageSetting cpuVoltSetting = new CpuVoltageSetting(mContext);
cpuVoltSetting.reset();
}
}